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 멤버는 객체 생성 없이 클래스의 이름을 통해 접근해 사용한다.



댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super