코틀린은 안드로이드 개발을 포함한 다양한 영역에서 널리 사용되는 현대적인 프로그래밍 언어로 현대적 언어답게 정적 멤버와 싱글톤 패턴을 간결하게 표현하는데 유용한 오브젝트(Object)와 컴페니언 오브젝트(Companion Object)가 존재한다
오늘 글에서는 이 두 개념에 대해 자세히 알아보겠다
오브젝트(Object)
코틀린의 오브젝트는 싱글톤 패턴을 구현하는 방법으로 오브젝트 선언은 전역에서 단 하나의 인스턴스만 존재함을 보장하기에
즉 이는 클래스를 선언하면서 동시에 그 클래스의 유일한 인스턴스를 생성하는 것과 같아 싱글톤을 손 쉽게 구현할 수 있다
코드로 확인해보면 아래와 같고
1
2
3
4
5
6
7
8
9
10
11
12
object DataManager {
var data: String = "Initial Data"
fun loadData(): String {
// 데이터 로드 로직
return data
}
}
fun main() {
println(DataManager.loadData()) // 항상 동일한 DataManager 인스턴스 사용
}
앞에서 말한 것처럼 위 코드처럼 object 키워드를 사용하여 싱글톤 객체를 정의할 수 있고 object 내에는 싱글톤 패턴이 내장되어 있어 해당 클래스의 인스턴스가 하나만 생성되며 전역적으로 접근 가능하다
또한 객체 초기화는 첫 접근 시에 이루어지며 이후 같은 인스턴스가 재사용된다
참고로 클래스 내부의 메서드 및 속성에 접근할 때는 객체 이름을 통해 직접 접근하면 된다
컴페니언 오브젝트(Companion Object)
컴페니언 오브젝트는 클래스 내부에 정의되는 정적 멤버를 위한 것으로 이를 통해 클래스 이름을 통해 직접 접근할 수 있는 메소드와 프로퍼티를 정의할 수 있는데
쉽게 말하자면 Java나 다른 언어의 static 메소드와 유사하다고 보면 된다 하지만 실제로는 인스턴스 메소드로 동작하기에 완벽히 같다고 보기엔 어렵다
코드로 확인해보면
1
2
3
4
5
6
7
8
9
10
11
class User(val name: String) {
companion object {
fun createGuest(): User {
return User("Guest")
}
}
}
fun main() {
val guestUser = User.createGuest() // 인스턴스를 생성하지 않고 메소드 호출
}
위와 같고 companion object 블록을 사용하여 클래스 내부에 싱글톤 객체를 생성한다 주로 클래스와 관련되었지만 인스턴스에 속하지 않는 메서드 및 속성을 관리하는 데 사용된다
또한 앞에서 말한 것처럼 자바의 정적 메서드와 필드와 유사한 역할을 하기에 클래스로 바로 접근할 수 있다
오브젝트와 컴페니언 오브젝트는 어떨 때 사용할까?
그렇다면 앞에서 배운 오브젝트와 컴페니언 오브젝트는 어떨 때 사용해야 할까?
오브젝트: 전역적인 싱글턴 인스턴스가 필요할 때 사용한다 ex)애플리케이션 전반에서 공유되는 설정, 유틸리티 함수 등
컴페니언 오브젝트: 클래스와 관련된 정적 메소드나 프로퍼티가 필요할 때 사용한다 ex) 팩토리 메소드나 상수 정의