클래스 안에 정의된 클래스
종류 2 가지 ( inner & static nested class )
Outer 클래스의 멤버이다.
private, public, protected, package-private로 선언 가능
static class methods와 같이 encloing class의 instance 변수 나 함수를 직접 접근 할 수 없고 오직 object reference를 통해서만 사용할 수 있다.
접근 방법 : OuterClass 이름으로
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();
instance methods and variables와 같이 OuterClass의 인스턴스와 관련있다.
enclosing class object의 method 와 fields 에 직접 접근 가능하다.
instance 와 관련 있으므로 static 맴버를 정의 할 수 없다.
InnerClass 인스턴스는 오직 OuterClass의 인스턴스 안에서만 존재할 수 있고(클래스의 non-static 함수,필드처럼) OuterClass 인스턴스의 함수와 필드에 직접 접근 할 수 있다.
InnerClass를 인스턴스화하기 위해 먼저 OuterClass를 인스턴스화 해야한다.
OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
2가지 종류의 inner class 존재
outerObject로 OuterClass를 참조하고 있어 enclosing class의 맴버에 접근 할 수 있다. -> 장점보다 단점이 많다(외부 인스턴스에 대한 참조가 존재하기 때문에, 가비지 컬렉션이 인스턴스 수거를 하지 못하여 메모리 누수가 생길 수 있다.)
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
출력
x = 23
this.x = 1
ShadowTest.this.x = 0
출처 :
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html