
코틀린 data object란 무엇인가를 한 줄로 말하면, singleton object를 더 읽기 좋은 상태 모델로 다듬는 Kotlin 문법입니다. 특히 sealed 상태 계층 안에서 data class와 나란히 놓일 때 장점이 또렷해집니다.
이번 글에서는 plain object로도 충분한 장면과, 왜 data object가 따로 생겼는지, 그리고 toString과 equals가 실무에서 어떤 차이를 만드는지 공식 문서 기준으로 정리하겠습니다.

코틀린 data object란 무엇인가
plain object도 이미 singleton 선언입니다. 그래서 data object의 핵심은 singleton 자체가 아니라, 컴파일러가 생성해 주는 기본 메서드와 표현 품질 쪽에 있습니다.
object PlainLoading
data object DataLoading
fun main() {
println(PlainLoading) // 예: PlainLoading@1a2b3c
println(DataLoading) // DataLoading
}Kotlin 공식 문서 기준으로 data object는 toString(), equals(), hashCode()를 생성합니다. 특히 toString()이 객체 이름만 깔끔하게 보여 준다는 점이 로그와 디버깅에서 바로 체감됩니다.
왜 sealed 상태 표현에서 특히 잘 맞을까
data object가 자주 언급되는 이유는 sealed 상태 모델입니다. 값이 있는 상태는 data class로, 값이 없는 상태는 data object로 두면 선언이 대칭적으로 읽힙니다.
sealed interface UserListState {
data object Loading : UserListState
data object Empty : UserListState
data class Success(val users: List<String>) : UserListState
data class Error(val message: String) : UserListState
}plain object로 써도 동작은 같습니다. 하지만 상태 모델이 전부 값 모델처럼 정돈되어 보여서 읽기성이 좋아집니다. 더 넓은 상태 설계 기준은 sealed class vs enum 글도 함께 참고하면 좋습니다.
equals와 hashCode는 왜 중요할까
공식 문서는 reflection이나 일부 JVM serialization 경로에서 같은 타입의 data object 인스턴스가 강제로 하나 더 생길 수 있는 edge case를 설명합니다. 이때도 equals()는 같은 의미의 객체로 취급하도록 설계되어 있습니다.
data object EndOfFile
fun isSameMarker(marker: EndOfFile): Boolean {
return marker == EndOfFile
}그래서 Kotlin 공식 문서도 data object는 ===보다 ==를 쓰라고 안내합니다. 즉 identity보다 의미적 equality 쪽에 더 맞춘 설계라고 볼 수 있습니다.
언제 plain object로도 충분할까
- 상태 모델링이 아니라 일반 singleton 유틸이다
- 로그에 객체 이름을 자주 찍지 않는다
- sealed 계층에서 data class와 대칭성이 큰 가치가 아니다
- 팀 Kotlin 버전이나 컨벤션상 아직 data object를 쓰지 않는다
예를 들어 전역 설정, 작은 헬퍼 singleton은 plain object로도 충분히 자연스럽습니다. 그래서 data object를 모든 object에 기계적으로 붙일 필요는 없습니다.
Kotlin 1.9와 연결해서 보면
Kotlin 1.9.0 변경 사항 문서에는 data object symmetry with data classes가 안정화 항목으로 소개됩니다. 즉 이 문법은 상태 모델링에서 느껴지던 어색함을 줄이기 위한 언어 차원의 다듬기라고 이해하면 자연스럽습니다.
object 기본 개념은 object와 companion object 차이, 값 모델 감각은 코틀린 data class 글과 같이 보면 더 잘 이어집니다.
정리
코틀린 data object란 무엇인가를 다시 줄이면, 값 없는 singleton 상태를 data class 계열과 더 대칭적으로 표현하고, toString()과 equals() 같은 기본 동작을 더 읽기 좋게 제공하는 Kotlin 문법입니다.
공식 참고 자료는 Kotlin object declarations와 What’s new in Kotlin 1.9.0입니다.