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_CONSTANT
와 myFunction
은 MyClass
의 인스턴스를 생성하지 않고 직접 사용할 수 있습니다.
유용하게 사용되는 시나리오:
- 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 반환
- 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 // 이미 초기화된 인스턴스를 반환하므로 출력 없음
- 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
의 사용법과 활용 케이스를 잘 알아두면 좋습니다!
728x90
'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 |