Kotlin에서 companion object(companion object)는 companion 키워드로 클래스 내부에 선언된 객체로, Java의 정적 멤버와 유사하게 정적 메소드와 속성을 그룹화할 수 있게 해줍니다. Java의 static과는 달리, Kotlin의 각 companion object는 완전한 객체이며, 바이트코드 수준에서 그 멤버에 대한 접근이 정적으로 컴파일됩니다.
Companion입니다.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은 클래스와 연결된 유일한 객체이지, 클래스 자체가 아니기 때문입니다.