코틀린의 Companion object는 static 키워드와 다르다.
Companion object와 static 모두 클래스 변수, 메소드 이다.
-> 즉 클래스.메소드가 가능
class MyClass2{
companion object{
val prop = "나는 Companion object의 속성이다."
fun method() = "나는 Companion object의 메소드다."
}
}
fun main(args: Array<String>) {
//사실은 MyClass2.맴버는 MyClass2.Companion.맴버의 축약표현이다.
println(MyClass2.Companion.prop)
println(MyClass2.Companion.method())
}
-> MyClass2.Companion.는 MyClass2.로 줄여서 사용할 수 있다.
class MyClass2{
companion object{
val prop = "나는 Companion object의 속성이다."
fun method() = "나는 Companion object의 메소드다."
}
}
fun main(args: Array<String>) {
println(MyClass2.Companion.prop)
println(MyClass2.Companion.method())
val comp1 = MyClass2.Companion //--(1)
println(comp1.prop)
println(comp1.method())
val comp2 = MyClass2 //--(2)
println(comp2.prop)
println(comp2.method())
}
-> 주석 (1)처럼 MyClass2.Companion을 변수 comp1에 넣어서 사용할 수 있다.(static은 불가능)
class MyClass3{
companion object MyCompanion{ // -- (1)
val prop = "나는 Companion object의 속성이다."
fun method() = "나는 Companion object의 메소드다."
}
}
fun main(args: Array<String>) {
println(MyClass3.MyCompanion.prop) // -- (2)
println(MyClass3.MyCompanion.method())
val comp1 = MyClass3.MyCompanion // -- (3)
println(comp1.prop)
println(comp1.method())
val comp2 = MyClass3 // -- (4)
println(comp2.prop)
println(comp2.method())
val comp3 = MyClass3.Companion // -- (5) 에러발생!!!
println(comp3.prop)
println(comp3.method())
}
-> MyCompanion는 companion object의 이름이고 companion 대신 사용해야한다.
class MyClass5{
companion object{
val prop1 = "나는 Companion object의 속성이다."
fun method1() = "나는 Companion object의 메소드다."
}
companion object{ // -- 에러발생!! Only one companion object is allowed per class
val prop2 = "나는 Companion object의 속성이다."
fun method2() = "나는 Companion object의 메소드다."
}
}
interface MyInterface{
companion object{
val prop = "나는 인터페이스 내의 Companion object의 속성이다."
fun method() = "나는 인터페이스 내의 Companion object의 메소드다."
}
}
fun main(args: Array<String>) {
println(MyInterface.prop)
println(MyInterface.method())
val comp1 = MyInterface.Companion
println(comp1.prop)
println(comp1.method())
val comp2 = MyInterface
println(comp2.prop)
println(comp2.method())
}