본문 바로가기

반응형

이번 글에서는 자바의 인스턴스 멤버 클래스 내부에서 this와 외부 클래스 참조를 어떻게 구분하고 사용하는지를 배웁니다.
내부 클래스와 외부 클래스에 같은 이름의 필드나 메서드가 존재할 때,
어떤 것이 호출되는지 명확히 구분하는 방법을 학습합니다.


📦 외부 클래스 (A.java)

package ch09.sec05.exam02;

public class A {
	String field = "A-field";

	void method() {
		System.out.println("A-method");
	}

	class B {
		String field = "B-field";

		void method() {
			System.out.println("B-method");
		}

		void print() {
			System.out.println(this.field);       // 내부 클래스 B의 field
			this.method();                        // 내부 클래스 B의 method()
			System.out.println(A.this.field);     // 외부 클래스 A의 field
			A.this.method();                      // 외부 클래스 A의 method()
		}
	}

	void useB() {
		B b = new B();
		b.print();
	}
}

📌 실행 클래스 (AExample.java)

package ch09.sec05.exam02;

public class AExample {
	public static void main(String[] args) {
		A a = new A();
		a.useB();
	}
}

💻 실행 결과

B-field
B-method
A-field
A-method

💬 코드 설명

  • this.field, this.method()
    → 내부 클래스 B의 멤버를 참조
  • A.this.field, A.this.method()
    → 외부 클래스 A의 멤버를 참조

✔ 내부 클래스가 외부 클래스 인스턴스와 연결되어 있기 때문에
A.this를 통해 외부 클래스의 멤버에 접근 가능!


📌 간단 정리

참조 표현 실제 대상
this.field 클래스 B의 필드
A.this.field 클래스 A의 필드
this.method() 클래스 B의 메서드
A.this.method() 클래스 A의 메서드

💡 포인트 정리

  • 내부 클래스는 외부 클래스의 인스턴스를 포함한 객체처럼 동작
  • 내부 클래스와 외부 클래스에 동일한 이름의 필드/메서드가 있을 때는 this, A.this로 구분
  • 외부 클래스 이름을 명시한 A.this는 외부 인스턴스를 직접 참조하는 문법
  • 내부 클래스는 외부 인스턴스와 연결되어야 생성 가능

📌 정리하자면,
내부 클래스에서 외부 클래스와 이름이 같은 필드나 메서드가 충돌할 경우,
this와 A.this를 이용해 정확하게 참조할 수 있어야 합니다.
특히 복잡한 클래스 구조에서 매우 유용하게 쓰이는 개념입니다.

댓글