24. 멤버 클래스는 되도록 static으로 만들라

  • 중첩 클래스(nested class)란?

    • 다른 클래스 안에 정의된 클래스

  • 지켜야할 룰

    • 자신을 감싼 바깥 클래스에서만 쓰여야 하고, 아닐 경우 톱레벨 클래스로 정의하자.

  • 중첩 클래스의 종류

    • 정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역 클래스

      • static member classes, nonstatic member classes, anonymous classes, local classes

    • 첫번째를 제외한 나머지는 중첩 클래스(inner class)

언제 어떤 중첩 클래스를 사용해야 할까?

중첩 클래스 1: static member classes

  • Baeldungarrow-up-right

    • 감싼 클래스의 instance가 아니라 그냥 class에 속한다

    • 내부 구현에 모든 종류의 접근 제어자를 가질 수 있다

    • 감싼 클래스의 static 키워드가 붙은 멤버에만 액세스할 수 있다

  • 책에 따르면,

    • 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고는 일반 클래스와 똑같다

    • 바깥 클래스와 함께 쓰일때 유용한 도우미 클래스로 쓰인다.

    • 개념상 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재할 수 있다면 static 멤버 클래스로 만들어야 한다. non-static 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없기 때문이다.

      • 궁금

        • 위에서 "자신을 감싼 바깥 클래스에서만 쓰여야 하고, 아닐 경우 톱레벨 클래스로 정의하자." 라고 하였는데...

        • 바깥 인스턴스와 독립적으로 움직인다는 것은 감싼 클래스 이외에 쓰일때도 사용할 수 있다는 건가?

종류 2: non-static member classes

nonstatic 사용 예시

  • 어댑터를 정의할 때 자주 쓰인다.

  • 즉, 어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 뷰로 사용하는 것이다.

    • 예를 들어, Map 의 구현체들 자신의 컬렉션 뷰를 구현할 때 비정적 멤버 클래스를 사용

자바 HashMap 코드 예시

종류 3: anonymous classes

  • 자바 7에서 람다를 지원하기 전에는 즉석에서 작은 함수나 객체 처리를 하기 위해 주로 사용했었지만 이제 람다에게 자리를 내어 주었다 (item42)

  • 익명 클래스는 바깥 클래스의 멤버가 아니다. 멤버와 달리 쓰이는 시점에 선언과 동시에 인스턴스가 만들어 진다

자바 예시

종류 4: local classes

  • 가장 드물게 사용된다.

  • scope block 이나 메서드 안에 들어간 클래스이다

질문

  • MyCsvBuilder 안에서만 말고 이외 클래스에서 enum 클래스 값들을 접근해서 사용해도 되는가?

참고자료

Last updated