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