본문 바로가기
Kotlin Language/Kotlin 기본 문법

Kotlin(코틀린) - 오브젝트(Object, Companion Object)

by Classic Master 2023. 12. 8.
728x90

Object?

  • object 키워드는 싱글톤, 클래스의 단일 인스턴스를 선언할 때 사용됩니다.
  • 클래스를 선언하고 동시에 해당 클래스의 인스턴스를 생성하는 것과 유사합니다.
  • 오브젝트는 하나의 인스턴스만 있는 클래스를 만들 때 사용됩니다.
object MySingleton {
    fun doSomething() {
        println("작업 중...")
    }
}
//사용하고자 호출할 때
MySingleton.doSomething()

 

Companion Object?

  • companion object는 포함된 클래스의 인스턴스와 결합된 특수한 종류의 오브젝트입니다.
  • companion object의 멤버는 클래스 이름을 사용하여 직접 액세스할 수 있습니다.
    클래스와 관련된 정적 메서드 및 상수를 그룹화하는 데 사용됩니다.
class MyClass {
    companion object {
        const val DEFAULT_VALUE = 42
        fun create(): MyClass {
            return MyClass()
        }
    }
    // 클래스의 인스턴스 메서드 등...
}

fun main() {
    // 동반 객체의 상수에 접근
    println("기본 값: ${MyClass.DEFAULT_VALUE}")

    // 동반 객체의 팩토리 메서드 호출
    val instance = MyClass.create()
    println("인스턴스 생성: $instance")
}
//사용하고자 호출할 때
println(MyClass.DEFAULT_VALUE)
val instance = MyClass.create()
  • companion object는 클래스가 로드될 때 초기화됩니다.
    주로 클래스와 관련된 팩토리 메서드, 상수 또는 클래스와 관련된 유틸리티 함수를 만드는 데 사용됩니다.

 

추가설명

  • 요약하면 object는 싱글톤을 만들 때 사용되며, companion object는 클래스 내에서 정적 멤버를 그룹화하는 데 사용됩니다. 둘 다 Kotlin에서 기능을 조직하고 캡슐화하는 방법을 제공합니다.

싱글톤 (Singleton) ?

  • 싱글톤은 어떤 클래스의 인스턴스가 오직 하나만 생성되어야 하는 경우 사용되는 디자인 패턴 중 하나입니다. 이 패턴을 사용하면 해당 클래스의 인스턴스가 단일하게 유지되며, 어디서든지 접근할 수 있게 됩니다. 여러 번 호출되더라도 항상 동일한 인스턴스를 반환합니다.

특징

  • 싱글톤 클래스의 인스턴스는 항상 단일하게 유지됩니다. 여러 요청이 있더라도 해당 인스턴스는 한 번만 생성됩니다.
  •  다른 클래스나 객체에서 싱글톤 인스턴스에 쉽게 접근할 수 있습니다. 이는 전역 상태나 공유 자원을 관리할 때 유용합니다.
  • 인스턴스가 필요한 시점에만 생성될 수 있도록 하는 지연 로딩(Lazy Loading)을 구현할 수 있습니다. 이는 초기 비용이 큰 객체를 처음부터 생성하지 않고, 필요한 시점에 생성하는 데 도움이 됩니다.
  • 싱글톤은 자체적으로 인스턴스를 관리하므로, 인스턴스 생성 및 관리에 대한 통제를 제공합니다.

이해를 돕기 위한 예제

 

단순한 객체 생성

// Object 예제 1
object SimpleObject {
    fun sayHello() {
        println("Hello from SimpleObject!")
    }
}
fun main() {
    SimpleObject.sayHello()
}
  • SimpleObject라는 단순한 객체를 생성합니다. 해당 객체에는 sayHello라는 메서드가 있으며, 메인 함수에서 이 메서드를 호출하여 "Hello from SimpleObject!"를 출력합니다.

 

프로퍼티와 메서드를 갖는 객체

// Object 예제 2
object Person {
    var name: String = "Bin"
    var age: Int = 32

    fun introduce() {
        println("Hello, I'm $name and I'm $age years old.")
    }
}

fun main() {
    println("Default Name: ${Person.name}")
    println("Default Age: ${Person.age}")

    Person.introduce()
    // 수정 가능
    Person.name = "Alice"
    Person.age = 25

    println("Updated Name: ${Person.name}")
    println("Updated Age: ${Person.age}")

    Person.introduce()
}
  • Person이라는 객체를 생성합니다. 해당 객체는 이름(name)과 나이(age)라는 프로퍼티를 가지며, introduce라는 메서드를 갖습니다. 메인 함수에서는 객체의 프로퍼티를 출력하고, 메서드를 호출하여 소개 메시지를 출력한 뒤, 프로퍼티를 업데이트하고 다시 출력합니다.

 

Companion Object 예제 동반 객체를 사용한 공통 메서드

class MathUtils {
    companion object {
        fun add(a: Int, b: Int): Int {
            return a + b
        }

        fun multiply(a: Int, b: Int): Int {
            return a * b
        }
    }
}
fun main() {
    val sum = MathUtils.add(3, 5)
    val product = MathUtils.multiply(2, 4)

    println("합계: $sum")
    println("곱셈 결과: $product")
}
  • MathUtils 클래스를 정의하고 동반 객체를 사용하여 덧셈과 곱셈을 수행하는 메서드를 구현합니다. 메인 함수에서는 동반 객체를 사용하여 두 숫자의 합과 곱셈 결과를 출력합니다.

 

Companion Object 예제 동반 객체를 사용한 유틸리티 클래스

class StringUtil private constructor() {
    companion object {
        fun isEmpty(value: String?): Boolean {
            return value == null || value.trim().isEmpty()
        }

        fun capitalize(value: String): String {
            return value.capitalize()
        }
    }
}
fun main() {
    val emptyString = ""
    val nonEmptyString = "hello"

    println("빈 문자열 여부: ${StringUtil.isEmpty(emptyString)}")
    println("빈 문자열 여부: ${StringUtil.isEmpty(nonEmptyString)}")

    val capitalizedString = StringUtil.capitalize("world")
    println("대문자로 변환: $capitalizedString")
}
  • StringUtil 클래스를 정의하고 동반 객체를 사용하여 빈 문자열 여부를 확인하고 문자열을 대문자로 변환하는 유틸리티 메서드를 구현합니다. 메인 함수에서는 이 유틸리티 메서드들을 사용하여 문자열을 처리합니다.
728x90
반응형