24. 멤버 클래스는 되도록 static으로 만들라
중첩 클래스(nested class)란?
다른 클래스 안에 정의된 클래스
지켜야할 룰
자신을 감싼 바깥 클래스에서만 쓰여야 하고, 아닐 경우 톱레벨 클래스로 정의하자.
중첩 클래스의 종류
정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역 클래스
static member classes, nonstatic member classes, anonymous classes, local classes
첫번째를 제외한 나머지는 중첩 클래스(inner class)
언제 어떤 중첩 클래스를 사용해야 할까?
중첩 클래스 1: static member classes
감싼 클래스의 instance가 아니라 그냥 class에 속한다
내부 구현에 모든 종류의 접근 제어자를 가질 수 있다
감싼 클래스의 static 키워드가 붙은 멤버에만 액세스할 수 있다
책에 따르면,
바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고는 일반 클래스와 똑같다
바깥 클래스와 함께 쓰일때 유용한 도우미 클래스로 쓰인다.
아이템 34 예시, Calulator의 Operation enu 중첩 클래스
개념상 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재할 수 있다면 static 멤버 클래스로 만들어야 한다. non-static 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없기 때문이다.
궁금
위에서 "자신을 감싼 바깥 클래스에서만 쓰여야 하고, 아닐 경우 톱레벨 클래스로 정의하자." 라고 하였는데...
바깥 인스턴스와 독립적으로 움직인다는 것은 감싼 클래스 이외에 쓰일때도 사용할 수 있다는 건가?
종류 2: non-static member classes
감싼 클래스의 인스턴스 연결된다
감싼 클래스의 모든 멤버들에 접근할 수 있다 (static non-static 상관 x)
안에서 non-static 멤버만 가질 수 있다
근데, 버전 16 부터는 가능한듯..
nonstatic 사용 예시
어댑터를 정의할 때 자주 쓰인다.
즉, 어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 뷰로 사용하는 것이다.
예를 들어, Map 의 구현체들 자신의 컬렉션 뷰를 구현할 때 비정적 멤버 클래스를 사용
자바 HashMap 코드 예시
종류 3: anonymous classes
자바 7에서 람다를 지원하기 전에는 즉석에서 작은 함수나 객체 처리를 하기 위해 주로 사용했었지만 이제 람다에게 자리를 내어 주었다 (item42)
익명 클래스는 바깥 클래스의 멤버가 아니다. 멤버와 달리 쓰이는 시점에 선언과 동시에 인스턴스가 만들어 진다
자바 예시
종류 4: local classes
가장 드물게 사용된다.
scope block 이나 메서드 안에 들어간 클래스이다
질문
MyCsvBuilder 안에서만 말고 이외 클래스에서 enum 클래스 값들을 접근해서 사용해도 되는가?
참고자료
https://www.baeldung.com/java-nested-classes
Last updated