Kotlin data object 알아보기
data object?
data object는 kotlin 1.9.0에서 추가된 데이터 홀더 객체입니다. class 대신 data class를 사용할 수 있는 것처럼, data object도 object대신 간편하게 사용하기 위해 개발되었습니다.
sealed class, sealed interface등과 연계하여 사용하기 좋습니다.
sealed interface UiState {
data object Loading : UiState
data class Success(val data: String) : UiState
data object Error : UiState
}
when(data) {
UiState.Loading -> {}
is UiState.Success -> {}
UiState.Error -> {}
}
data object는 내부적으로 toString(), equals(), hashCode() 함수를 재정의 합니다. 때문에 equals()와 hashCode() 함수를 직접 구현할 수 없습니다.
기본적으로 data object는 싱글톤이기 때문에 인스턴스가 여러개 생성될 일이 없습니다, 하지만 외부 요인 (직렬화, 리플렉션) 등으로 인해 인스턴스가 여러 개 생성되는 일이 발생할 수 있습니다.
이러한 케이스에 대응하기 data object의 equals() 함수는 data object가 같은 타입이라면 true를 반환 하도록 설계되어 있습니다.
위 설명에서 말한것처럼 인스턴스가 여러 개 생성될 수 있기 때문에 === 참조 비교는 사용하지 않는 것이 좋습니다.
아래에서 data object는 data class, object와 어떤 차이점이 있는지 알아보겠습니다.
vs object
object와 data object의 가장 큰 차이점은 바로 toString()의 구현 여부입니다.
object는 toString()함수가 재정의되어있지 않아, 출력 시에 패키지명 + 주소값이 나오지만, data object는 toString() 함수가 재 정의되어 있기 때문에 출력 시에 깔끔하게 객체의 이름을 확인할 수 있습니다.
object SampleObject
data object SampleDataObject
fun main() {
println(SampleObject)
println(SampleDataObject)
}

vs data class
data class와 data object는 유사하지만 몇몇 차이점이 있습니다.
1. copy() 함수 여부
data object는 싱글톤으로 사용되도록 개발되었기 때문에 data class와 다르게 copy() 함수가 없습니다.
싱글톤 객체는 인스턴스를 단일 인스턴스로 제한하기 때문에 copy() 를 통해 인스턴스의 복제본을 만들 수 없습니다.
2. componentN() 함수 여부
data object는 프로퍼티를 가지지 않으므로 구조분해 시도는 의미가 없기 때문에 componentN() 함수는 생성되지 않습니다.
마무리
이번 글에서는 Kotlin의 data object에 대해 알아보았습니다.
설명이 잘못되었거나 부족한 부분이 있다면 댓글로 지적해주시면 감사하겠습니다.
참고 자료
https://kotlinlang.org/docs/object-declarations.html#data-objects
https://medium.com/@domen.lanisnik/data-objects-in-kotlin-1a549bfad657
'Kotlin' 카테고리의 다른 글
| [Kotlin] const val과 val의 차이점에 대해 알아보기! (0) | 2024.03.19 |
|---|