중첩 클래스의 종류

- Static을 사용하는 중첩 클래스 : 클래스 안에 static을 붙인 클래스로 밖의 클래스 직접 참조 불가능
- 내부 클래스 : 클래스 안의 클래스로 밖의 클래스 직접 참조 가능
- 지역 클래스 : 메소드 내부에 클래스를 정의
- 익명 클래스 : 특정 인터페이스나 클래스를 상속받은 구현체를 일회성으로 사용할 때 쓰는 클래스
public class JavaHouse {
private String address;
private LivingRoom livingRoom;
public JavaHouse(String address) {
this.address = address;
this.livingRoom = new LivingRoom(10);
}
public LivingRoom getLivingRoom() {
return livingRoom;
}
public class LivingRoom {
private double area;
public LivingRoom(double area) {
this.area = area;
}
public String getAddress() {
return JavaHouse.this.address;
}
}
}
- return JavaHouse.this.address; 코드를 보면 바깥 클래스와 연결되어 있음을 알 수 있음
- LivingRoom 클래스를 static 으로 선언하면 바깥 클래스를 바로 불러올 수 없다는 컴파일 에러가 발생함

- 내부 클래스와 static 내부 클래스의 차이는 바깥 클래스와 연결되었냐의 차이 (빨간 화살표)
Effective Java 3rd Edition – Item24, Item86
1. 내부 클래스는 숨겨진 외부 클래스 정보를 가지고 있어, 참조를 해지하지 못하는 경우 메모리 누수가 생길 수 있고, 이를 디버깅 하기 어렵다.
2. 내부 클래스의 직렬화 형태가 명확하게 정의되지 않아 직렬화에 있어 제한이 있다.
⇒ Java에서는 클래스 안에 클래스를 만들 때 static 클래스를 만드는 것을 권장하고 있고, Kotlin에서는 이러한 가이드를 충실히 따르고 있음
코틀린의 중첩 클래스와 내부 클래스
Java의 static 중첩 클래스(권장)
class House(
var address: String,
var livingRoom: LivingRoom = LivingRoom(10.0)
) {
class LivingRoom(
private var area: Double,
)
}