코틀린의 동반 객체는 클래스 내부에 정의된 객체로서, 해당 클래스의 인스턴스와 무관하게 호출될 수 있는 함수나 프로퍼티를 정의하는 데 사용됩니다. 동반 객체는 클래스의 인스턴스 생성 없이 직접 호출할 수 있으며, 주로 팩토리 메서드나 다양한 유틸리티 메서드를 제공하는 데에 활용됩니다.
동반 객체 정의
class MyClass {
companion object {
// 동반 객체의 멤버(프로퍼티, 함수 등) 정의
val property: Int = 42
fun myFunction() {
println("Function in companion object")
}
}
}
동반 객체 사용
fun main() {
// 동반 객체의 멤버에 접근하기 위해 클래스의 인스턴스를 생성할 필요 없음
println(MyClass.property) // 출력: 42
// 동반 객체의 함수 호출
MyClass.myFunction() // 출력: Function in companion object
}
주의사항
1. 동반 객체의 이름은 생략 가능: 동반 객체의 이름은 Companion으로 지정되어 있습니다. 그러나 생략할 수 있습니다. 생략할 경우에는 Companion으로 암묵적으로 사용됩니다.
class MyClass {
companion object {
// ...
}
}
// 위의 코드에서 companion 키워드를 생략하고 아래와 같이 사용할 수 있음
class MyClass2 {
object {
// ...
}
}
2. 클래스 내부에서 private 접근 제한자 사용 가능: 동반 객체의 멤버는 기본적으로 클래스 내부에서 private으로 접근됩니다.
class MyClass {
companion object {
private val privateProperty: Int = 42
}
fun accessPrivateProperty() {
// 클래스 내부에서는 동반 객체의 private 멤버에 접근 가능
println(MyClass.Companion.privateProperty)
}
}
3. 동반 객체는 인터페이스를 구현할 수 있음: 동반 객체는 클래스처럼 인터페이스를 구현할 수 있습니다.
interface MyInterface {
fun myFunction()
}
class MyClass {
companion object : MyInterface {
override fun myFunction() {
println("Function in companion object")
}
}
}
4. 동반 객체의 확장 함수 및 프로퍼티: 동반 객체에도 확장 함수와 확장 프로퍼티를 정의할 수 있습니다.
class MyClass {
companion object {
// 동반 객체의 확장 함수
fun String.myExtensionFunction() {
println("Extension function for String in companion object")
}
// 동반 객체의 확장 프로퍼티
val String.myExtensionProperty: Int
get() = length
}
}
fun main() {
// 사용
"Hello".myExtensionFunction()
println("World".myExtensionProperty) // 출력: 5
}
동반 객체를 사용하면 클래스의 인스턴스와 관계없이 특정 기능을 제공할 수 있습니다. 주로 팩토리 메서드를 생성하거나 클래스 내부의 상태에 영향을 주지 않고 클래스와 관련된 유틸리티 메서드를 제공하는 데에 활용됩니다.
With ChatGPT