2 분 소요

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() → 생성자가 여러 개이고 공통 초기화 코드를 한 곳에 모으고 싶을 때

적재적소에 두 키워드를 활용하면 코드 중복을 없애고 객체 초기화 과정을 더욱 명확·안전하게 만들 수 있습니다.


질문 정리

  1. static 메서드에서 this를 쓰면 안 되나요?

    네. static 영역은 인스턴스와 무관하므로 this 참조가 존재하지 않습니다.

  2. 생성자에서 super()와 this()를 동시에 호출할 수 있나요?

    불가능합니다. 둘 다 첫 줄에 위치해야 하므로 한 번에 하나만 사용해야 합니다.

  3. this()로 무한 루프가 생길 수도 있나요?

    서로를 반복 호출하도록 잘못 체이닝하면 StackOverflowError가 발생할 수 있으니 주의하세요.

  4. this를 반환하면 어떤 장점이 있나요?

    연속적인 호출(메서드 체이닝)로 가독성이 높아지고 외부에서 같은 객체를 재활용할 수 있습니다.

  5. 생성자 오버로딩이 많아지면 대안은?

    매개변수가 늘어나면 빌더 패턴으로 전환하여 가독성과 확장성을 확보하는 것이 좋습니다.

카테고리:

업데이트:

댓글남기기