Home Kotlin의 오브젝트와 컴페니언 오브젝트에 대해 알아보자
Post
Cancel

Kotlin의 오브젝트와 컴페니언 오브젝트에 대해 알아보자

코틀린은 안드로이드 개발을 포함한 다양한 영역에서 널리 사용되는 현대적인 프로그래밍 언어로 현대적 언어답게 정적 멤버와 싱글톤 패턴을 간결하게 표현하는데 유용한 오브젝트(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) 팩토리 메소드나 상수 정의

This post is licensed under CC BY 4.0 by the author.