더북(TheBook)

4.4.2 동반 객체

내포된 클래스와 마찬가지로 내포 객체도 인스턴스가 생기면 자신을 둘러싼 클래스의 비공개 멤버에 접근할 수 있다. 이런 특성은 예를 들어 팩토리 디자인 패턴을 쉽게 구현하는 경우 유용하게 활용할 수 있다. 생성자를 직접 사용하고 싶지 않을 때가 있다. 예를 들어 생성자를 사용하면 어떤 사전 검사 결과에 따라 널을 반환하거나 (같은 상위 타입에 속하는) 다른 타입의 객체를 반환할 수 없다. 생성자는 항상 자신이 정의된 클래스의 객체를 반환하거나 예외를 던질 수만 있기 때문이다. 이를 해결하는 방법은 생성자를 비공개로 지정해 클래스 외부에서 사용할 수 없게 한 다음, 내포된 객체에 팩토리 메서드 역할을 하는 함수를 정의하고 그 함수 안에서 필요에 따라 객체의 생성자를 호출하는 것이다.

class Application private constructor(val name: String) {
  object Factory {
    fun create(args: Array<String>): Application? {
      val name = args.firstOrNull() ?: return null
      return Application(name)
    }
  }
}

fun main(args: Array<String>) {
  // 직접 생성자를 호출하도록 허용하지 않음
  // val app = Application(name)
  val app = Application.Factory.create(args) ?: return
  println("Application started: ${app.name}")
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.