🪛 한계점
Java 의 특정 클래스에는 다른 클래스가 없다면 아무 쓸모가 없는 클래스가 있을 수 있다.
가령 다음 Entry 라는 클래스를 보자.
// Map.class
public class Map { ... }
// Entry.class
public class Entry<K, V> { ... }
Map 안의 구성요소로 자리잡은 Entry 는 다른 클래스에선 전혀 쓸모가 없는 클래스가 된다. 이렇게 된다면 파일 구조 자체를 Entry 를 따로 만들 필요 없고, 이는 응집도(Cohesion)가 떨어지는 구조가 된다.
따라서 Java 에서는 이를 위해 Nested Class 를 지원한다
📂 목차
- Nested Class 의 사용으로 인한 Logical Grouping
- Encapsulation 와 노출 최소화
- static 을 통한 상태를 공유할지 말지 명시적 선택 가능
- Nested Class 의 용도
📚 본문
Nested Class 의 사용으로 인한 Logical Grouping
위 클래스를 아래와 같이 바꾸자:
// Map.class
public class Map {
...
public static class Entry<K, V> { ... }
}
결과적으로 응집도가 높아지며, 읽는 사람의 눈에도 한눈에 파악할 수 있게 된다.
Encapsulation 와 노출 최소화
외부적으로 이를 쓰는 클래스는 굳이 절대 쓸 일 없는 보조 클래스인 Entry 가 어떻게 흘러가는지 알 필요가 없다. 따라서 다음과 같이 바꿀 수도 있다.
// Map.class
public class Map {
...
private static class Entry<K, V> { ... }
}
이를 통해 API 인터페이스 surface 를 줄이고, 유지보수성을 가져가게 된다.
static 을 통한 상태를 공유할지 말지 명시적 선택 가능
static 이면 독립적인 클래스로(상위 클래스에 종속되지 않음), 바깥 인스턴스 없이도 동작한다. non-static 이면 outer class 의 인스턴스 상태에 의존한다.
// Map.class
public class Map {
...
private class Entry<K, V> { ... }
}
Entry 는 굳이 독립적으로 존재하면 안되기에 static 을 빼준다.
Nested Class 의 용도
- 외부 클래스의 인스턴스 없이도 의미가 있을 때
- Builder, DTO 구조화, Enum 안의 상태 표현 등에 쓰이게 된다.
public class Person {
public static class Builder {
private String name;
public Builder name(String name) {
this.name = name;
return this;
}
public Person build() {
return new Person(name);
}
}
}