[참고: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html]
다른 클래스 안에 정의된 클래스
자신을 감싼 바깥 클래스에서만 쓰여야 한다.
그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다.
왜 사용할까?
종류에는 정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역 클래스가 있으며 정적 멤버 클래스를 제외한 나머지는 **내부 클래스(inner class)**에 해당한다. ****
class OuterClass {
...
class NestedClass {
...
}
}
static
으로 선언된 클래스이다.static
으로 선언되어있지만, static 필드 변수
나 static 메서드
처럼 메모리에 한 번만 올라가지는 않는다. 즉, 비정적 멤버 클래스(외부 인스턴스를 먼저 선언하고 초기화하는 선수작업을 거쳐야 함)와 달리 내부 클래스의 인스턴스를 바로 생성할 수 있다는 차이점이 있다.private
멤버에도 접근할 수 있다. 그 외는 일반 클래스와 동일하다.private
으로 선언시 outer class에서만 접근할 수 있다.static
멤버에만 접근할 수 있다.public class OuterClass {
String outerField = "Outer field";
static String staticOuterField = "Static Outer Field";
static class StaticNestedClass {
void accessMembers() {
System.out.println(outerfield); // 컴파일 에러 !!!
System.out.println(staticOuterField);
}
}
}
public class OuterClass {
private String outerField = "Outer field";
private static String staticOuterField = "Static Outer Field";
private static class StaticNestedClass {
void accessMembers(OuterClass outerClass) {
System.out.println(outerClass.outerField); // outer class의 instance 참조하여 접근
System.out.println(staticOuterField);
}
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
StaticNestedClass snc = new StaticNestedClass();
snc.accessMembers(oc);
}
}
Map
interface를 구현하는 HashMap
의 Node
클래스
Entry
의 getKey()
, genValue()
등의 메서드를 직접 사용하지 않음