동반 객체의 멤버를 임포트하고 싶을 때는 객체 이름을 명시해야만 한다는 점에 유의하라.
import Application.Companion.create // OK import Application.create // Error
클래스에 동반 객체가 둘 이상 있을 수는 없다.
class Application {
companion object Factory
// error: only one companion object is allowed per class
companion object Utils
}
companion 변경자를 최상위 객체 앞에 붙이거나 다른 객체에 내포된 객체 앞에 붙이는 것은 금지된다. 최상위 객체의 경우 동반 객체를 연결할 클래스 정의가 없기 때문이고, 객체에 내포된 객체의 경우 companion을 붙이는 것이 불필요한 중복이기 때문이다.
자바 vs. 코틀린 코틀린의 동반 객체를 자바의 정적 문맥과 대응하는 것처럼 생각할 수도 있다. 자바 정적 멤버와 마찬가지로 동반 객체의 멤버도 외부 클래스와 똑같은 전역 상태를 공유하며 외부 클래스의 모든 멤버에 멤버 가시성과 무관하게 접근할 수 있다. 하지만 중요한 차이는 코틀린 동반 객체의 문맥은 객체 인스턴스라는 점이다. 이로 인해 자바의 정적 멤버(특히 정적 멤버 클래스)보다 코틀린 동반 객체가 더 유연하다. 코틀린 동반 객체는 다른 상위 타입을 상속할 수도 있고 일반 객체처럼 여기저기에 전달될 수 있기 때문이다. 8장 클래스 계층 이해하기와 11장 도메인 특화 언어에서 동반 객체와 상속 및 코틀린 언어 관습을 조합해 더 표현력이 좋은 코드를 만들어내는 방법을 살펴보겠다.
자바의 static 초기화 블록처럼 동반 객체 안에서도 init 블록을 사용할 수 있다는 점도 알아두라.