면접 질문실전 질문꼬리 질문

코틀린의 Companion Object

skydovesJaewoong Eum (skydoves)||7분 소요

코틀린의 Companion Object

Kotlin에서 companion object는 클래스 내부에 companion object 키워드를 사용하여 선언하는 싱글톤(singleton) 객체입니다. companion object의 멤버는 특정 인스턴스가 아닌 클래스 자체에 속하며, Java의 static 멤버와 유사한 역할을 수행하지만 훨씬 더 강력한 기능을 제공합니다. companion object는 인터페이스를 구현할 수 있고, 상태를 보유할 수 있으며, 다형성(polymorphism)에도 참여할 수 있습니다.

면접에서 companion object에 대한 질문은 자바와 코틀린의 설계 철학 차이를 이해하고 있는지를 평가하는 중요한 주제입니다. 단순히 "Java의 static 대신 쓰는 것"이라는 피상적인 답변보다는, 바이트코드 수준의 동작 원리와 실무 활용 패턴까지 설명할 수 있어야 좋은 인상을 남길 수 있습니다. 이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • companion object가 Java의 static 멤버와 어떻게 다른지 설명하는 방법
  • companion object가 바이트코드로 어떻게 컴파일되는지에 대한 이해
  • 팩토리 메서드, 상수 정의, 확장 함수에 companion object를 활용하는 방법
  • companion object와 최상위(top-level) 선언 중 어느 쪽이 적합한지 판단하는 기준
  • companion object와 직렬화(serialization) 및 의존성 주입(dependency injection) 프레임워크의 상호작용

Companion Object와 Static 멤버의 차이

Java에서는 static 키워드를 사용하여 필드와 메서드를 인스턴스가 아닌 클래스 자체에 연결합니다. 반면 Kotlin은 static 키워드를 완전히 제거하고 companion object로 대체하는 설계를 채택했습니다. 가장 핵심적인 차이점은 companion object가 **실제 객체(real object)**라는 점입니다. 클래스를 가지며, 인터페이스를 구현할 수 있고, 값으로 전달할 수도 있습니다.

interface Factory<T> {
    fun create(): T
}

class User(val name: String) {
    companion object : Factory<User> {
        override fun create(): User = User("default")
    }
}

// User의 companion object를 Factory<User> 타입 변수에 할당
val factory: Factory<User> = User

위 예제에서 User.CompanionFactory<User> 인터페이스를 구현하고 있습니다. UserFactory<User> 타입의 변수에 할당할 수 있으며, 이때 User는 자동으로 해당 companion object로 해석됩니다. Java의 static 멤버는 어떠한 객체에도 속하지 않으므로 이와 같은 동작 자체가 불가능합니다. 이 차이야말로 Kotlin이 static을 제거하고 companion object를 도입한 핵심 이유이며, 면접에서도 이 부분을 명확히 설명할 수 있어야 좋은 평가를 받을 수 있습니다.

바이트코드 표현

Kotlin 컴파일러는 companion object를 포함하는 클래스 내부에 Companion이라는 이름의 중첩 클래스(nested class)를 생성합니다. companion object의 멤버들은 이 중첩 클래스의 메서드로 변환되며, 외부 클래스에는 싱글톤 인스턴스를 보관하는 static 필드인 Companion이 추가됩니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기