중첩 클래스의 종류

image.png

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; 
			}
		}		
}

image.png

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,
	)
}