Developer.

Nested Class

🪛 한계점

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

위 클래스를 아래와 같이 바꾸자:

// 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);
        }
    }
}

📁 관련 글