본문 바로가기
Android/Kotlin

[Kotlin] 코틀린의 Unit 타입: 무엇이고 어떻게 사용하는가?

by quessr 2024. 6. 14.

 

코틀린을 사용하다 보면 Unit이라는 타입을 접하게 됩니다. 자바의 void와 유사하지만, 코틀린에서는 조금 더 유연하게 사용할 수 있습니다.

 

Unit이란 무엇인가?

Unit 코틀린에서 반환 값이 없음을 나타내는 특수한 타입입니다. 자바의 void 유사하지만, 코틀린에서는 Unit 실제로 객체로 존재하며, 하나의 인스턴스만 가지고 있습니다. 인스턴스의 이름도 Unit입니다.

fun exampleFunction(): Unit {
    println("This function returns Unit")
}

exampleFunction 함수는 Unit을 반환합니다. 물론, 반환 타입을 명시하지 않아도 코틀린 컴파일러는 자동으로 Unit을 반환 타입으로 간주합니다.

 

Unit의 실제 사용 예

Unit은 주로 함수의 반환 타입으로 사용되지만, 이벤트를 알리기 위한 용도로도 자주 사용됩니다. 예를 들어, 특정 상태가 변경되었음을 알리고 싶지만 그 상태에 대한 구체적인 데이터는 필요 없는 경우에 Unit을 사용하면 유용합니다.

다음은 LiveData ViewModel 사용하여 Unit 타입을 활용하는 예제입니다.

 

SharedViewModel 예제

먼저 SharedViewModel 클래스를 정의해보겠습니다.

class SharedViewModel : ViewModel() {
    private val _favoriteUpdated = MutableLiveData<Unit>()
    val favoriteUpdated: LiveData<Unit> get() = _favoriteUpdated

    fun notifyFavoriteUpdated() {
        _favoriteUpdated.value = Unit
    }
}

위 코드에서 _favoriteUpdated는 MutableLiveData<Unit> 타입으로 정의되어 있습니다. notifyFavoriteUpdated 메서드는 _favoriteUpdated의 값을 Unit으로 설정하여 구독자들에게 이벤트가 발생했음을 알립니다.

 

Activity에서의 활용

이제 Activity에서 SharedViewModel 활용하는 방법을 보겠습니다.

class PhotoDetailActivity : AppCompatActivity() {

    private lateinit var sharedViewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        sharedViewModel = ViewModelProvider(this).get(SharedViewModel::class.java)

        // favoriteUpdated 이벤트를 관찰
        sharedViewModel.favoriteUpdated.observe(this, Observer {
            // 이벤트가 발생했을 때 수행할 작업
            Toast.makeText(this, "Favorite updated!", Toast.LENGTH_SHORT).show()
        })
    }

    private fun updateFavorite() {
        // 즐겨찾기 상태 업데이트 로직
        sharedViewModel.notifyFavoriteUpdated()
    }
}

위 코드에서는 PhotoDetailActivity가 SharedViewModel을 관찰하고 있습니다. favoriteUpdated 이벤트가 발생하면 토스트 메시지를 표시하도록 설정되어 있습니다. updateFavorite 메서드를 호출하면 notifyFavoriteUpdated가 호출되어 이벤트가 발생합니다.

 

결론

코틀린의 Unit 타입은 반환 값이 없음을 나타내는 특수한 타입으로, 이벤트 처리나 콜백에서 데이터가 필요 없는 경우에 유용하게 사용할 있습니다. 이를 통해 코드를 더욱 간결하고 명확하게 작성할 있습니다.