Programming/Kotlin

[Kotlin] Data Class

2025. 5. 6. 22:48

Data Class란

Kotlin에서 data class는 데이터를 담기 위한 클래스를 정의할 때 사용하는 특별한 클래스입니다.
일반적인 클래스와 달리, data class는 주로 데이터 보관과 비교를 목적으로 사용되며, 자동으로 여러 유용한 메서드들을 생성해 줍니다.
equals()hashCode() 등의 메서드를 자동으로 지원하여 데이터 객체를 쉽게 비교하거나 출력하고, 복사할 수 있는 기능을 제공합니다.
따라서 data class는 데이터 중심의 애플리케이션에서 매우 유용하게 사용됩니다.
물론 자동 생성되는 메서드들을 직접 선언하여 사용할 수도 있습니다.

Data Class의 주요 특징

  1. 아래와 같은 메서드들이 자동으로 생성됩니다.
    • equals(): 두 객체의 내용이 같은지 비교합니다.
    • hashCode(): 객체를 해시코드로 변환합니다. 주로 해시 기반의 컬렉션(HashMap, HashSet 등)에서 사용됩니다.
    • toString(): 객체의 내용을 쉽게 출력할 수 있도록 문자열로 변환합니다.
    • copy(): 객체를 복사할 때 일부 속성만 변경하여 새로운 객체를 생성할 수 있습니다.
    • componentN(): 객체를 분해(Destructuring)할 수 있게 하는 함수입니다.
  2. 주 생성자에서 반드시 하나 이상의 속성이 정의되어야 합니다. 즉, 속성 없이 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를 사용하는 이유

  1. 간결성: 데이터만 담는 클래스를 쉽게 정의하고, 메서드들을 자동으로 제공받을 수 있어 코드가 매우 간결해집니다.
  2. 비교 용이성: 객체 간의 내용 비교를 쉽게 할 수 있습니다. 객체의 메모리 주소를 비교하는 것이 아니라, 속성 값을 기준으로 equals()를 자동으로 제공합니다.
  3. 불변성: copy()를 통해 객체를 복사할 때 일부 속성만 변경할 수 있어, 불변 객체를 쉽게 다룰 수 있습니다.
  4. 자동 메서드 생성: hashCode(), toString() 등 유용한 메서드들이 자동 생성됩니다.