본문 바로가기
Android

[안드로이드] 코틀린에서 object의 정의와 사용

by JongSeok 2023. 2. 27.

이번 포스팅에서는 Kotlin에서 object 키워드가 무엇을 의미하고  class와 object는 어떤 차이가 있는지에 대해 알아보겠습니다.

object 키워드의 의미와 사용

코틀린에서 object 키워드는 클래스를 정의하는 동시에 객체를 생성하는 것이라고 볼 수 있습니다.

Kotlin에는 Java에서 쓰이는 static 키워드가 존재하지 않기 때문에 object를 사용해 static의 개념을 표현합니다.

 

object 키워드는 주로 다음과 같은 경우에 사용됩니다.

1. 싱글톤(Singleton) 클래스 정의

2. 동반객체(companion object) 생성

3. 익명 클래스 생성

 

1. 싱글톤(Singleton) 클래스 정의

싱글톤(Singleton)은 프로젝트에서 어떤 객체를 매번 생성하지 않고 하나의 객체만 생성해 하나의 객체를 재사용하는 방식으로 싱글톤 패턴이라고도 합니다.

 

싱글톤으로 생성된 객체는 전역에서 접근할 수 있고, 객체를 단 한 번만 생성하기 때문에 메모리를 효율적으로 사용할 수 있다는 장점이 있습니다.

object RetrofitInstance {
    const val BASE_URL = "BASE_URL"

    private val retrofit: Retrofit by lazy {
        Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .build()
    }
}

위 코드에서 RetrofitInstance는 class가 아닌 object로 생성되었기 때문에 싱글톤으로 동작하며 한 번의 생성으로 프로젝트 내의 모든 클래스에서 접근이 가능합니다.

 

2. 동반객체(companion object) 생성

코틀린에는 static 키워드를 제공하지 않지만 static처럼 표현하는 방법으로 companion object(동반 객체)라는 개념이 존재합니다.

companion object는 클래스 내부에 존재하며, 클래스 내부의 companion object는 해당 클래스가 공유하는 메소드나 프로퍼티를 정의할 수 있습니다.

companion object 또한 하나의 객체이므로 객체의 이름을 지정하거나 상속이 가능하고, 하나의 클래스는 최대 한 개의 companion object를 정의할 수 있습니다.

class Number {
    companion object {
        const val MAX_NUMBER: Int = 1000
    }
}

fun main() {
    println(Number.MAX_NUMBER)    // 1000
}

3. 익명 클래스 생성

익명 클래스는 정의 그대로 이름이 없는 익명의 객체입니다.

한 번만 사용하고 재사용하지 않기 때문에 별도로 이름을 부여하지 않지만 싱글톤과 달리 매번 객체를 생성한다는 점에서 객체를 한 번만 생성하는 싱글톤과 차이가 있습니다.

productListAdapter.setItemClickListener(object : ProductListAdapter.OnItemClickListener {
    override fun onClick(v: View, position: Int) {
        // 클릭 시 실행
        ...
    }
})

private lateinit var itemClickListener: OnItemClickListener

interface OnItemClickListener {
    fun onClick(v: View, position: Int)
}

fun setItemClickListener(onItemClickListener: OnItemClickListener) {
    this.itemClickListener = onItemClickListener
}

 

728x90
반응형