프로그래밍백엔드 개발자

Kotlin에서 companion object란 무엇이며, 그 특징과 제한 사항은 무엇입니까? 컴패니언 객체를 사용하여 팩토리 메소드와 정적 상태를 생성하는 방법은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

Kotlin에서 companion object(companion object)는 companion 키워드로 클래스 내부에 선언된 객체로, Java의 정적 멤버와 유사하게 정적 메소드와 속성을 그룹화할 수 있게 해줍니다. Java의 static과는 달리, Kotlin의 각 companion object는 완전한 객체이며, 바이트코드 수준에서 그 멤버에 대한 접근이 정적으로 컴파일됩니다.

주요 특징 및 제한 사항:

  • 기본 이름 — 명시적으로 지정하지 않으면 객체의 이름은 Companion입니다.
  • Companion object는 모든 인터페이스를 구현할 수 있어, 예를 들어 팩토리 메소드를 만들 때 편리하게 사용할 수 있습니다.
  • Companion object 내에서는 외부 클래스의 프라이빗 멤버에 접근할 수 있습니다.
  • 각 클래스에는 단 하나의 companion object만 존재할 수 있습니다.
  • Companion object의 멤버에 클래스 이름을 통해 정적 멤버처럼 접근하거나 객체의 멤버처럼 접근할 수 있습니다.

예:

class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)

함정 질문.

멀티 스레드 애플리케이션에서 companion object 내부에 상태(예: 가변 변수)를 저장하는 것이 권장되지 않는 이유는 무엇입니까?

예시 있는 답변:

companion object 내부에 가변 상태를 두면, 이는 클래스의 모든 인스턴스와 스레드 간에 공유되므로 추가적인 동기화 없이는 경쟁 상태가 발생하게 됩니다.

class Counter { companion object { var count = 0 fun increment() { count++ } } } Counter.increment() // 동시에 호출 시 경쟁 상태 발생

주제에 대한 세부 사항을 모르는 것에 의한 실제 오류 사례.


이야기

Android 프로젝트에서 개발자들은 디버그 스위치를 관리하기 위해 환경 구성을 companion object 안에 넣었습니다. 이는 서로 다른 프래그먼트가 동일한 글로벌 값을 변경하면서 혼란을 초래하여 비동기 전환 시 예기치 않은 동작이 발생했습니다.


이야기

백엔드에서 일부 기능이 변경 가능한 캐시와 함께 companion object로 옮겨졌습니다. 높은 부하에서 동기화 부족으로 인해 오류 및 데이터 불일치 상태가 발생했습니다.


이야기

초급 개발자가 클래스에서 이 인터페이스를 사용할 수 있다고 생각하며 오직 컴패니언 객체에 대해서만 인터페이스를 구현하려고 했습니다. 결국 그는 클래스를 companion object 대신 전달할 수 없게 되어 문제에 봉착했습니다. 왜냐하면 companion은 클래스와 연결된 유일한 객체이지, 클래스 자체가 아니기 때문입니다.