본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] static 맴버 클래스를 많이 사용하자.

by 돼지왕 왕돼지 2016. 11. 17.
반응형

 [Effective Java] static 맴버 클래스를 많이 사용하자.


adapter, Anonymous Class, Effective JAVA, enclosing class, function object, gc 발생 타이밍, Helper, inner class, Local Class, memory leak, Nested Class, non static member class, Private, private static, Runnable, statc 맴버 클래스, static, static member class, static 맴버, static 변수, This, thread, TimerTask, [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 으로 만든다.
클래스가 어떤 메소드 내부에서 한 곳에서만 사용된다면 익명 클래스로, 아니면 지역 클래스로 만들자.





반응형

댓글