재밌고 어려운 IT를 이해해보자~!
생성자 본문
생성자는 .......메서드랑 헷갈린다!
생성자는 리턴타입 지정 X 기본상황에서 호출하지 않고 객체를 선언할때만 호출 가능하다.
리턴여부자체가 필요가 없다.
생성자 선언 생성자의 이름은 클래스의 이름과 동일 하게 사용 -> 자바 문법
public Person() {
System.out.println("클래스 생성!");
}
생성자는 원래 시스템이 알아서 만들지만!
생성자를 직접 만들면 시스템이 만드는걸 사용하지 않고 개발자가 만든걸 사용
오버로딩이란?!
기본적으로 같은 클래스 내에서 메서드or생성자 이름 중복사용 불가하지만
메서드가 지닌 파라미터(매개변수)의개수를 다르게 하거나 개수가 같아도
데이터 타입을 다르게하면 다른 메서드로 인식하게 하는 기술!
오버로딩쓸때 주의점.
package exam06;
public class StudentMain {
public static void main(String[] args) {
Student st1 = new Student(); //-> 이경우 개발자가 생성자를 어떤거든 만들면 시스템이 자동으로 만들어주지 않는다.
// 즉 아무것도 개발자가 직접 만들지 않아야 시스템이 생성을 해서 선언이 가능해진다.
Student st2 = new Student(17, "태명", "송도고등학교"); //생성자를 통해 데이터 주입 가능
st1.setAge(18);
st1.setMyName("개구리");
st1.setSchool("죽전고");
System.out.println("이름: " + st1.getMyName() + "나이" + st1.getAge()+ "학교" + st1.getSchool());
System.out.println("이름: " + st2.getMyName() + "나이" + st2.getAge()+ "학교" + st2.getSchool());
}
}
Student st1 = new Student(); 는 자주하던 객체/인스턴스화이다.
원래 그냥 선언하면 됐지만, 오버로드를 사용할때는
Student Class쪽에 기본생성자를 선언해줘야한다.
주석처럼...
Student st1 = new Student(); 객체화는
Student Class쪽에 개발자가 아무런 생성자를 만들지 않아야 그냥 객체화 할 수 있으며
하나라도 생성했을 경우는 기본생성자를 직접 선언해줘야한다!!
이해가어려우니 설명도어렵다!
public class Student {
private int age;
private String myName;
private String school;
//기본생성자
public Student() {
}
//생성자를 통해서 데이터를 받고싶을때
public Student(int age, String myName) {
this.myName = myName;
this.age = age;
}
//오버로드
public Student(int age, String myName, String school) {
this(age,myName); //같은 이름을 가진 오버로딩 생성자가 있으면
// this를 통해 오버로딩된 생성자를호출해서 매개변수를 선언해줄 수 있다.
this.school = school;
}
패키지란 ?
패키지는 폴더같은 개념!
같은폴더에 넣어놓는 느낌
패키지는 목적별로 정리리를 도와주는것이다.
패키지가 달라지면 동명의 클래스가 생길 수 있다!
ex 유틸, 언어, math, ui등등 목적에따라 패키지를 나눠 클래스 관리!
학생 3명의 이름, 국,영,수 점수 를 입력받아 총점, 평균을 구하고
총점이 높은대로 정렬하는 프로젝트를 만들어보자.
어떻게 진해할지 흐름을 생각해본다.
1. 학생의 이름, 국,영,수 점수를 맴버변수로 가질 클래스 생성!
2. 생성자를 사용해 학생 이름, 국,영,수 점수를 매게변수(파라미터)로 받아준다!
그...이유는 나중에 클래스를 객체화할때 일반생성자로 객체화 하면 Student 배열 {이름,국,영,수} 를 만들 수 없다....
파라미터를 쓰지 않은 일반 생성자로 한 후에 Student배열을 동일하게 만들 수 있는지 몇번 시도해봤지만 모르겠다.
3. 맴버변수는 보호를 위해 private 선언되어 있으니 getter, setter를 이용해 접근하고 해당 클래스에 총점과 평균 메서드도 만들어준다.
4. 기능을 담당하는 클래스를 만들자. 학생 한명의 정보를 담을 수 있는 Student 배열은 선언하고 유저에게 이름,국,영,수 를입력받아 배열에 넣어주는 메서드 생성. 총 3명의 정보를 담을 수 있게 반복문 사용.
5. 총점순서로 나열하는 메서드 생성
6. 총점이 높은 순서로 출력해주는 메서드 생성
7.메인클래스에서 기능부분의 입력 메서드, 출력 메서드 실행.
package exam07_project;
import java.math.BigDecimal;
import java.math.RoundingMode; //java.util << 패키지 Scanner << 클래스
//기본적으로 제공되지 않기 때문에 import 해줘야함.
//패키지란!!!!!!!!!!!
//패키지가 달라지면 동명의 클래스가 생길 수 있다.
//패키지는 폴더같은 개념!
//같은폴더에 넣어놓는 느낌
//패키지는 목적별로 정리리를 도와주는것!
//ex 유틸, 언어, math, ui등등 목적에따라 패키지를 나눠 클래스 관리!
public class Student {
private String myName;
private int kor;
private int eng;
private int math;
//파라미터가 있는 생성자 생성.
public Student(String myName, int kor, int eng, int math) {
this.myName = myName;
this.kor = kor;
this.eng = eng;
this.math = math;
}
public String getMyName() {
return myName;
}
public void setMyName(String myName) {
this.myName = myName;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
//총점 구하는 메서드
public int getTotal() {
return (this.kor + this.eng + this.math);
}
//평균 구하는 메서드;
//BigDeciaml 클래스 -> 숫자, 소수점처리관련 메서드
//ex 3.41 -> 3.4100000으로 나오는걸 잡아준다.
public double getAvg() {
double avg = (double)this.getTotal() /3;
BigDecimal dec = new BigDecimal(avg); //BigDecimal 은 모든 숫자 타입으로 데이터 리턴 가능
return dec.setScale(2, RoundingMode.HALF_UP).doubleValue(); //setScale(자리수, 옵션)
//옵셥은 반올림, 내림,올림
//옵션은 스테틱 변수로 되어있음 객체화 하지않고 불러옰 수있다.
//setScale 은 리턴타입이 객체
}
}
package exam07_project;
import java.util.Scanner;
public class StdService {
private Student[] stdArray; //학생을 담을 수 잇는 배열 선언
// 생성자를 통한 초기화
public StdService() {
this.stdArray = new Student[3];
}
//학생을 생성하는 메서드
public void createStudent() {
Scanner scan = new Scanner(System.in); // 파리미터를 받는 스캐너 객체 생성
System.out.println("학생을 생성합니다.");
for(int i = 0 ; i < stdArray.length ; i++) {
System.out.println((i+1) + " 번째 학생 이름 :");
String myName = scan.next();
System.out.println((i+1) + " 번째 학생 국어점수 :");
int kor = scan.nextInt();
System.out.println((i+1) + " 번째 학생 영어점수 :");
int eng = scan.nextInt();
System.out.println((i+1) + " 번째 학생 수학점수 :");
int math = scan.nextInt();
//학생 객체르 생성
Student st = new Student(myName, kor, eng, math);
//배열에 저장
stdArray[i] = st;
}
System.out.println("학생 생성 완료~");
scan.close();
}
//학생정보를 출력합니다. ==> 성적이 좋은순서로~
public void printStudent() {
Student temp = null; // 0과 null 은 다르다 null 은 공간이 비어있음.
//버블정렬
for (int i=stdArray.length; i>0; i--) {
for(int j =0; j <(i-1);j ++) { //마지막 까지가면 비교할게 없다
//내림차순 정렬 ~
//Student st = stdArray[i];
//st.getTotal() 과 같다.
if(stdArray[j].getTotal() < stdArray[j+1].getTotal()) {
temp = stdArray[j+1];
stdArray[j+1] = stdArray[j];
stdArray[j] = temp;
}
}
}
//출력
for (int i=0; i < stdArray.length; i++) {
Student st = stdArray[i];
System.out.print("이름 : " + st.getMyName()+ ", ");
System.out.print("국어 : " + st.getKor()+ ", ");
System.out.print("영어 : " + st.getEng()+ ", ");
System.out.print("수학 : " + st.getMath()+ ", ");
System.out.print("총점 : " + st.getTotal()+ ", ");
System.out.print("평균 : " + st.getAvg()+ "\n");
}
}
}
package exam07_project;
public class StdMain {
public static void main(String[] args) {
StdService service = new StdService();
//학생생성;
service.createStudent();
//출력
service.printStudent();
}
}
느낀점은 ....이 myName이 어떤 myName인지... 같은 혼동이온디.