자바 this와 this() 인스턴스 참조·생성자 체이닝
this 참조 변수란?
this 는 메서드(또는 생성자) 안에서 “현재 인스턴스 자신”을 가리키는 숨겨진 레퍼런스입니다.
- 인스턴스 필드·메서드에 안전하게 접근하도록 도와주며, 클래스(static) 메서드에서는 존재하지 않습니다.
- 매개변수 이름과 필드 이름이 같을 때 이름 충돌을 해결하거나, 메서드 체이닝에서 현재 객체를 반환할 때 자주 사용됩니다.
class Car {
private String model;
private int year;
Car(String model, int year){
this.model = model; // ← 필드와 매개변수 구분
this.year = year;
}
Car changeModel(String model){
this.model = model;
return this; // ← 메서드 체이닝
}
}
this() — 생성자에서 생성자 호출하기
this() 는 같은 클래스에 정의된 다른 생성자를 호출하는 특수 메서드입니다.
규칙 ① 생성자 안에서만 사용할 수 있습니다.
규칙 ② 반드시 첫 번째 실행문이어야 합니다.
중복 초기화 제거 예시
class Car {
private String model;
private int year;
private String color;
Car(){ // 기본 생성자
this("미정", 0, "미정"); // 공통 초기화 로직은 한 곳에!
}
Car(String model, int year){ // 2-파라미터 생성자
this(model, year, "미정");
}
Car(String model,int year,String color){
this.model = model;
this.year = year;
this.color = color;
}
}
이처럼 생성자 체이닝(Constructor Chaining)을 사용하면 코드 중복을 줄이고 유지보수성을 높일 수 있습니다.
this vs this() — 핵심 차이
| 항목 | this | this() |
|---|---|---|
| 뜻 | 현재 객체(인스턴스) 참조 | 같은 클래스의 다른 생성자 호출 |
| 사용 위치 | 인스턴스 메서드·모든 생성자 | 생성자 내부 첫 줄 |
| 주요 용도 | 필드·매개변수 구분, 메서드 체이닝 | 공통 초기화 코드 재사용 |
| 반환/효과 | 참조 값을 반환(선택) | 선택한 생성자 실행 후 이어서 현재 생성자 실행 |
실전 예제 — this & this() 함께 쓰기
class Laptop {
private String brand;
private int ram; // GB
private int ssd; // GB
Laptop(){ // 1: 기본 생성자
this("무명", 8, 256); // 2-파라미터·3-파라미터 공통 초기화 사용
}
Laptop(String brand,int ram){ // 2: 부분 지정
this(brand, ram, 256); // 기본 SSD 용량 지정
}
Laptop(String brand,int ram,int ssd){ // 3: 풀 지정
this.brand = brand;
this.ram = ram;
this.ssd = ssd;
}
void spec(){
System.out.printf("%s / %dGB RAM / %dGB SSD%n",
this.brand, this.ram, this.ssd);
}
}
public class Main{
public static void main(String[] args){
new Laptop().spec(); // 무명 / 8GB RAM / 256GB SSD
new Laptop("Apple",16).spec(); // Apple / 16GB RAM / 256GB SSD
new Laptop("Samsung",32,512).spec(); // Samsung / 32GB RAM / 512GB SSD
}
}
사용 시 주의할 점
- this()는 첫 줄 규칙을 어기면 컴파일 에러가 발생합니다.
static블록·static메서드에서는 인스턴스가 없으므로 this 사용 불가입니다.- 생성자를 하나라도 만들면 디폴트 생성자가 자동 생성되지 않으므로 필요하다면 직접 작성해야 합니다.
마무리 — 언제 어떻게 써야 할까?
- this → 필드와 매개변수명이 겹치거나, 메서드 체이닝이 필요할 때
- this() → 생성자가 여러 개이고 공통 초기화 코드를 한 곳에 모으고 싶을 때
적재적소에 두 키워드를 활용하면 코드 중복을 없애고 객체 초기화 과정을 더욱 명확·안전하게 만들 수 있습니다.
질문 정리
-
static 메서드에서 this를 쓰면 안 되나요?
네. static 영역은 인스턴스와 무관하므로
this참조가 존재하지 않습니다. -
생성자에서 super()와 this()를 동시에 호출할 수 있나요?
불가능합니다. 둘 다 첫 줄에 위치해야 하므로 한 번에 하나만 사용해야 합니다.
-
this()로 무한 루프가 생길 수도 있나요?
서로를 반복 호출하도록 잘못 체이닝하면 StackOverflowError가 발생할 수 있으니 주의하세요.
-
this를 반환하면 어떤 장점이 있나요?
연속적인 호출(메서드 체이닝)로 가독성이 높아지고 외부에서 같은 객체를 재활용할 수 있습니다.
-
생성자 오버로딩이 많아지면 대안은?
매개변수가 늘어나면 빌더 패턴으로 전환하여 가독성과 확장성을 확보하는 것이 좋습니다.
댓글남기기