Companion Object
클래스 안에 존재하는 SingleTon Object
Comapnion이라는 이름을 가진 static Singletone
companion keyword는 그냥 Companion이란 이름을 갖는 클래스 객체를 가리키는 shortcut 역할을 할 뿐.
companion object 내에 생성된 변수, 메소드는 부모 클래스의 static 맴버가된다.
class - companion object는 1:1 매칭 (오로지 1개씩 선언 가능)
<예제>
class ToBeCalled {
companion object Test {
val someInteger: Int = 10
fun callMe() = println("You are calling me :)")
}
}
fun main(args: Array<String>) {
// Calling Companion object member (it's like a static )
// without constructor & instanciation
print(ToBeCalled.someInteger)
}
JvmStatic + JvmField
Java에서도 적용하기 위해서 사용한다.
@JvmField // const 사용 불가능
@JvmStatic // const 사용 가능
class ToBeCalled {
companion object Test {
val someInteger: Int = 10
// 단순히 companion 키워드만 사용하면 Java에서는 사용할 수 없음.
// const keyword 사용 가능(member field type is primitive or String) => @JvmStatic
// const kewyrod 불가능 => @JvmField
@JvmStatic fun callMe() = println("You are calling me :)")
}
}
fun main(args: Array<String>) {
// Calling Companion object member (it's like a static )
// without constructor & instanciation
print(ToBeCalled.someInteger)
}
when to use?
- Factory Method Delation of Class
- class에 종속되는 개념의 상수정의
일반 object singleton 패턴 == public final class (in java)
object는 익명객체 정의시 사용되는데
object로 선언될 경우 내부적으로는 interface에 등록된 함수에 대한
public static final 함수가 등록됨.
when to use?
- 한번만 사용되고 재사용 되지 않는경우. ex) Password 보안성 TextWatcher (정규식에 의한 형식 검사)
- 싱글턴 클래스 생성
what's Singleton Pattern?
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 메모리에 instance를 만들어 사용하는 디자인패턴. 생성후 기존 instance를 재사용한다.
use Singleton Pattern | Don't use Singleton Pattern |
|
|
[Reference]
https://medium.com/@joongwon/kotlin-deep-dive-into-object-a0d6dc649736
https://blog.mindorks.com/companion-object-in-kotlin
https://codechacha.com/ko/kotlin-object-vs-class/
https://kotlinlang.org/docs/tutorials/kotlin-for-py/objects-and-companion-objects.html
'JVM > Kotlin' 카테고리의 다른 글
[Kotlin] Comparator, Comparable (0) | 2022.09.16 |
---|---|
[Java, Kotlin] equals, ==, === 비교 (0) | 2022.09.16 |
[Kotlin] Array SumOf, minOf, maxOf (0) | 2020.10.13 |
[Kotlin] Null-Safe (0) | 2020.06.28 |
[Kotlin] Abstract , Interface Class (0) | 2020.03.30 |