IT/Kotlin

[Kotlin] object 키워드

forest-33 2024. 4. 12. 22:44
  •  코틀린에서 object 키워드는 여러 가지 의미로 사용됨

 

싱글톤 객체 생성 

  • object 키워드는 클래스를 정의하면서 동시에 해당 클래스의 단일 인스턴스를 생성하는 데 사용
  • 이를 통해 해당 클래스의 단일 인스턴스가 어디서든 접근 가능하고, 여러 스레드에서 안전하게 사용
object Singleton {
    fun doSomething() {
        println("Doing something...")
    }
}

fun main() {
    Singleton.doSomething()
}

 

익명 객체 생성 

  • object 키워드는 클래스나 인터페이스를 선언할 때도 사용
  • 이 경우 익명 클래스나 익명 객체를 생성하여 해당 클래스나 인터페이스를 구현할 수 있음
interface OnClickListener {
    fun onClick()
}

fun setOnClickListener(listener: OnClickListener) {
    // Listener 처리
}

fun main() {
    // 익명 객체를 사용하여 OnClickListener 인터페이스를 구현
    setOnClickListener(object : OnClickListener {
        override fun onClick() {
            println("Button clicked!")
        }
    })
}

 

 

동반객체 (Companion object)

  • 클래스 내부에 정의되며, 그 클래스의 인스턴스와 무관하게 해당 클래스와 관련된 메서드와 프로퍼티를 가질 수 있음.
  • 이는 Java의 정적 메서드와 유사한 개념이지만, 더 많은 기능을 제공함.

 

동반 객체의 선언

  • 동반 객체는 클래스의 인스턴스와 관련된 멤버가 아니라 클래스 자체에 속하는 멤버를 정의
class MyClass {
    companion object {
        // 동반 객체의 멤버 정의
        fun companionFunction() {
            println("Companion function called")
        }
    }
}

 

동반 객체의 사용

MyClass.companionFunction() // 출력: Companion function called

 

 

동반객체 - 팩토리 메서드 제공 

 

 

  1. 팩토리 메서드 제공
  2. 팩토리 패턴 구현
  3. 정적 메서드의 개념을 대체
  4. 인스턴스 생성 및 관련 로직의 그룹화
class Car(val color: String) {
    companion object {
        fun createCar(color: String): Car {  // 팩토리 메서드 제공
            return Car(color)		// 인스턴스 생성 로직이 클래스 내부에 캡슐화 
        }
    }
}

fun main() {
    val redCar = Car.createCar("red")        // 외부에서는 팩토리 메서드를 통해서만 인스턴스 생성
    println(redCar.color) // 출력: red
}

 

 

동반객체 vs 패키지 수준 함수 

 

동반 객체

  1. 캡슐화: 동반 객체는 클래스 내부에 존재하기 때문에 해당 클래스의 내부 상태에 접근할 수 있음. 이는 동반 객체가 클래스의 인스턴스를 조작하는 데 유용한 메서드를 제공할 때 유용
  2. namespace 구분: 동반 객체는 클래스의 일부로 취급되기 때문에 클래스 이름으로 접근할 수 있음. 이는 동반 객체의 이름 공간을 클래스의 이름 아래로 분리하여 관련 기능을 그룹화하는 데 유용

패키지 수준 함수 

  1. 간결성: 패키지 수준 함수는 클래스에 바운드되지 않으므로 클래스 이름을 통한 접근 없이 직접 호출할 수 있음. 이는 코드를 더 간결하게 만들 수 있음. 
  2. 유연성: 패키지 수준 함수는 특정 클래스에 종속되지 않으므로 다른 클래스에서도 자유롭게 사용할 수 있음.  이는 함수를 재사용하거나 다른 클래스에 쉽게 적용할 수 있도록 함.

 

  • 패키지 수준 함수 예제 
// Util.kt 파일

package com.example.util

fun greet() {
    println("Hello, World!")
}

fun calculateSum(a: Int, b: Int): Int {
    return a + b
}

// Main.kt 파일

package com.example

import com.example.util.greet
import com.example.util.calculateSum

fun main() {
    greet() // 출력: Hello, World!
    
    val result = calculateSum(3, 5)
    println("Sum: $result") // 출력: Sum: 8
}