개발하는 두더지

[Effective Java 규칙22] 멤버 클래스는 가능하면 static 으로 선언하라 본문

Java,Android

[Effective Java 규칙22] 멤버 클래스는 가능하면 static 으로 선언하라

덜지 2018. 9. 28. 14:15

[Effective Java 규칙22] 멤버 클래스는 가능하면 static 으로 선언하라

Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.


중첩 클래스에는 4가지 종류가 있다. 정적 멤버 클래스 ( static member class), 비 정적 멤버 클래스 ( nonstatic member class), 익명 클래스(anonymous class), 지역 클래스(inner class)


바깥 클래스 객체에 접근할 필요가 없는 멤버 클래스를 정의할 때는 항상 static을 사용해서 정적 멤버 클래스로 만들어야 한다. 만약 비 정적 멤버 클래스로 만든다면 객체는 내부적으로 바깥 클래스에 대한 참조를 유지하므로 시간과 공간 요구량이 늘어나고 GC 수집이 힘들어진다. 또한 비 정적 멤버 클래스 객체는 바깥 클래스 없이는 생성할 수도 없는 단점이 있다.


멤버 클래스가 API 클래스의 public 이나 protected 멤버인 경우에는 정적 멤버로 만들 것인지 비 정적 멤버로 만들 것인지 더욱 중요하다.

일단 API에 포함되고나면 이진 호환성을 깨지 않고는 다음 릴리즈에 비 정적 멤버 클래스를 정적 멤버 클래스로 바꾸는 방법은 없기 때문이다.


요약하면,

중첩 클래스를 밖에서 사용할 수 있어야 하거나, 메서드 안에 놓기에 너무 길 경우에는 멤버 클래스로 정의한다. 바깥 객체에 대한 참조를 가져야하는 경우에는 비 정적 멤버 클래스로 만들고 그렇지 않으면 정적 멤버 클래스로 만든다. 

중첩 클래스가 특정한 메서드에 속해야하고, 오직 한곳에서만 객체를 생성하며, 해당 중첩 클래스의 특성을 규정하는 자료형이 있다면 익명 클래스로 만든다. 그렇지 않으면 지역 클래스로 만든다.


확실하게 기억해둬야 할 것은 정적 멤버 클래스와 비 정적 멤버 클래스의 차이점이다

정적 멤버 클래스는 바깥 클래스를 참조하지 않고, 비 정적 멤버 클래스는 바깥 클래스를 참조한다.


Comments