1. 생성자의 등장 배경
문제점 (생성자 등장 전)
- 객체를 생성한 후 초기 작업(데이터 설정)을 위해 별도의 메서드를 호출해야 했다.
- 초기화 메서드를 호출하지 않을 경우 객체가 유효하지 않은 상태로 존재할 수 있다.
예제: 생성자 등장 전
MemberInit member = new MemberInit();
member.initMember("user1", 15, 90);
- 문제:
initMember()를 호출하지 않아도 프로그램은 실행되지만, 객체가 필수 데이터를 가지지 않는 유령 객체가 될 수 있음.
2. 생성자의 장점
중복 호출 제거
- 생성자는 객체 생성 시 자동 호출되므로 초기화 메서드를 별도로 호출할 필요가 없다.
- 객체 생성과 동시에 초기화 작업이 이루어지므로 중복 작업이 제거되고 코드가 간결해진다.
예제: 생성자 사용
MemberConstruct member = new MemberConstruct("user1", 15, 90);
필수 값 입력 보장
- 생성자를 명시적으로 정의하면 객체를 생성할 때 반드시 생성자를 호출해야 한다.
- 필수값을 입력하지 않으면 컴파일 오류가 발생하므로 객체의 유효한 상태를 보장할 수 있다.
예제: 생성자 호출 필수
public class MemberConstruct {
String name;
int age;
int grade;
public MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
MemberConstruct member = new MemberConstruct();
오류 메시지
no suitable constructor found for MemberConstruct(no arguments)
- 결과: 개발자는 필수값이 있는 생성자를 호출해야 객체를 생성할 수 있다.
3. 생성자 오버로딩
정의
- 생성자 오버로딩을 통해 여러 개의 생성자를 정의하여 다양한 초기화 방식을 제공할 수 있다.
this() 키워드를 사용하면 중복 코드 작성을 방지할 수 있다.
예제: 생성자 오버로딩
public class MemberConstruct {
String name;
int age;
int grade;
public MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
public MemberConstruct(String name) {
this(name, 0, 0);
}
}
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2");
- 결과:
- 첫 번째 생성자는 모든 값을 초기화.
- 두 번째 생성자는
name만 설정하고 나머지는 기본값으로 초기화.
4. 생성자와 기본 생성자의 관계
기본 생성자
- 개발자가 생성자를 하나도 정의하지 않으면 컴파일러가 자동으로 기본 생성자(파라미터 없는 생성자)를 추가한다.
명시적 생성자
- 개발자가 생성자를 명시적으로 정의하면, 컴파일러는 기본 생성자를 추가하지 않는다.
- 이 경우 객체를 생성할 때 명시된 생성자만 호출할 수 있다.
예제
public class MemberConstruct {
String name;
public MemberConstruct(String name) {
this.name = name;
}
}
MemberConstruct member = new MemberConstruct();
요약
- 중복 호출 제거:
- 생성자는 객체 생성과 동시에 초기화 작업을 처리하므로 불필요한 메서드 호출을 제거한다.
- 필수 값 입력 보장:
- 명시적 생성자를 정의하면 필수값 입력이 강제되며, 컴파일 시점에 오류를 확인할 수 있다.
- 생성자 오버로딩:
- 여러 생성자를 제공하여 초기화 방식을 다양하게 처리할 수 있으며,
this()를 사용해 중복 코드를 방지한다.
- 기본 생성자와 명시적 생성자:
- 생성자를 명시적으로 정의하면 기본 생성자는 자동으로 추가되지 않는다.