Companion Object 란

2024-02-16

  • Kotlin
  • BE

코틀린의 companion object는 해당 클래스에 대해 단 하나만 존재하는 싱글톤 객체를 정의하는 특성입니다. 이는 자바의 static 멤버와 유사한 역할을 하지만, 몇 가지 중요한 차이점이 있습니다.

코틀린의 Companion Object

  • 싱글톤 패턴: 각 클래스에 대해 하나의 인스턴스만 존재합니다.
  • 객체로 접근: Companion Object는 실제 객체처럼 다뤄집니다. 이는 코틀린이 객체 지향 프로그래밍의 원칙을 따르기 때문입니다.
  • 인터페이스 구현 가능: Companion Object는 인터페이스를 구현할 수 있습니다.
  • 확장 가능: 확장 함수를 통해 Companion Object에 새로운 기능을 추가할 수 있습니다.
  • 이름 생략 가능: 이름을 생략할 수 있으며, 생략된 경우 Companion이라는 기본 이름을 사용합니다.

자바의 Static 멤버

  • 클래스 레벨의 멤버: static 키워드를 사용하여 클래스 레벨에서 정의됩니다.
  • 인스턴스 생성 없이 접근 가능: 클래스 이름을 통해 직접 접근할 수 있습니다.
  • 인터페이스 구현 불가: static 멤버는 인터페이스를 구현할 수 없습니다.
  • 확장 불가능: 자바의 static 멤버는 확장할 수 없습니다.

다른 언어와의 비교

  • C#의 static 클래스: 자바의 static과 유사하게, C#에서는 클래스 레벨에서 static 멤버를 정의할 수 있으며, 이들은 클래스 이름을 통해 접근합니다.
  • Python의 클래스 변수와 메서드: Python에서는 클래스 변수와 @classmethod 데코레이터를 사용한 클래스 메서드를 통해 유사한 기능을 구현할 수 있지만, 이들은 코틀린의 companion object처럼 싱글톤 패턴을 자동으로 제공하지 않습니다.
  • JavaScript의 정적 메서드와 속성: JavaScript 클래스에서 static 키워드를 사용하여 정적 메서드와 속성을 정의할 수 있습니다. 이는 자바의 static과 유사한 방식이지만, JavaScript의 프로토타입 기반 상속과 다소 차이가 있습니다.

코틀린의 companion object는 다른 언어의 static 멤버와 유사한 기능을 제공하지만, 객체 지향적 특성과 확장성이라는 추가적인 이점을 제공합니다.

코틀린에서 companion objectobject는 그럼 어떻게 다를까요? 두가지 모두 싱글톤 패턴을 사용하여 객체를 정의합니다. 하지만 사용 목적과 접근 방식에서 몇 가지 중요한 차이가 있습니다.

Companion Object 와 Object의 차이

Companion Object

  • 클래스 내부 정의: companion object는 클래스 내부에 정의되며, 이 클래스의 싱글톤 인스턴스를 제공합니다.
  • 정적 멤버 접근처럼 사용: 외부에서 클래스 이름을 통해 companion object의 멤버에 접근할 수 있습니다. 이는 자바의 정적 멤버(static members) 접근과 유사합니다.
  • 클래스와 긴밀한 연관성: companion object는 주로 클래스와 관련된 정적 메서드나 정적 필드(예: 팩토리 메서드, 유틸리티 함수, 상수 등)를 정의하는 데 사용됩니다.
  • 클래스 인스턴스에 접근 불가: companion object 내부에서는 외부 클래스의 인스턴스 멤버에 직접 접근할 수 없습니다.

Object

  • 클래스 외부 정의: object는 클래스 외부에 독립적으로 정의됩니다. 이는 자체적인 싱글톤 객체를 나타냅니다.
  • 일반 객체처럼 사용: object는 이름을 통해 직접 접근되며, 일반 클래스의 인스턴스처럼 사용할 수 있습니다.
  • 일반적인 싱글톤 사용: object는 전역적인 상태를 가진 싱글톤, 유틸리티 함수의 컬렉션, 관리 필요한 리소스 등을 정의하는 데 주로 사용됩니다.
  • 클래스와의 연관성이 덜함: object는 특정 클래스에 속하지 않기 때문에, 클래스의 인스턴스 멤버에 접근할 수 없습니다.

예시

class MyClass {
    companion object {
        fun create(): MyClass = MyClass()
    }
}

object MySingleton {
    fun doSomething() {
        println("Doing something")
    }
}

fun main() {
    val myClassInstance = MyClass.create() // MyClass의 Companion Object 사용
    MySingleton.doSomething() // MySingleton 객체 사용
}

이 예시에서, MyClass.create()companion object를 사용하여 MyClass의 인스턴스를 생성하는 팩토리 메서드로 사용되며, MySingleton.doSomething()은 독립적인 object를 사용하여 정의된 메서드입니다.

요약하자면, companion object는 클래스와 밀접하게 관련된 정적 멤버를 제공하는 반면, object는 독립적인 싱글톤 객체로 사용되어 다양한 목적(예: 유틸리티 함수, 전역 상태 관리)에 사용됩니다.

UML & ER 다...

트리(Tree)란 ...