공부하는 스누피
[Java] 멤버 클래스 / 중첩 클래스 (nested class) 본문
멤버 클래스(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
'Languages > Java' 카테고리의 다른 글
[Java] 람다식 Lambda (0) | 2021.04.04 |
---|---|
[Java] 와일드 카드 (Wildcards) (0) | 2021.03.14 |
[Java] equals()와 hashCode() (0) | 2021.02.27 |
[디자인 패턴] 자바의 싱글턴(Singleton) (0) | 2021.02.16 |
[디자인 패턴] 정적 팩터리 메서드 (static factory method) (0) | 2021.02.15 |
Comments