공부하는 스누피

[Java] 멤버 클래스 / 중첩 클래스 (nested class) 본문

Languages/Java

[Java] 멤버 클래스 / 중첩 클래스 (nested class)

커피맛스누피 2021. 3. 6. 20:52

멤버 클래스(member class) / 중첩 클래스(nested class)

  • 다른 클래스 안에 정의된 클래스.
  • 자신을 감싼 outer class에서만 쓰여야 하고, 그 외에 쓰임새가 있다면 top-level 클래스로 만들어야 한다. (클래스 파일 하나 더 만들란 얘기다.)
  • 종류: static 멤버 클래스, non-static 멤버 클래스, 익명 클래스, 지역 클래스
  • static 멤버 클래스를 제외한 나머지는 다 inner class에 해당한다.

정적 멤버 클래스 (static member class)

  • 다른 클래스 안에 선언되고, outer 클래스의 private 멤버에도 접근할 수 있다.
  • 바깥 인스턴스와 독립적으로 존재할 수 있다.
  • 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 정적 멤버 클래스로 만들어야 한다. (static 안붙이면 인스턴스마다 참조 생겨서 비효율적임 + GC가 찾지 못해서 메모리 누수 생김)
  • private 정적 멤버 클래스는 outer class가 표현하는 객체의 구성요소를 나타낼 때 쓴다.

비정적 멤버 클래스 (non-static member class)

  • outer class의 인스턴스와 암묵적으로 연결된다.
  • this로 outer class의 인스턴스를 호출할 수도 있다.
  • 바깥 인스턴스 없이는 생성할 수 없다.
  • 어댑터를 정의할 때 자주 쓰인다.

익명 클래스(anonymous class)

  • outer class의 멤버가 아니다.
  • 선언과 동시에 인스턴스가 만들어진다.
  • instanceof나 클래스의 이름이 필요한 작업은 수행할 수 없다.
  • 여러 인터페이스를 구현할 수 없다.
  • 인터페이스 구현과 상속을 동시에 할 수 없다.
  • 10줄 이하가 권장된다.
  • 정적 팩터리 메서드를 구현할 때 쓰인다.

지역 클래스(local class)

  • 지역변수를 선언할 수 있는 곳이면 어디든 선언할 수 있다.
  • scope도 지역변수와 동일하다.
  • 이름이 있다.
  • static member는 가질 수 없다.
  • 익명클래스가 여러 번 쓰일 경우 지역 클래스로 만들자.

 

 

 

 

(참고)

Effective Java 3/E (2018). Joshua B(이복연 옮김). 프로그래밍 인사이트  

stackoverflow.com/questions/30111984/are-nested-classes-and-member-classes-the-same-thing

 

Are nested classes and member classes the same thing?

Can the Java terms nested class and member class be used interchangeably or not? From the JLS: A nested class is any class whose declaration occurs within the body of another class or interface. [...

stackoverflow.com

 

Comments