Effective Java - 클래스와 인터페이스(5)

SeungHyuk Shin·2021년 9월 28일
0

Effective Java

목록 보기
12/26
post-thumbnail

[아이템 24]. 멤버 클래스는 되도록 static으로 만들라


중첩클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다.

중첩 클래스의 종류는 총 네가지다.

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

이 중 첫번째를 제외한 나머지는 내부 클래스(inner class)에 해당한다.

정적 멤버 클래스

정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고는 일반 클래스와 똑같다. 정적 멤버 클래스는 바깥 클래스와 함께 쓰이는 public 도우미 클래스로 쓰인다.

비정적 클래스는 암묵적으로 바깥 클래스와 연결되지만, 개념상 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재 할수 있다면 정적 멤버 클래스로 만들어야 한다.

비정적 멤버 클래스

대게 비정적 멤버 클래스는 바깥 클래스의 인스턴스 메소드에서 인스턴스화 되며 그 관계가 확립이 된다.
드물게 바깥 클래스의 인스턴스.new 비정적클래스를 통해 생성하기도 하나, 이는 비용과 생성시간 측면에서 좋지 못하다.

예상할 수 있듯, 이관계 정보는 비정적 멤버 클래스의 인스턴스 안에 만들어져 메모리공간을 차지하며, 생성 시간도 더 걸린다.

이렇게 생성할 수 있지만 되도록 피하도록 하자.

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

결론으로 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스를 만들자.

익명 클래스

익명 클래스는 바깥 클래스의 멤버도 아니며, 멤버와 달리 쓰이는 시점에 선언과 동시에 인스턴스가 만들어진다. 코드의 어디서든지 만들수 있으며, 오직 비정적인 문맥에서 사용될때만 바깥 클래스의 인스턴스를 참조 할 수 있다.

익명클래스는 응용하는데는 제약이 많은편이다.

  1. 선언한 지점에서만 인스턴스를 만들수 있다.
  2. instanceof 검사, 클래스의 이름이 필요한 작업을 수행할 수 없다.
  3. 여러 인터페이스를 구현할 수 없으며 다른 클래스를 상속 할 수 도 없다.
  4. 익명클래스가 상위 타입에서 상속한 멤버 외에는 호출할 수 없다.
  5. 가독성이 떨어진다.

지역 클래스

지역 클래스는 지역변수를 선언할 수 있는 곳이라면 어디서든 선언할 수 있다. 그에 따라 유효 범위도 지역변수와 같다.

다른 중첩 클래스들의 공통점을 하나씩 가지고 있는데

  1. 멤버 클래스처럼 이름을 가질 수 있고 반복해서 사용할 수 있다.
  2. 비정적 문맥에서 사용될 때만 바깥 인스턴스를 참조할 수 있다.
  3. 정적 멤버는 가질 수 없으며, 가독성을 위해 짧게(10줄이하)로 작성되어야 한다.

람다(자바 7)이 나오기전에는 자주 사용되었다. 지금은 팩터리 메서드(아이템 21)를 구현할때 사용된다

멤버 클래스의 인스턴스가 바깥 인스턴스를 참조한다면 비정적으로, 그렇지 않으면 정적으로 만들자. 중첩 클래스가 한 메서드 안에서만 쓰이면서 인스턴스를 생성하는 지점이 단 한곳이고 적합한 클래스나 인터페이스가 있다면 익명 클래스로, 그렇지 않으면 지역 클래스로 만들자.

0개의 댓글