brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Apr 16. 2018

클래스와 인터페이스

#22 static 멤버 클래스를 많이 이용하자

Effective Java - 클래스와 인터페이스


#22 static 멤버 클래스를 많이 이용하자


#01 Nested classes


중첩(nested) 클래스는 다른 내부에 정의된 클래스를 말합니다.

중첩 클래스는 외곽(enclosing) 클래스를 지원하는 목적으로만 생성해야 합니다.

내부(inner)  클래스라고도 부르는데 static 멤버 클래스, static이 아닌 멤버 클래스, 익명(anonymous) 클래스, 지역(local) 클래스 4가지가 있습니다.


이 중첩 클래스들을 언제 어떻게 이용하는지에 대해 알아보겠습니다.




#01 static 멤버 클래스


#02 static 멤버 클래스

static 멤버 클래스는 자신의 외곽 클래스의 모든 static 멤버를 이용할 수 있습니다.

static 멤버 클래스는 외곽 클래스에 대해 암시적으로 참조가 이루어지지 않기 때문에 불필요한 메모리 낭비나 메모리 릭이 발생이 적습니다. (외곽 클래스와 별개로 존재)


주로 외곽 클래스의 helper 클래스로 이용할 수 있는데, 안드로이드에서는 AsyncTask 이렇게 종종 썼었습니다.

좀 더 자세한 내용은 아래 링크를 참고해 주시기 바랍니다.

https://brunch.co.kr/@oemilk/47




#02 static이 아닌 멤버 클래스


#03 static이 아닌 멤버 클래스


static이 아닌 멤버 클래스는 자신의 외곽 클래스의 모든 static이 아닌 멤버를 이용할 수 있습니다.

static이 아닌 멤버 클래스는 외곽 클래스에 대해 암시적으로 참조가 이루어지기 때문에 불필요한 메모리 낭비나 메모리 릭이 발생할 수 있습니다.


Adapter 패턴에 쓰일 수 있으며, 아래 코드를 보면 컬렉션 인터페이스를 구현하는 클래스에서 static이 아닌 멤버 클래스를 이용해 자신들의 순환자(interator)를 구현하고 있습니다.

#04 static이 아닌 멤버 클래스의 이용 예




#03 익명(anonymous) 클래스


#05 익명 클래스

익명 클래스는 말 그대로 이름이 없는 클래스입니다.

사용 시점에 선언과 인스턴스 생성이 동시에 이루어지고, 외곽 클래스의 멤버가 아닌 적합한 어디든 나올 수 있습니다.


익명 클래스는 함수 객체를 생성하는데 많이 이용됩니다.

위에 나타난 코드대로, String 배열을 정렬할 때 Comparator 익명 클래스를 이용합니다.

이외에도 Runnable, Thread, TimeTask 등의 프로세스 객체를 생성하는데도 많이 이용합니다.




#04 지역(local) 클래스


#06 지역 클래스


지역 클래스는 지역 변수가 선언될 수 있는 곳에서 쓰이는 클래스입니다.

다른 지역 변수처럼 해당 메서드나 블록 안에서만 유효하고, 다른 중첩 클래스와 같은 속성을 가집니다.




만약 멤버 클래스의 각 인스턴스가 외곽 클래스의 인스턴스를 참조할 필요가 있다면 static 이 아닌 멤버 클래스, 그렇지 않다면 static으로 만들어야 합니다.
클래스가 어떤 메서드 내부에서 한 곳에서만 사용된다면 익명 클래스로, 아니면 지역 클래스로 만들어야 합니다.




매거진의 이전글 클래스와 인터페이스
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari