생성자
return Type이 없습니다.
클래스 이름과 같아야 합니다.(대소문자 구별)
new를 이용하여 객체를 메모리에 할당한 후 할당된 메모리를 특정 값으로 초기화하는 역활을 합니다.
기본 생성자가 생략되어 있는 경우
SchoolMain2.java
class School2{
int kuk = 0;
int eng = 0;
int tot = 0;
public int hap(){
tot = kuk+eng;
return tot;
}
}
SchoolMain2.java
public class SchoolMain2 {
public static void main(String[] args) {
School2 sc2 = new School2();
sc2.kuk=90;
sc2.eng=100;
System.out.println("hap: " + sc2.hap());
}
}
기본생성자를 선언한 경우
생성자에 초기화하는 변수가 없어도 반드시 생성자를 선언할 것을 권장합니다.
상속 관계에 들어가면 이 기본 생성자가 선언되지 않으면 상황에 따라 에러를 발생합니다.
School3.java
class School3{
int kuk = 0;
int eng = 0;
int tot = 0;
public School3(){
}
public int hap(){
tot = kuk+eng;
return tot;
}
}
SchoolMain3.java
public class SchoolMain3 {
public static void main(String[] args) {
School3 sc3 = new School3();
sc3.kuk=90;
sc3.eng=100;
System.out.println("hap: " + sc3.hap());
}
}
기본생성자를 선언해야 하는 경우
인수를 받는 생성자가 존재하게되면 반드시 기본 생성자를 선언해야 합니다.
기본 생성자는 하는 일이 없어도 반드시 선언을 적극 권장합니다.
School4.java
class School4{
int kuk = 0;
int eng = 0;
int tot = 0;
//기본 생성자
public School4(){ }
//아래처럼 인수를 받는 생성자가 존재하면
//반드시 기본 생성자를 명시적으로 선언해야 합니다.
public School4(int kuk, int eng){
this.kuk = kuk;
this.eng = eng;
}
public int hap(){
tot = kuk+eng;
return tot;
}
}
SchoolMain4.java
public class SchoolMain4 {
public static void main(String[] args) {
School4 sc4 = new School4();
sc4.kuk=90;
sc4.eng=100;
System.out.println("hap: " + sc4.hap());
School4 sc = new School4(90, 100);
System.out.println("hap: " + sc.hap());
}
}
생성자에 대한 개념 부가 설명(중요)
자바에서의 생성자
기본생성자를 이용하여 학생을 만들고보니 학생클래스 내부의 성적과 학생정보에 대한 클래스가 존재합니다. 그런데 이 클래스를 활용할 수 없습니다. Student student=new Student( );
생성자 중 객체를 전달하는 생성자가 있습니다. 그런데 문제는 이 객체를 생성하고 객체전달을 해야 사용이 가능 합니다. Student student=new Student(sungjuk, studentinfo);
성적과 학생정보 객체를 생성 그리고 학생 객체 생성자함수에 전달을 해주었지만 문제가 발생헀습니다. 문제는 다음과 같습니다. Sungjuk sungjuk=new Sungjuk( ); StudentInfo studentinfo=new StudentInfo( ); Student student=new Student(sungjuk, studentinfo);
성적 정보 부재
학생 정보 부재
성적정보를 입력하는 생성자 함수를 찾았고 Sungjuk sungjuk=new Sungjuk(subject);
학생정보를 입력하는 생성자 함수를 찾았습니다. StudentInfo studentinfo=new StudentInfo(1,"김하나","010-1111-1111"); 그러나 성적정보는 subject 라는 클래스로 이루어져 있습니다.
subject 라는 객체를 생성하고 점수를 전달합니다. Subject subject=new Subject(80,80,80); Sungjuk sungjuk=new Sungjuk(subject);
해결된 예시는 다음과 같습니다.
Subject subject=new Subject(80,80,80);
Sungjuk sungjuk=new Sungjuk(subject);
StudentInfo studentinfo=new StudentInfo(1,"김하나","010-1111-1111");
student[0]=new Student(sungjuk, studentinfo);
System.out.println(student[0].sungjuk.total);
System.out.println(student[0].sungjuk.avg);
즉 위 사례를 통한 트러블슈팅은 다음과 같습니다.
각 클래스의 값 조회는 가능하나 활용이 불가능했다.
각 클래스를 따로 생성하여 한 로직에서 모든 정보를 대입하고,
대입한 클래스를 하나의 학생객체에 담아 주었습니다. 즉 객체가 객체를 담은 것입니다.
정리하면 생성자를통해 새로운클래스를 생성하였지만 대입한 인자값 또한 생성자로 생성된 객체로 주입을 한 것입니다.
Last updated