다음 코드에서 firstName과 familyName 프로퍼티는 private이므로 main() 함수에서 이 둘을 볼 수 없다. 반면 fullName()은 public이다.
class Person(private val firstName: String, private val familyName: String) { fun fullName() = "$firstName $familyName" } fun main() { val person = Person("John", "Doe") // error: cannot access 'firstName': it is private in 'Person' println(person.firstName) println(person.fullName()) // Ok }
함수와 프로퍼티, 주생성자, 부생성자에 대해 가시성 변경자를 지원한다. 함수와 프로퍼티, 주생성자/부생성자는 모두 클래스 본문에 정의되거나 주생성자 파라미터로 정의된다. 주생성자의 가시성을 지정하려면 constructor 키워드를 꼭 명시해야 한다.
class Empty private constructor() {
fun showMe() = println("Empty")
}
fun main() {
// error: cannot access '<init>': it is private in 'Empty'
Empty().showMe()
}
Empty 클래스의 유일한 생성자가 private이므로 이 클래스를 클래스 본문 외부에서 인스턴스화 할 수 없다는 점에 유의하라. 이어서 객체에 대해 살펴볼 텐데, 동반 객체(companion object)에서 팩토리 메서드(factory method)를 제공할 때 생성자를 감추는 방법을 어떻게 함께 조합할지 알아보자.