
객체를 만들고 나면 보통은 곧바로 초기값을 넣어야 한다.
예를 들어, 회원 객체를 생성하자마자 이름·나이·성적을 설정하는 경우가 많다.
MemberInit member1 = new MemberInit();
member1.name = "user1";
member1.age = 15;
member1.grade = 90;
이 초기화 작업은 매번 반복된다.
물론 initMember(...) 같은 메서드를 만들어 중복을 줄일 수 있지만, 객체 생성 직후 반드시 호출해야 한다는 보장이 없다.
→ 이 문제를 해결하는 것이 바로 생성자(Constructor)다.
public class MemberInit {
String name;
int age;
int grade;
void initMember(String name, int age, int grade) {
this.name = name; // 인스턴스 자신의 참조값을 의미
this.age = age;
this.grade = grade;
}
}
this를 붙여야 한다. this는 인스턴스 자기 자신을 가리키는 참조값이다.this.name = name;
// 1. 오른쪽 name → 매개변수
// 2. this.name → 인스턴스의 멤버 변수
생성자를 사용하면 객체를 만들자마자 초기화를 강제할 수 있다.
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name=" + name);
this.name = name;
this.age = age;
this.grade = grade;
}
}
사용 예시:
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2", 16, 80);
출력:
생성자 호출 name=user1
생성자 호출 name=user2
중복 제거
객체 생성과 동시에 초기화를 처리한다.
// 생성자 전
MemberInit member = new MemberInit();
member.initMember("user1", 15, 90);
// 생성자 후
MemberConstruct member = new MemberConstruct("user1", 15, 90);
필수값 입력 보장
public class MemberDefault {
String name;
}
위 코드에서 다음과 같이 호출할 수 있다:
MemberDefault member = new MemberDefault(); // OK
직접 정의할 수도 있다:
MemberDefault() {
System.out.println("생성자 호출");
}
생성자도 오버로딩이 가능하다.
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) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
this()를 사용하면 같은 클래스의 다른 생성자를 호출할 수 있다.