Language/kotlin

중첩 클래스 다루기

kimjingyu 2023. 5. 22. 22:15
728x90

중첩 클래스의 종류

  • 내부 클래스
    • 외부 클래스를 참조하고 있다.
    • 내부 클래스는 숨겨진 외부 클래스 정보를 가지고있어서 참조를 해지하지 못하는 경우가 발생할 수 있다. 따라서 메모리 누수가 생길 수 있고, 이를 debugging 하기 어렵다.
    • 내부 클래스의 직렬화 형태가 명확하게 정의되지 않아 직렬화에 있어 제한이 있다.
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;
    }
  }

}
public static void main(String[] args) {
    JavaHouse javaHouse = new JavaHouse("서울시");
    System.out.println(javaHouse.getLivingRoom().getAddress());
}
  • static 클래스
    • 외부 클래스를 바로 불러올 수 없다.
    • 클래스 안에 클래스를 만들어야 할때는 static 클래스를 사용해야 한다.
    • Kotlin에서는 이 가이드를 충실하게 따르고 있다.

코틀린의 중첩 클래스와 내부 클래스

  • 자바의 static 중첩 클래스 (default)
    • 기본적으로 바깥 클래스에 대한 연결이 없는 중첩 클래스가 만들어진다.
class House(
    private val address: String,
    private val livingRoo: LivingRoom
) {
    class LivingRoom(
        private var area: Double
    )
}
  • 자바의 내부 클래스
    • 바깥 클래스 참조를 위해 this@바깥클래스를 사용한다.
class House2(
    private val address: String
){
    inner class LivingRoom(
        private val area: Double
    ){
        val address: String
            get() = this@House2.address
    }
}
fun main() {
    println(House2("서울시").LivingRoom(12.0).address)
}

정리

  • 클래스 안의 클래스(default) : 바깥 클래스 참조가 없다. 권장되는 유형
  • 클래스 안의 inner 클래스 : 바깥 클래스 참조가 있다.
728x90