반응형
1. 개요
코틀린의 Companion object는 static 키워드와 다르다.
1) 같은점
Companion object와 static 모두 클래스 변수, 메소드 이다.
-> 즉 클래스.메소드가 가능
2) 다른점
클래스명.companion은 클래스명만으로도 사용가능
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.로 줄여서 사용할 수 있다.
companion object는 객체이다
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은 불가능)
companion에 이름을 지을 수 있다
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 대신 사용해야한다.
클래스 내에 companion object는 하나만 쓸 수 있다
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())
}
Reference
반응형
'Android > Android Java-Kotlin' 카테고리의 다른 글
[Android Java] 비동기 Handler, Timer, Coroutine, RxJava, RxKotlin 특징 및 차이 (0) | 2023.12.18 |
---|---|
[Android Java Kotlin] equals와 ==의 차이(===) (0) | 2023.10.26 |
[Android Java Kotlin] List vs Array vs MutableList vs ArrayList vs LinkedList (0) | 2023.10.24 |
[Android Java Kotlin] View 숨기기 (0) | 2023.10.23 |