ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Item 24. 멤버 클래스는 되도록 static으로 만들라
    백수의 개발/이펙티브 자바 2019. 10. 12. 12:39

    중첩 클래스

    정의 

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

     

    종류

    1. 정적 멤버 클래스
      • 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다.(나머지는 일반 클래스와 동일)
      • private로 선언하면 바깥 클래스에서만 접근 가능하다.
      • 흔히 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스로 쓰인다.
    2. (비정적) 멤버 클래스
      • 비정적 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 암묵적으로 연결된다.
      • 개념상 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재할 수 있다면 정적 멤버 클래스로 만들어야 한다.
      • 드물게 <바깥 인스턴스의 클래스>.new MemberClass()를 통해 인스턴스를 만들기도 한다.
      • 비정적 멤버 클래스는 어댑터를 정의할 때 자주 쓰인다.
      • 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 정적 멤버 클래스로 만들어라.
    3. 익명 클래스
      • 바깥 클래스의 멤버가 아니다.
      • 쓰이는 시점에 선언과 동시에 인스턴스가 만들어진다.
      • 비정적인 문맥에서 사용될 때만 바깥 클래스의 인스턴스를 참조할 수 있다.
      • 상수 표현을 위해 초기화된 fianl 기본 타입과 문자열 필드만 가질 수 있다.
      • 선언한 지점에서만 인스턴스를 만들 수 있다.
      • instanceof 검사나 클래스의 이름이 필요한 작업을 수행할 수 없다.
      • 여러 인터페이스를 구현할 수 없다.
      • 다른 클래스를 상속할 수 없다.
      • 상위 타입에서 상속한 멤버 외에는 호출할 수 없다.
      • 주 쓰임은 정적 팩터리 메서드이다.
    4. 지역 클래스
      • 멤버 클래스처럼 이름이 있고 반복해서 사용할 수 있다.
      • 비정적 문맥에서 사용될 때만 바깥 인스턴스를 참조할 수 있다.
      • 정적 멤버는 가질 수 없다,
      • 가독성을 위해 짧게 작성해야 한다.

    마무리

    중첩 클래스에는 네가지가 있다.(정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스)

    메서드 밖에서도 사용해야 하거나 메서드 안에 정의하기엔 너무 길다면 멤버 클래스로 만든다.

    멤버 클래스의 인스턴스 각각이 바깥 인스턴스를 참조한다면 비정적으로, 그렇지 않으면 정적으로 만들자.

    중첩 클래스가 한 메서드 안에서만 쓰이면서 그 인스턴스를 생성하는 지점이 단 한 곳이고 해당 타입으로 쓰기에 적합한 클래스나 인터페이스가 이미 있다면 익명 클래스로 만들고, 그렇지 않으면 지역 클래스로 만들자.

    댓글

Designed by Tistory.