Data Class란
Kotlin에서 data class는 데이터를 담기 위한 클래스를 정의할 때 사용하는 특별한 클래스입니다.
일반적인 클래스와 달리, data class는 주로 데이터 보관과 비교를 목적으로 사용되며, 자동으로 여러 유용한 메서드들을 생성해 줍니다.equals()
과 hashCode()
등의 메서드를 자동으로 지원하여 데이터 객체를 쉽게 비교하거나 출력하고, 복사할 수 있는 기능을 제공합니다.
따라서 data class는 데이터 중심의 애플리케이션에서 매우 유용하게 사용됩니다.
물론 자동 생성되는 메서드들을 직접 선언하여 사용할 수도 있습니다.
Data Class의 주요 특징
- 아래와 같은 메서드들이 자동으로 생성됩니다.
- equals(): 두 객체의 내용이 같은지 비교합니다.
- hashCode(): 객체를 해시코드로 변환합니다. 주로 해시 기반의 컬렉션(HashMap, HashSet 등)에서 사용됩니다.
- toString(): 객체의 내용을 쉽게 출력할 수 있도록 문자열로 변환합니다.
- copy(): 객체를 복사할 때 일부 속성만 변경하여 새로운 객체를 생성할 수 있습니다.
- componentN(): 객체를 분해(Destructuring)할 수 있게 하는 함수입니다.
- 주 생성자에서 반드시 하나 이상의 속성이 정의되어야 합니다. 즉, 속성 없이 data class를 만들 수 없습니다.
사용 예시
Data Class 정의 예시
data class User(val id: Int, val name: String)
자동 생성 메서드 예시
fun main() {
val user1 = User(1, "John")
val user2 = User(1, "John")
// 1. equals() 비교
println(user1 == user2) // true (내용이 같으면 동일하다고 간주)
// 2. hashCode() 비교
println(user1.hashCode() == user2.hashCode()) // true (같은 내용이면 같은 해시코드)
// 3. toString() 출력
println(user1) // User(id=1, name=John)
// 4. copy() 사용
val user3 = user1.copy(name = "Jane") // id는 동일하고 name만 변경
println(user3) // User(id=1, name=Jane)
// 5. Destructuring (componentN())
val (id, name) = user1
println("ID: $id, Name: $name") // ID: 1, Name: John
}
copy() 메서드
copy() 메서드는 data class의 강력한 기능 중 하나로, 객체의 일부 속성만 변경한 새로운 객체를 쉽게 만들 수 있습니다.
이 메서드는 불변 객체를 다룰 때 유용합니다.
val original = User(id = 1, name = "John")
val copy = original.copy(name = "Jane")
println(copy) // User(id=1, name=Jane)
componentN()과 Destructuring(구조 분해)
메서드명만 봐서는 조금 생소할 수도 있는데, kotlin에서 제공하는 구조분해를 지원하는 메서드입니다.
data class는 객체를 분해하여 변수에 할당할 수 있는 componentN() 함수를 자동으로 생성합니다.
예를 들어, 아래와 같이 User 객체를 선언했을 때 component1()은 id를 반환하고, component2()는 name을 반환합니다.
val user = User(1, "John")
val (id, name) = user // 구조 분해
println(id) // 1
println(name) // John
제한 사항
- 주 생성자에 최소 하나 이상의 val 또는 var 속성이 있어야 합니다.
- data class는 추상 클래스일 수 없습니다.
data class를 사용하는 이유
- 간결성: 데이터만 담는 클래스를 쉽게 정의하고, 메서드들을 자동으로 제공받을 수 있어 코드가 매우 간결해집니다.
- 비교 용이성: 객체 간의 내용 비교를 쉽게 할 수 있습니다. 객체의 메모리 주소를 비교하는 것이 아니라, 속성 값을 기준으로 equals()를 자동으로 제공합니다.
- 불변성: copy()를 통해 객체를 복사할 때 일부 속성만 변경할 수 있어, 불변 객체를 쉽게 다룰 수 있습니다.
- 자동 메서드 생성: hashCode(), toString() 등 유용한 메서드들이 자동 생성됩니다.