티스토리 뷰

반응형

Kotlin의 object는 싱글톤 패턴을 구현하는 방법이다.

Kotlin에서 object는 객체 지향 프로그래밍에서 싱글톤 패턴을 구현하는 방법 중 하나입니다. 이를 통해 오직 하나의 객체만 생성되어 사용될 수 있도록 보장할 수 있습니다.

object를 사용하면 클래스 정의와 동시에 객체를 생성할 수 있습니다. 이 객체는 해당 클래스의 인스턴스이며, 클래스의 인스턴스 메서드와 프로퍼티에 접근할 수 있습니다. 예를 들어, 다음과 같은 코드를 작성할 수 있습니다.

 

object MySingleton {
    fun doSomething() {
        // ...
    }
}

fun main() {
    MySingleton.doSomething()
}

 

위 코드에서 MySingleton이라는 이름의 싱글톤 객체를 정의하고 있습니다. doSomething 메서드를 호출할 때에는 MySingleton.doSomething() 형태로 호출하면 됩니다.

 

companion object 사용해 Java의 static 변수, 함수 만들기

Kotlin의 object는 자바에서의 static과 비슷한 역할을 수행할 수도 있습니다. 예를 들어, companion object를 사용하여 클래스 수준의 정적 메서드와 프로퍼티를 정의할 수 있습니다.

 

class MyClass {
    companion object {
        const val SOME_CONSTANT = "some value"
        fun doSomething() {
            // ...
        }
    }
}

fun main() {
    println(MyClass.SOME_CONSTANT)
    MyClass.doSomething()
}

 

위 코드에서 companion object를 사용하여 SOME_CONSTANT와 doSomething을 MyClass의 정적 멤버로 만들어줍니다. companion object는 클래스 이름으로 접근할 수 있으며, 클래스와 함께 초기화됩니다.

 

object는 그 자체로 싱글톤 객체를 가리키는 변수이기 때문에 인자로 전달할 수 있다

Kotlin의 object는 다른 객체와 마찬가지로 함수 인자로 전달하거나 반환할 수 있습니다. 이를 통해 함수나 메서드에서 싱글톤 객체를 사용할 수 있습니다.

fun doSomethingWithSingleton(singleton: MySingleton) {
    singleton.doSomething()
}

fun main() {
    val mySingleton = MySingleton
    doSomethingWithSingleton(mySingleton)
}

위 코드에서 doSomethingWithSingleton 함수는 MySingleton 객체를 인자로 받아 doSomething 메서드를 호출합니다. main 함수에서 MySingleton을 생성하여 이를 doSomethingWithSingleton 함수에 전달하고 있습니다.

Kotlin의 object를 사용하면 싱글톤 패턴을 구현하는 것이 쉬워집니다. 이를 통해 코드의 중복을 줄이고 효율적인 메모리 사용이 가능해집니다. 하지만 모든 경우에 싱글톤 패턴을 사용하는 것이 좋은 것은 아니므로 신중하게 판단해야 합니다.

 

object의 초기화 시점

Kotlin의 object를 호출하면 해당 객체가 생성되고 초기화됩니다. 이때 초기화는 첫 번째 접근 시점에 이루어지며, 이전에 초기화되었다면 다시 초기화되지 않습니다.

Kotlin에서는 object가 클래스의 정적 멤버와 함께 초기화됩니다. 즉, 클래스가 로드될 때 object가 생성되고 초기화됩니다. 이때 object는 companion object일 수도 있고, 단순히 object일 수도 있습니다. 이에 대한 글은 아래 페이지의 가장 아래쪽에서 다음과 같이 적힌 것에서 확인됩니다.

 

A companion object is initialized when the corresponding class is loaded that matches the semantics of a Java static initializer.
 

Object expressions and declarations | Kotlin

 

kotlinlang.org

 

예를 들어, 다음과 같은 코드를 작성해보겠습니다.

class MyClass {
    companion object {
        val message = "Hello, world!"

        init {
            println("Initializing companion object")
        }
    }
}

fun main() {
    println("Before accessing companion object")
    println(MyClass.message)
    println("After accessing companion object")
}

위 코드에서 MyClass는 companion object를 가지고 있습니다. message는 companion object의 프로퍼티이며, init 블록에서 초기화됩니다.

main 함수에서 MyClass.message를 호출하면 companion object가 초기화됩니다. 이때 init 블록이 실행되며, "Initializing companion object" 메시지가 출력됩니다. 이후 message 프로퍼티에 접근하여 "Hello, world!" 문자열이 출력됩니다.

따라서 Kotlin의 object는 해당 객체가 최초로 접근될 때 생성되고 초기화됩니다. 초기화는 클래스가 로드될 때 이루어지며, 이전에 초기화되었다면 다시 초기화되지 않습니다. 

반응형
댓글