오늘은 자바의 가장 기본이면서도 헷갈리는 개념인 생성자와 this에 대해 복습의 일환으로, 학습했던 코드를 뜯어보며 '왜?'라는 질문을 던져봤다. 알고 있다고 생각했는데, 막상 설명하려니 막히는 부분이 있어서 제대로 정리해보기로 했다
늘 분석하고 복습한 코드는 기본적인 객체 생성 Account 클래스다.

기본 생성자 (Default Constructor)
객체를 생성할 때 new Account() 처럼 매개변수 없이 호출하는 생성자다.
컴파일러의 자동 생성 서비스: 내가 클래스에 생성자를 단 하나도 만들지 않으면, 컴파일러가 알아서 public Account() {} 와 같은 기본 생성자를 몰래 만들어준다.
서비스 중단 조건: 내가 매개변수가 있는 생성자를 단 하나라도 직접 만들면, 컴파일러는 더 이상 기본 생성자를 자동으로 만들어주지 않는다.
핵심: 매개변수 있는 생성자를 만든 후에도 new Account()를 사용하고 싶다면, 반드시 public Account() {} 코드를 직접 추가해줘야 한다. 안 그러면 "그런 생성자 없다"는 컴파일 에러를 만나게 된다.
-매개변수 있는 생성자 (Parameterized Constructor)
객체를 생성하는 동시에 필드 값을 원하는 값으로 초기화하고 싶을 때 사용한다.
Account acc = new Account("홍길동", 10000, "예금"); 처럼 사용.
this 키워드는 상황에 따라 두가지 의미로 쓰인다.
this. : 참조 변수 '바로 나 자신'this.는 생성될 객체 인스턴스 자기 자신을 가리키는 리모컨(참조)이다. 가장 흔한 사용처는 필드와 매개변수의 이름이 같을 때 이를 구분하는 것이다.public Account(String name) {
// 이 객체의 name 필드에(this.name), 매개변수로 들어온 name 값을 할당하라
this.name = name;
}Account account1 = new Account("제니");
System.out.println(account1);실행 결과:Account{name='제니', money=0, field='null'}
this(): 생성자 호출 "다른 나에게 부탁"Before(중복 발생)
public Account(String name, String field) {
this.name = name;
this.field = field;
}
public Account(String name, int money, String field) {
this.name = name; // name, field 초기화 코드가
this.field = field; // 중복된다.
this.money = money;
}
After (this() 사용):
public Account(String name, String field) {
this.name = name;
this.field = field;
}
public Account(String name, int money, String field) {
// "name과 field 초기화는 저기 있는 다른 생성자에게 맡길게!"
this(name, field);
this.money = money; // 나는 money만 신경 쓰면 된다.
}
this(name, field)를 통해 Account(String, String) 생성자를 호출하여 코드 중복을 없애고 유지보수를 편하게 만들었다.
this() 사용 규칙
- 반드시 생성자의 첫 번째 줄에 작성해야 한다.
- 생성자 당 딱 한 번만 호출할 수 있다.
정리하며 ...
알고 있다고 생각하는 것과, '왜?'라고 물었을 때 막힘없이 설명할 수 있는 것은 정말 다른 차원이라는 걸 느꼈다.
기본 생성자는 컴파일러의 '조건부' 서비스라는 점을 명심하자.
this.는 인스턴스 자신, this()는 다른 생성자 호출. 역할이 명확히 다르다.
앞으로 블로그에 작성될 글은 이 글과 같이 스스로 질문을 던지고 배웠던 코드를 분석하는 글이 될 것이다. 나중에 곱씹을 수 있도록.