public class OuterClass {
private static String staticField = "정적 필드";
private String instanceField = "인스턴스 필드";
// 정적 멤버 클래스
public static class StaticInnerClass {
public void display() {
// 바깥 클래스의 정적 멤버에 접근 가능
System.out.println(staticField);
// 바깥 클래스의 인스턴스 멤버에 직접 접근할 수 없음
// System.out.println(instanceField); // 오류 발생
}
}
public static void main(String[] args) {
// 정적 멤버 클래스의 인스턴스 생성
StaticInnerClass staticInner = new StaticInnerClass();
staticInner.display(); // 출력: 정적 필드
}
}
클래스 내부에 static으로 선언된 클래스
다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있음
다른 정적 멤버와 똑같은 접근 규칙을 적용받음
ex) private으로 선언 시 바깥 클래스에서만 접근할 수 있음
멤버 클래스에서 바깥 인스턴스에 접근할 일이 없으면 무조건 static을 붙여서 정적 멤버 클래스로 만들자
public class OuterClass {
private String outerField = "바깥 클래스의 필드";
// 비정적 멤버 클래스
public class InnerClass {
public void display() {
// 바깥 클래스의 인스턴스 변수에 접근 가능
System.out.println(outerField);
}
}
public void createInnerClass() {
// InnerClass의 인스턴스 생성
InnerClass inner = new InnerClass();
inner.display(); // 출력: 바깥 클래스의 필드
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.createInnerClass(); // 비정적 멤버 클래스 사용
}
}
static이 붙지 않은 멤버 클래스
어댑터를 정의할 때 자주 쓰임
→ 어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 뷰로 사용
비정적 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 암묵적으로 연결됨.
→ 바깥 인스턴스의 메서드를 호출하거나 바깥 인스턴스의 참조를 가져올 수 있음