💁♀️ 생성자(Constructor)란,
객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때 1회성으로 호출되는 리턴타입이 없는 메소드
- 인스턴스 생성 시 필드 초기화 목적으로 주로 사용
- 생성자 작성 규칙
* 기본 생성자 : Public 클래스명( ) { }
* 매개변수 생성자 : Public 클래스명(자료형 매개변수) { }
🙋 잠깐 ! 왜 생성자를 사용하나요?
- 객체(인스턴스) 생성 시점에 수행할 명령이 있는 경우
- '매개변수 생성자'는 객체(인스턴스) 생성 시 바로 필드 초기화하는 목적
- 작성한 생성자 이외에는 인스턴스 생성 방법을 제공하지 않는다는 의미 (인스턴스 생성 방법 제한)
public class User {
// 필드 선언부
private String id;
private String pwd;
private String name;
private java.util.Date enrollDate;
// 생성자 선언부
>>> 기본 생성자(default constructor) */
public User() {
System.out.println("User 클래스의 기본 생성자 호출함...");
}
>>> 매개변수가 있는 생성자 [1]
public User(String id, String pwd, String name) {
>>> 필드에 값을 설정하고싶을 때(바로 초기화를 같이 하고싶을 때) 매개변수를 넣음
this.id = id;
this.pwd = pwd;
this.name = name;
System.out.println("User 클래스의 id, pwd, name을 초기화 하는 생성자 호출함...");
}
>>> 매개변수가 있는 생성자 [2]
public User(String id, String pwd, String name, java.util.Date enrollDate) {
>>> 완전히 중복되지않는다는 조건하에 매개변수 생성자는 아주 많이 만들 수 있음
// this.id = id;
// this.pwd = pwd;
// this.name = name;
>>> this() : 동일 클래스 내에 작성한 다른 생성자 메소드를 호출하는 구문
>>> this()는 가장 첫 줄에 선언해야하며, 그렇지 않은 경우 컴파일 에러 발생
this(id, pwd, name);
>>> 생성자 내부에서 다른 생성자 호출이 가능 (생성자 [1] 호출됨)
>>> 생성자 [1]과 동일한 기능을 갖고있기 때문에(중복되기 때문에) this로 생성자 1호출
this.enrollDate = enrollDate;
System.out.println("User 클래스의 모든 필드를 초기화 하는 생성자 호출함...");
}
// 메소드 선언부
// setter, getter 작성해야 하지만 생략 //
// 모든 필드가 가지고 있는 값을 문자열로 만들어 반환하는 메소드
public String getInformation() {
return "User [id=" + this.id + ", pwd=" + this.pwd + ", name=" + this.name + ", enrollDate=" +this.enrollDate + "]";
}
}
📌 Ref.
* 생성자 선언부의 작성 위치는 문법적으로 클래스 내부에 작성하면 되지만,
통상적으로 필드 선언부와 메소드 선언부 사이에 작성하는 것이 관례
* 초기화할 필드가 여러 개 있는 경우, 초기화 하고싶은 필드의 갯수별로 생성자를 여러 개 만들 수 있음
* 클래스 내에 생성자가 정의되어 있지 않다면 컴파일러에 의해 기본 생성자가 자동으로 추가
public class Application {
public static void main(String[] args) {
>>> 클래스 내에 생성자가 정의되어 있지 않다면 컴파일러에 의해 기본 생성자가 자동으로 추가
>>> 하지만 생성자가 하나라도 정의 되어 있다면 컴파일러는 기본 생성자를 자동으로 추가하지 않으므로 주의
>>> 기본 생성자 호출
User user1 = new User(); // : User()는 '생성자'
System.out.println(user1.getInformation());
>>> 매개변수 생성자 1 호출
User user2 = new User("user01", "pass01", "유관순");
System.out.println(user2.getInformation());
>>> 매개변수 생성자 2 호출
User user3 = new User("user02", "pass02", "홍길동", new java.util.Date()); // java.util.Date() : 실행된 현재 시각을 나타내는 생성자
System.out.println(user3.getInformation());
>>> 정의되지않은 형식의 생성자는 호출 불가능
// User user4 = new User("user03", "pass03")
}
}
💻 Mini Console
User 클래스의 기본 생성자 호출함...
User [id=null, pwd=null, name=null, enrollDate=null]
User 클래스의 id, pwd, name을 초기화 하는 생성자 호출함...
User [id=user01, pwd=pass01, name=유관순, enrollDate=null]
User 클래스의 id, pwd, name을 초기화 하는 생성자 호출함...
User 클래스의 모든 필드를 초기화 하는 생성자 호출함...
User [id=user02, pwd=pass02, name=홍길동, enrollDate=Thu Dec 29 18:27:26 KST 2022]