ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 중첩클래스의 쓰임 > 이펙티브 자바 아이템 24
    BackEnd/자바 2020. 12. 26. 13:25


    중첩클래스에는 정적 멤버 클래스, 비정적 멤버 클래스,익명클래스,지역클래스 네가지이다. 첫번째를 제외한 나머지는 내부클래스에 해당한다.

    비정적 멤버 클래스의 인스턴스는 바깐 클래스의 인스턴스와 암묵적으로 연결된다.
    그래서 비정적 멤버 클래스의 인스턴스 메서드에서 정규화된 this 를 사용해 바깥 인스턴스의 메서드를 호출하거나 바깥 인스턴스의 참조를 가져올 수 있다.
    정규화된 this ? 클래스명.this 바깥클래스의 이름을 명시하는 용법

    바깥 클래스로의 숨은 외부 참조를 갖는 것은 시간과 공간이 소비되고, GC가 바깥클래스의 인스턴스를 수거하지 못해 메모리 누수가 생길 수 있다.

    비정적 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없다. 
    드물게 직접 바깥 인스턴스 클래스.new 내부클래스를 호출해 수동으로 만들지만
    이 관계 정보는 비정적 멤버클래스의 인스턴스안에 만들어져 메모리 공간을 차지하며 생성시간도 더 걸린다.

    따라서 개념상 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재할 수 있다면 정적 멤버 클래스로 만들어야한다.

    비정적 멤버 클래스는 어댑터를 생성할 때 자주 쓰인다.
    어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 뷰로 사용한다.

    Set 안에 Iteraroe

    멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static 을 붙여 정적으로 만들자.
    private 정적 멤버 클래스는 흔히 바깥 클래스가 표현하는 객체의 한 부분을 나타낼 때 쓴다.

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

    익명클래스는 바깥 클래스의 멤버가 아니다.쓰이는 시점에 선언과 동시에 인스턴스가 만들어진다.
    오직 비정적인 문맥에서 사용될 때만 바깥 클래스의 인스턴스를 참조할 수 있다. 
    정적 문맥에서라도 상수 변수(초기화된 final) 이외의 정적멤버는 가질 수 없다.
     
    내부클래스도 익명클래스처럼 비정적인 문맥에서 사용될 때만 바깥 클래스의 인스턴스를 참조할 수 있고,정적 멤버는 가질 수 없다.
    가독성을 위해 짧게 작성해야한다.

    반응형

    'BackEnd > 자바' 카테고리의 다른 글

    인터페이스  (0) 2021.01.09
    자바 기초 (패키지, import , classpath, 접근제어자)  (0) 2021.01.01
    상속 , dynamic dispatch  (0) 2020.12.26
    프록시 패턴  (0) 2020.12.20
    JVM, JRE, JDK, 메모리  (0) 2020.12.14
Designed by Tistory.