오늘은 사용법을 잘 모르고 있었던 Object와 Companion Object에 대해 정리해보고자 한다.
(코드리뷰를 받던중 내가 잘 모르고 사용하고 있다는 사실을 알았다 ㅎㅎ,.)
코틀린에서 object와 companion object는 모두 하나의 인스턴스를 나타내는데 사용되지만, 사용 방법과 범위에 차이가 있다.
싱글톤 패턴 구현
클래스 이름앞에 class 대신 object 키워드를 붙이면 싱글톤 클래스를 만들 수 있다.
object Singleton {
fun doSomething() {
// 싱글톤 객체에서 수행할 작업
}
}
객체 생성과 상속 불가
object는 생성된 객체가 오직 하나뿐이므로 클래스의 인스턴스를 생성하는것과 상속을 지원하지 않는다.
익명 내부 클래스
object를 사용하여 익명 내부 클래스를 생성할 수 있다. object는 이름이 없지만, 메서드와 프로퍼티를 포함하는 객체를 생성할 수 있고 이는 코드를 더 간결하고 가독성 높게 만들어준다.
val listener = object : OnClickListener {
override fun onClick(view: View) {
// 클릭 이벤트를 처리하는 코드
}
}
확장 함수와 프로퍼티
object를 사용하여 클래스나 객체에 화가장 함수나 프로퍼티를 정의할 수 있다.
object StringUtil {
fun String.reverse(): String {
return this.reversed()
}
}
상수
클래스 내에서 상수를 정의할때 사용할 수 있다. companion object에서 정의한 상수는 클래스 내부에서만 사용할 수 있으며, 클래스 이름으로 접근할 수 있다.
class MyClass {
companion object {
const val MY_CONSTANT = 123
}
}
팩토리 메서드
팩토리 메서드는 객체를 생성하는 메서드로 클래스 이름을 통해 호출할 수 있다.
이를 통해 코드를 추상화하여 유지보수성을 높이고, 코드를 쉽게 변경하거나 수정할 수 있도록 한다.
class MyClass private constructor(val value: Int) {
companion object {
fun create(value: Int): MyClass {
return MyClass(value)
}
}
}
MyClass.create()
확장 함수
클래스에 확장 함수를 추가할 수 있다.
class MyClass {
companion object {}
}
fun MyClass.Companion.doSomething() {
// 확장 함수에서 수행할 작업
}
인터페이스 구현
interface MyInterface {
fun doSomething()
}
class MyClass {
companion object : MyInterface {
override fun doSomething() {
// 구현할 작업
}
}
}
프로퍼티
클래스에 정적 프로퍼티를 추가할 수 있다. 프로퍼티는 값을 저장하거나 읽어오는 변수이다.
class MyClass {
companion object {
val MY_PROPERTY = "Hello, World!"
}
}
생성자
companion object ****를 이용하여 생성자를 정의할 수 있다. 이때 생성자는 private으로 선언해야 한다.
class MyClass private constructor() {
companion object {
fun create(): MyClass {
return MyClass()
}
}
}
object
companion object
참고
https://medium.com/mindorks/kotlin-object-vs-companion-object-a1907c76a2af
https://nuritech.tistory.com/18