생성자는 객체가 생성될 때 호출되는 '객체 초기화 메서드'이다.
생성자의 조건
생성자의 목적
public class Main {
public static void main(String[] args) {
Data d1 = new Data();
System.out.println(d1.i); // 5
System.out.println(d1.str); // 자바
System.out.println(d1.isChanged); // false
Data d2 = new Data(9, "파이썬");
System.out.println(d2.i); // 9
System.out.println(d2.str); // 파이썬
}
}
class Data{
int i;
String str;
boolean isChanged;
Data(){
i = 5;
str = "자바";
isChanged = false;
}
//오버로딩
Data(int x, String y){
i = x;
str = y;
}
}
위의 코드를 보자. Data 클래스에는 각각 i, str, isChanged 라는 인스턴스 변수와 오버로딩된 Data 생성자가 있다.
main 메서드에서 Data 타입의 객체 d1을 생성했다. 생성할 때
new Data();로 매개변수를 넘겨주지 않았으므로 매개변수가 없는 첫 번째 Data 생성자가 호출될 것이다. 첫 번째 Data 생성자가 호출 되면 i에 5를, str에 "자바"를, isChanged에 false를 할당해 초기화할 것이다. 따라서 각각의 변수들을 출력해보면 초기화한 값대로 잘 나오는 것이다.다음에 Data 타입의 객체 d2를 생성한다. 생성할 때
new Data(9, "파이썬");로 매개변수를 넘겨주었으므로 매개변수가 있는 두 번째 Data 생성자가 호출될 것이다. 두 번째 Data 생성자가 호출되면 i에 매개변수로 넘겨준 값 9를, str에도 매개변수로 넘겨준 값인 "파이썬"을 할당할 것이다. 따라서 i와 str을 출력해보면 할당된 값이 잘 나오는 것이다.
오버로딩된 생성자간에도 서로 호출이 가능한데, 이 때 this() 를 사용한다. 사용할 때 반드시 생성자의 첫 줄에서 사용되어야 한다.
public class Main {
public static void main(String[] args) {
Data d1 = new Data();
System.out.println(d1.age); // 5
System.out.println(d1.name); // "자바"
Data d2 = new Data(10);
System.out.println(d2.age); // 10
System.out.println(d2.name); // "파이썬"
Data d3 = new Data(15, "C++");
System.out.println(d3.age); // 15
System.out.println(d3.name); // "C++"
}
}
class Data{
int age;
String name;
Data() {
this(5, "자바");
}
Data(int age){
this(age, "파이썬");
}
Data(int age, String name) {
this.age = age;
this.name = name;
}
}
위의 코드에서 Data 클래스를 보면 오버로딩된 생성자가 세개가 있다. 먼저 매개변수가 없는 첫 번째 생성자를 살펴보면
this(5, "자바");로 매개변수를 두개 가지고 있는 세 번째 생성자를 호출하고 있다. 따라서 main메서드에서 d1 객체 생성 후 age와 name을 출력해보면 5와 "자바"가 출력이 되는 것이다.매개변수를 하나만 가지고 있는 생성자를 보면 이 역시
this(age, "파이썬");으로 매개변수를 두개 가지고 있는 생성자를 호출하고 있다. 따라서 main 메서드에서 매개변수로 10을 넘기는 d2 객체를 생성하면 10과 "파이썬"이 잘 출력이 되는 것이다.세 번째 생성자에서도 this가 사용되고 있지만 이는 앞서 언급된 this와는 전혀 다른 개념이다. 여기서
this.age는 객체 자신의 인스턴스 변수 age를 뜻한다.this.name역시 객체 자신의 인스턴스 변수 name을 말한다. 따라서 this()와 this를 잘 구별해서 써야한다.
this()와 this의 구별