Kotlin을 쓰다 보면 데이터를 담기 위한 클래스를 자주 만들게 됩니다.
사용자 정보, 서버 응답, UI 상태 등 단순한 값 객체를 표현할 일이 많죠.
그런데 일반 클래스에서는 아래와 같은 불편함이 있습니다..
이 모든 반복 작업을 자동으로 해결해주는 기능이 바로 Kotlin의 Data Class입니다.
단순한 구조의 데이터를 다루는 데 최적화된 기능이죠.
Kotlin에서 data 키워드를 사용한 클래스는 컴파일러가 다음과 같은 함수들을 자동 생성해주는 데이터 전용 클래스입니다.
✅ 자동 생성 함수
data class User(val name: String, val age: Int)
이렇게 선언만 해주면 저 5가지 기능이 자동으로 제공됩니다.
그래서 부수적인 오버라이딩이 없어도 값 비교, 출력, 복제가 가능하죠.
val user1 = User("Alice", 25)
val user2 = user1.copy(age = 30)
println(user1) // User(name=Alice, age=25)
println(user2) // User(name=Alice, age=30)
println(user1 == user2) // false (값 비교)
몇 가지 제약 조건이 존재하는데 기억하셔야됩니다.
1. Primary constructor에 최소 하나의 val 또는 var가 있어야 함
data class Empty // ❌ Error: No parameters
data class Person(val name: String) // ✅ OK
2. 다음과 같은 키워드를 함께 사용할 수 없음
3. 상속 불가능 함
왜? Data Class는 final임.
data class Child() : Parent() // ❌ 불가능
Data Class는 componentN() 함수를 자동으로 생성하므로 구조 분해 할당이 가능합니다.
val (name, age) = user1
println("이름: $name, 나이: $age")
if (oldState != newState) {
_uiState.value = newState
}
val cachedUser = repo.getUser()
if (cachedUser != networkUser) {
repo.saveUser(networkUser)
}
Java 16부터 등장한 record는 Kotlin의 Data Class와 유사한 목적을 가집니다.
Kotlin은 이에 대응해 다양한 실험적 기능을 도입하고 있습니다.
@JvmInline
value class Email(val value: String)
data object Loading : UiState()
Kotlin 2.0.20부터는 Data Class의 copy() 함수가 생성자와 동일한 가시성을 갖도록 점진적으로 변경됩니다.
기존에는 private constructor를 가진 클래스라도 copy()는 public 함수로 생성되어, 클래스 외부에서 복사가 가능했어요..
data class PositiveInteger private constructor(val number: Int) {
companion object {
fun create(number: Int): PositiveInteger? =
if (number > 0) PositiveInteger(number) else null
}
}
val value = PositiveInteger.create(42) ?: return
val copied = value.copy(number = -1) // ⚠️ 경고 발생함
// ⚠️ 경고문구: Non-public primary constructor is exposed via the generated 'copy()' method of the 'data' class.
Kotlin 2.0.20에서는 두 가지 새로운 annotation이 도입되어 동작을 제어할 수 있습니다.
-Xconsistent-data-class-copy-visibility
위 컴파일러 옵션을 설정하면 모든 데이터 클래스에 @ConsistentCopyVisibility가 적용된 것과 동일한 효과를 냅니다.
https://kotlinlang.org/docs/data-classes.html
https://kotlinlang.org/docs/whatsnew2020.html