생성자도 메서드 오버로딩처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
// 추가
MemberConstruct(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name: " + name + ", age: " + age + ", grade: " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
기존 MemberConstruct
에 생성자를 하나 추가해서 생성자가 2개가 되었다.
MemberConstruct(String name, int age)
MemberConstruct(String name, int age, int grade)
새로 추가한 생성자는 grade
를 받지 않는다. 대신에 grade
는 50
점이 된다.
package construct;
public class ConstructMain2 {
public static void main(String[] args) {
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2", 16);
MemberConstruct[] members = {member1, member2};
for (MemberConstruct s : members) {
System.out.println("이름: " + s.name + " 나이: " + s.age + " 성적: " + s.grade);
}
}
}
생성자를 오버로딩 한 덕분에 성적 입력이 꼭 필요한 경우에는 grade
가 있는 생성자를 호출하면 되고, 그렇지 않은 경우에는 grade
가 없는 생성자를 호출하면 된다. grade
가 없는 생성자를 호출하면 성적은 50
점이 된다.
두 생성자를 비교해보면 코드가 중복되는 부분이 있다.
MemberConstruct(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
바로 다음 부분이다.
this.name = name;
this.age = age;
이때 this()
라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다. 참고로 this
는 인스턴스 자신의 참조값을 가리킨다. 그래서 자신의 생성자를 호출한다고 생각하면 된다.
코드를 다음과 같이 수정해보자.
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
// 추가
MemberConstruct(String name, int age) {
this(name, age, 50); // 변경
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name: " + name + ", age: " + age + ", grade: " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
이 코드는 첫 번째 생성자 내부에서 두 번째 생성자를 호출한다.
MemberConstruct(String name, int age) -> MemberConstruct(String name, int age, int grade)
this()
를 사용하면 생성자 내부에서 다른 생성자를 호출할 수 있다. 이 부분을 잘 활용하면 중복을 제거할 수 있다.
this()
는 생성자 코드의 첫줄에만 작성할 수 있다.다음은 규칙 위반이다. 이 경우 컴파일 오류가 발생한다.
public MemberConstruct(String name, int age) {
System.out.println("go");
this(name, age, 50);
}