Kotlin Companion
Kotlin Companion
정적 멤버
- 클래스를 정의할 때 변수나 메서드를 정적 멤버로 정의하면 객체를 생성하지 않고 사용할 수 있다.
- Java 에서는 static 을 사용하는데, Kotlin은 Companion 객체를 사용한다.
- 같은 클래스를 통해서 만든 객체들이 같은 멤버 변수를 사용한다면 공통적으로 한가지 값만 사용할 때 정적 멤버를 사용한다.
fun main() {
TestClass.testFun1() // Error
}
class TestClass {
val a1 = 100
fun testFun1() {
println("testFun1")
}
}
Kotlin: Unresolved reference: testFun1
Class 를 정의하고 그 Class 에 대한 객체 (Instance)를 생성하지 않고 함수를 사용하고자 할 때 에러가 발생한다.
fun main() {
var obj1 = TestClass()
println(obj1.a1)
obj1.testFun1()
println(obj1.a2) // Error
}
class TestClass {
var a1 = 100
companion object {
var a2 = 1000
fun testFun2() {
println("testFun2")
}
}
fun testFun1() {
println("testFun1")
}
}
Kotlin: Unresolved reference: a2
companion object 로 정의된 a2 멤버변수는 객체 참조 변수를 통해서 접근할 수 없다.
fun main() {
var obj1 = TestClass()
println(obj1.a1)
obj1.testFun1()
println(TestClass.a2) // Normal
}
class TestClass {
var a1 = 100
companion object {
var a2 = 1000
fun testFun2() {
println("testFun2")
}
}
fun testFun1() {
println("testFun1")
}
}
companion object 로 정의된 a2 멤버변수는 클래스 이름을 통해서 접근 가능하다. companion object 는 객체를 생성하지 않고 사용이 가능하기 때문에 Kotlin 에서는 객체 참조변수가 아니라 클래스 이름으로 해당 멤버변수를 참조하도록 해야 한다.
class TestClass {
var a1 = 100
companion object {
var a2 = 1000
fun testFun2() {
println("testFun2")
println(a1) // Error
}
}
fun testFun1() {
println("testFun1")
}
}
Kotlin: Unresolved reference: a1
또한, companion 객체에서 클래스 멤버 변수도 참조가 불가능하다. 클래스 멤버 변수는 객체가 생성된 이후에 사용가능한 변수인데, companion 객체가 사용될 시점에 객체가 생성됨을 보장할 수 없으므로 해당 변수는 사용이 불가능하다.
Companion 멤버는 객체 생성 없이 클래스의 이름을 통해 접근해 사용한다.
댓글
댓글 쓰기