안드로이드

Object 와 Companion Object 의 차이점에 대해

2023. 4. 9. 22:29

Kotlin 에선 Object 선언을 통해 싱글톤 패턴을 구현할 수 있다.

object SampleObject {
	private const val TEMP = ""
}

위 샘플 코드와 같이 싱글톤으로 객체를 생성하고 싶은 클래스에서 object 구문을 이용해 간편하게 싱글톤 패턴을 이용할 수 있는데,

이와 비슷하게 생긴 companion object 라는 녀석이 있다.

 

companion object 의 사용 방식은 object 와 유사한데, 아래처럼 이용할 수 있다.

SampleClass()
{
	companion object {
    	private const val TEMP = ""
    }
}

사용 방법에서의 object 와 가장 큰 차이점을 꼽자면, object 는 클래스 외부에서 선언하지만 companion object 는 생성자 없이 클래스 내부에서 선언된다는 점을 꼽을 수 있다.

 

클래서 내부에서 선언되기 때문에, 당연히 클래스의 객체가 새로 생성되면 companion object 내부 객체들도 새로 생성되어 기존에 생성된 객체와 다른 주소값을 갖게 된다.

 

그럼 차이점을 정리해보자.

 

1. 객체 초기화 시점

    - object : object 클래스 내부 함수가 호출될 때

    - companion object : 속해있는 클래스가 로드될 때 (객체 생성 시)

 

2. 싱글톤 객체 선언 범위

    - object : object 클래스 내부 객체 모두

    - companion object : 클래스 내부 companion object 구문으로 감싸진 일부 객체

 

3. Thread Safe 한가?

    - object : Yes. jvm 내부적으로 객체 동시 생성을 방지함

    - companion object: NO. 클래스의 객체가 여러 개 생성되면 내부 객체 또한 여러 개 생성됨

 

아무래도 객체 초기화 시점이 다르기 때문에 상황에 맞게 사용할 수 있을 것 같다.

 

클래스 로드에 대해 공부하다 보니 jvm 의 클래스 로더에 대해서도 알게 되었는데 다음번엔 이를 주제로도 글을 작성해 봐야겠다.