여기서는 한 객체를 전역적으로 관리할 수 없나? 생각하다가 object를 찾았다.
해당 키워드는 클래스를 정의함과 동시에 객체를 생성하는 것이다.
즉, 여타 클래스처럼 하나의 클래스로 여러개의 객체를 만들어내는 것이 아니라, 한 클래스에 한 객체로 이곳저곳에서 사용하는 것이다.
다음과 같은 시나리오에 사용된다
싱글턴 패턴:
생성자가 여러 차례 호출되더라도 실제로 생성된 객체는 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 객체를 리턴
선언하는 방법도 다양하다
클래스를 선언하는 동시에 객체를 만든다. 간단하게 싱글톤 디자인을 적용
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"
}
data object MyDataObject {
val number: Int = 3
}
data class와 유사하나, 이 역시 싱글톤 패턴이다. copy() 같은 함수는 사용할 수 없다.
fun main(){
val obj = object{}
}
객체 식 같은 경우에는 재사용되지 않을 때나, 클래스 정의 없이 인터페이스를 상속할 때 사용한다.
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { /*...*/ }
override fun mouseEntered(e: MouseEvent) { /*...*/ }
})
class Score {
companion object {
val principle = "Mr. Mike"
}
}
위와 같이 선언한 경우, principle은 모든 Score의 객체가 공유한다. 즉, principle은 Score의 객체가 모두 같은 값을 가지고 있다.
출처: