[Effective Java] static 맴버 클래스를 많이 사용하자. |
-
중첩 클래스(nested class) 혹은 내부 클래스(inner class)는 외곽 클래스(enclosing class)를 지원하는 목적으로만 존재해야 한다.
만일 어떤 중첩 클래스가 일부 다른 분야나 클래스에서도 유용하게 사용된다면 그 클래스는 독립적인 최상위 클래스가 되어야 한다.
-
중첩 클래스는 다음 4가지 종류가 있다.
static 맴버 클래스
static 이 아닌 맴버 클래스
익명 ( anonymous ) 클래스
지역 ( local ) 클래스
-
static 맴버 클래스는 가장 간단한 종류의 중첩 클래스로, 어떤 클래스의 내부에 선언되어 있으며,
그 외곽 클래스의 모든 static 맴버들( private 으로 선언된 것까지도 ) 을 사용할 수 있는 일반 클래스이다.
static 맴버 클래스의 주된 용도는 helper 클래스로서, 외곽 클래스와 함께 사용할 때만 유용하다.
-
static 이 아닌 맴버 클래스의 각 인스턴스는 자신을 포함하는 외곽 클래스의 인스턴스와 은연 중에 연관된다.
this 키워드를 사용해서 외곽 클래스의 인스턴스 참조를 얻을 수 있고,
static 이 아닌 field 와 함수에도 접근할 수 있다.
중첩 클래스의 인스턴스가 외곽 클래스의 인스턴스와 완전 별개도 존재할 수 있다면, 반드시 static 맴버 클래스가 되어야 한다.
그렇지 않으면 시간과 메모리가 더 소비되며, GC 발생 타이밍을 늦추거나 Memory Leak 을 발생시키기도 쉽다.
static 이 아닌 맴버 클래스의 용도 중 하나는 어댑터(adapter) 패턴을 구현하는 것이다.
-
private static 맴버 클래스는 자신의 외곽 클래스가 나타내는 객체의 컴포넌트들을 표현하는 데 주로 사용된다.
-
익명 클래스는 표현식의 중간에 나타나므로 가급적 코드가 짧아야 한다. ( 대략 10라인 이내 ).
아니면 가독성이 떨어진다.
익명 클래스는 함수 객체(function object)를 생성하는데 많이 사용된다.
또한 Runnable, Thread, TimerTask 등의 인스턴스와 같은 프로세스 객체를 생성하는데도 많이 사용된다.
-
지역 클래스는 inner class 중 가장 적게 사용된다.
지역 변수와 동일한 유효 범위를 갖는다.
익명 클래스처럼 코드가 짧아야 한다. ( 가독성 )
-
Inner class 들은 Static 이 아니면 static 변수를 가질 수 없다.
Summary
inner class 는 네 종류가 있다.
중첩 클래스가 메소드 외부에서 접근할 필요가 있거나, 코드가 너무 길어 메소드 내부에 두기가 적합하지 않다면 멤버 클래스를 사용하자.
만일 멤버 클래스의 각 인스턴스가 외곽 클래스의 인스턴스를 참조할 필요가 있다면 static 이 아닌 맴버 클래스로 만들자.
그렇지 않다면 static 으로 만든다.
클래스가 어떤 메소드 내부에서 한 곳에서만 사용된다면 익명 클래스로, 아니면 지역 클래스로 만들자.
'프로그래밍 놀이터 > 디자인 패턴, 리펙토링' 카테고리의 다른 글
[Effective Java] 타입 안전이 보장되는 혼성(heterogeneous) 컨테이너의 사용을 고려하자. (0) | 2016.11.22 |
---|---|
[Effective Java] 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자. (0) | 2016.11.21 |
[Effective Java] 전략을 표현할 때 함수 객체를 사용하자. (0) | 2016.11.15 |
[Effective Java] 태그(tagged) 클래스보다는 클래스 계층을 사용하자. (0) | 2016.11.14 |
[Effective Java] 타입을 정의할 때만 인터페이스를 사용하자. (0) | 2016.11.08 |
댓글