정적 내포 클래스를 사용할 경우
다음 코드의 결과는? (참조 없이 outer 인스턴스 멤버 접근)
public class Outer {
private int value = 10;
public static class Nested {
public void print() {
System.out.println(value);
}
}
}컴파일 오류
- static 내포 클래스는 outer 개체에 대한 참조가 없음 (비정적 inner와의 차이)
- 그래서 outer의 인스턴스 멤버
value에 바로 접근할 수 없음 - 접근하려면 outer 개체의 참조를 따로 받아야 함
다음 코드의 출력은? (outer 참조가 있으면 private도 접근 OK)
public class Outer {
private int value;
public Outer(int value) {
this.value = value;
}
public static class Nested {
private Outer outer;
public Nested(Outer outer) {
this.outer = outer;
}
public int read() {
return this.outer.value;
}
}
}
// main
Outer outer = new Outer(42);
Outer.Nested nested = new Outer.Nested(outer);
System.out.println(nested.read());42- outer 개체의 참조만 있으면 outer의
private인스턴스 멤버도 접근 가능 - 접근 제어자는 클래스 레벨 개념이라 내포 클래스에서는 문제가 안 됨
static 내포 클래스의 개체 생성 방법은?
Outer.Nested nested = new Outer.Nested();- 비정적 inner와 달리 outer 개체 없이 생성 가능
- 반대로
outer.new Nested()문법은 컴파일 오류 (그건 비정적 inner용)
다음 코드의 출력은? (static 멤버는 바로, 인스턴스 멤버는 참조로)
public class Outer {
static int SOME_HACK = 1; // 정적 멤버
int ANOTHER_HACK = 2; // 인스턴스 멤버
public static class Nested {
public void read(Outer outer) {
System.out.println(SOME_HACK);
System.out.println(outer.ANOTHER_HACK);
}
}
}1
2SOME_HACK(정적)은 outer 참조 없이 바로 접근 (SOME_HACK또는Outer.SOME_HACK둘 다 OK)ANOTHER_HACK(인스턴스)은 outer 개체 참조를 통해서만 접근 (outer.ANOTHER_HACK)
다음 코드의 결과는? (outer 참조 없이 ANOTHER_HACK 접근)
public class Outer {
static int SOME_HACK = 1; // 정적 멤버
int ANOTHER_HACK = 2; // 인스턴스 멤버
public static class Nested {
public void read() {
System.out.println(SOME_HACK); // (1)
System.out.println(ANOTHER_HACK); // (2)
}
}
}컴파일 오류 ((2)에서)
- (1)
SOME_HACK(정적)은 클래스 레벨이라 참조 없이 바로 접근 OK - (2)
ANOTHER_HACK(인스턴스)은 outer 개체가 있어야 접근 가능한데, static 내포 클래스는 outer 개체 참조가 없음 → 컴파일 오류 - 이것이 static 내포 클래스가 외부 개체 참조를 (암시적으로) 갖지 않는다는 증거
다음 코드의 결과는? (최상위 클래스 접근 제어자)
private class Foo {
}컴파일 오류
- 최상위(top-level) 클래스에는
public또는 생략(package-private)만 가능 private/protected는 붙일 수 없음
다음 코드는 컴파일되는가? (내포 클래스 접근 제어자)
public class Outer {
private static class A {}
protected static class B {}
public static class C {}
static class D {} // package-private
}컴파일·실행 잘 됨
- 내포 클래스에는 4종 접근 제어자(
private/protected/public/생략)를 모두 붙일 수 있음 - 최상위 클래스와 다른 점