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

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