본문 바로가기
Kotlin

[Kotlin] object, companion object

by LoseyKim 2024. 3. 5.

object : 단일 인스턴스를 관리하거나 특정한 동작을 수행할 때 사용
companion object : 클래스 내에서 정적으로 동작하는 메서드나 변수를 제공할 때 사용

Object

사용 사례

  1. 싱글톤 패턴을 구현할 때 사용됩니다. 클래스의 단일 인스턴스를 생성하고 해당 인스턴스를 여러 곳에서 접근할 수 있습니다.
  2. 객체 생성이 필요 없는 유틸리티 메서드를 제공할 때 사용됩니다.
  3. 이름이 있는 객체를 정의하여 특정한 동작을 수행하고자 할 때 사용됩니다.

특징

  1. 클래스 내부에 정의되며, 해당 클래스의 인스턴스가 단 하나만 존재합니다.
  2. 싱글톤으로 동작하며, 클래스의 인스턴스 생성 없이 사용됩니다.
  3. 멤버 변수와 메서드를 가질 수 있습니다.

사용 예시

object Singleton {
 var count: Int = 0

 fun printCount() {
     println("Count: $count")
 }
}

fun main() {
	Singleton.count += 1
	Singleton.printCount() // 출력: Count: 1
}

위의 예시에서 Singleton은 object로 선언되어 있으므로, 이를 통해 생성된 Singleton 인스턴스는 프로그램 내에서 유일합니다. Singleton.count를 통해 접근하는 count 변수는 프로그램의 어느 곳에서든 같은 값을 가리킵니다.


Companion Object

사용 사례

  1. 클래스 내부에서 정적 메서드와 변수를 제공할 때 사용됩니다.
  2. 팩토리 메서드를 구현하여 객체 생성 로직을 캡슐화할 때 사용됩니다.
  3. 인터페이스의 메서드를 구현할 때 사용됩니다.
  4. 테스트 용이성을 위해 의존성 주입을 피할 때 사용됩니다.

특징

  1. 클래스 내부에 정의되며, 해당 클래스의 인스턴스와 연결됩니다.
  2. 클래스의 인스턴스 생성 없이 사용할 수 있습니다.
  3. 멤버 변수와 메서드를 가질 수 있으며, 외부에서 접근할 때는 클래스 이름을 통해 접근합니다.

사용 예시

class MyClass {
    companion object {
        val staticProperty: Int = 123

        fun staticMethod() {
            println("This is a static method.")
        }
    }
}

fun main() {
    println(MyClass.staticProperty) // 출력: 123
    MyClass.staticMethod() // 출력: This is a static method.
}

위 예시에서 MyClass 안에 정의된 companion object는 staticProperty와 staticMethod를 포함하고 있습니다. 이들은 클래스의 인스턴스를 생성하지 않고도 MyClass.staticProperty와 MyClass.staticMethod()를 통해 접근할 수 있습니다.


차이점

  • 생성 방식
    • object : 클래스 내부에 직접 정의
    • companion object : 클래스 내부에 정의되나 해당 클래스의 인스턴스와 연결
  • 사용 목적
    • object : 주로 싱글톤 객체를 만들거나 이름이 있는 객체를 정의할 때 사용
    • companion object : 클래스 내부에서 정적 메서드나 변수를 제공하거나 인터페이스의 메서드를 구현할 때 사용
  • 접근 방법
    • object: 객체의 이름을 통해 접근
    • companion object: 클래스 이름을 통해 접근
  • 개수 제한
    • object: 클래스 내에 여러 개의 object를 정의
    • companion object: 클래스 내에는 하나의 companion object만 정의