코틀린의 Object

오븐·2025년 4월 28일

안드로이드

목록 보기
1/9

여기서는 한 객체를 전역적으로 관리할 수 없나? 생각하다가 object를 찾았다.
해당 키워드는 클래스를 정의함과 동시에 객체를 생성하는 것이다.
즉, 여타 클래스처럼 하나의 클래스로 여러개의 객체를 만들어내는 것이 아니라, 한 클래스에 한 객체로 이곳저곳에서 사용하는 것이다.

다음과 같은 시나리오에 사용된다

  • 싱글턴 패턴 구현

    싱글턴 패턴:
    생성자가 여러 차례 호출되더라도 실제로 생성된 객체는 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 객체를 리턴

  • 팩토리 메서드 생성: 컴패니언 오브젝트를 통해 클래스 수준 함수와 변수를 정의해 인스턴스 생성을 관소화
  • 기존 클래스 동작을 일시적으로 수정: 새 하위 클래스를 생성하지 않고도 기존 클래스의 동작을 수정할 때
  • 타입-세이프 설계: 인터페이스 또는 추상 클래스를 일회성으로 구현 (버튼 클릭 핸들러와 같은 상황에 유용)

선언하는 방법도 다양하다

1. 객체 선언

클래스를 선언하는 동시에 객체를 만든다. 간단하게 싱글톤 디자인을 적용

object DataProviderManager {
    private val providers = mutableListOf<DataProvider>()

    // Registers a new data provider
    fun registerDataProvider(provider: DataProvider) {
        providers.add(provider)
    }

    // Retrieves all registered data providers
    val allDataProviders: Collection<DataProvider> 
        get() = providers
}

단, 객체 생성은 표현이 아니기 때문에 object는 할당할 수 없다.

val myObject = object MySingleton {
    val name = "Singleton"
}

2. data object

data object MyDataObject {
    val number: Int = 3
}

data class와 유사하나, 이 역시 싱글톤 패턴이다. copy() 같은 함수는 사용할 수 없다.

3. 객체 식

fun main(){
    val obj = object{}
}

객체 식 같은 경우에는 재사용되지 않을 때나, 클래스 정의 없이 인터페이스를 상속할 때 사용한다.

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) { /*...*/ }

    override fun mouseEntered(e: MouseEvent) { /*...*/ }
})

4. companion object

class Score {
	companion object {
    	val principle = "Mr. Mike"
    }
}

위와 같이 선언한 경우, principle은 모든 Score의 객체가 공유한다. 즉, principle은 Score의 객체가 모두 같은 값을 가지고 있다.

  • companion object는 클래스 당 최대 하나만
  • 객체를 통해서 접근 X. 클래스를 통해 접근 O

출처:

profile
하루에 한번 정권 찌르기

0개의 댓글