더북(TheBook)

4.1.4 내포된 클래스

함수, 프로퍼티, 생성자 외에 코틀린 클래스는 다른 클래스도 멤버로 가질 수 있다. 이런 클래스를 내포된 클래스(nested class)라고 부른다. 예를 하나 살펴보자.

class Person (val id: Id, val age: Int) {
  class Id(val firstName: String, val familyName: String)
  fun showMe() = println("${id.firstName} ${id.familyName}, $age")
}

fun main() {
  val id = Person.Id("John", "Doe")
  val person = Person(id, 25)
  person.showMe()
}

내포된 클래스를 둘러싸고 있는 클래스의 본문 밖에서는 Person.Id처럼 내포된 클래스 이름 앞에 바깥쪽 클래스의 이름을 덧붙여야만 내포된 클래스를 참조할 수 있다는 점에 유의하라.

다른 멤버와 마찬가지로 내포된 클래스에도 여러 가지 가시성을 지정할 수 있다. 내포된 클래스도 자신을 둘러싼 클래스의 멤버이므로 자신을 포함하는 클래스의 비공개 선언에 접근할 수 있다.

class Person (private val id: Id, private val age: Int) {
  class Id(private val firstName: String,
           private val familyName: String) {
    fun nameSake(person: Person) = person.id.firstName == firstName
  }
    // error: cannot access 'familyName': it is private in 'Id'
  fun showMe() = println("${id.firstName} ${id.familyName}, $age")  }

자바 vs. 코틀린 자바와 달리, 바깥쪽 클래스는 자신에게 내포된 클래스의 비공개 멤버에 접근할 수 없다(이전 예제 코드의 오류를 보라).

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.