본문 바로가기
Language/Kotlin

Kotlin Companion Object에 대해

by 시니성 2023. 9. 20.

Kotlin의 companion object는 클래스 내부에 객체를 선언할 수 있게 해주는 매커니즘입니다. Java에서의 static 멤버를 Kotlin에서는 companion object를 통해 표현합니다. 이를 통해, 클래스 자체에 연결된 함수나 프로퍼티를 선언하여 사용할 수 있습니다.

기본 사용법:

class MyClass {
    companion object {
        const val MY_CONSTANT = "Test"

        fun myFunction() {
            println("Called from the companion object!")
        }
    }
}

// 이렇게 사용 가능합니다:
MyClass.myFunction()  // "Called from the companion object!" 출력

여기서 MY_CONSTANTmyFunctionMyClass의 인스턴스를 생성하지 않고 직접 사용할 수 있습니다.

유용하게 사용되는 시나리오:

  1. Factory Method Pattern
    • 객체 생성의 로직이 단순하지 않거나, 객체 생성 전에 어떤 검증이나 처리가 필요할 때 사용합니다.
    • 생성자 대신 companion object 내에 정의된 메소드를 통해 객체를 반환하게 됩니다.
class User private constructor(val name: String, val age: Int) {
    companion object {
        // Factory method
        fun createUser(name: String, age: Int): User? {
            if (age < 0) {
                println("Age cannot be negative!")
                return null
            }
            return User(name, age)
        }
    }
}

// 사용 예시:
val user = User.createUser("John", 25)  // 유효한 사용자
val invalidUser = User.createUser("Doe", -5)  // "Age cannot be negative!" 출력, null 반환
  1. Singleton Pattern
    • 특정 클래스의 인스턴스가 하나만 생성되도록 보장하고, 그 인스턴스에 접근할 수 있는 글로벌 포인트를 제공하려는 디자인 패턴입니다.
    • companion object는 이 패턴을 구현하는 데 매우 유용합니다.
class Database private constructor() {
    init {
        println("Database initialized.")
    }

    companion object {
        // Lazy initialization & thread-safe Singleton instance
        val instance: Database by lazy { Database() }
    }
}

// 사용 예시:
val db1 = Database.instance  // "Database initialized." 출력
val db2 = Database.instance  // 이미 초기화된 인스턴스를 반환하므로 출력 없음
  1. Extension Functions
    • 특정 클래스에 기능을 추가하고 싶지만, 그 클래스의 코드를 수정할 수 없거나 원하지 않는 경우에 사용합니다.
    • companion object에 대한 확장 함수를 정의하여 그 기능을 추가할 수 있습니다.
class MyMath {
    companion object {
        const val PI = 3.14
    }
}

// Companion object에 대한 확장 함수
fun MyMath.Companion.square(value: Int) = value * value

// 사용 예시:
val result = MyMath.square(4)  // 16 반환

결론:

Kotlin의 companion object는 클래스와 연관된 함수나 프로퍼티를 정의하는 강력한 도구입니다. 다양한 디자인 패턴에서의 활용, 특히 객체 생성 로직의 커스터마이징이나 싱글턴 패턴 구현에서 그 유용성을 발휘합니다. 이외에도 다양한 케이스에서 활용될 수 있으므로, Kotlin 개발자라면 companion object의 사용법과 활용 케이스를 잘 알아두면 좋습니다!

'Language > Kotlin' 카테고리의 다른 글

코틀린에서의 `reduce`  (0) 2023.10.13
Kotlin에서의 기본 인자 값과 널 허용성  (0) 2023.10.12
Kotlin의 'All' 함수에 대해  (0) 2023.09.15
Kotlin의 `any` 함수란?  (0) 2023.09.15
[Kotlin Basic]let함수에 대해  (0) 2023.09.15