Kotlin의 data class — 개념, 구문 및 데이터 클래스 특징

저자: IT Sectr 게시일: 2026-06-20 읽는 시간: 10 분

data class는 Kotlin의 특별한 클래스 유형으로, 데이터 저장 전용으로 설계되었습니다. 컴파일러는 기본 생성자에 지정된 속성을 기반으로 equals, hashCode, toString, copy 및 componentN 메서드를 자동으로 생성합니다. JetBrains 문서(2026)에 따르면 data class는 Java에 비해 상용구 코드를 50~70% 줄일 수 있으며 Kotlin 프로젝트에서 값 객체의 기초가 됩니다.

핵심 요점

  • data — Kotlin에서 데이터 클래스를 선언하는 키워드
  • equals 및 hashCode — 기본 생성자의 모든 속성을 기반으로 자동 생성
  • copy — 개별 필드를 교체할 수 있는 얕은 복사 함수
  • componentN — data class를 개별 변수로 분해
  • 기본 생성자에는 최소 하나의 val 또는 var 매개변수가 있어야 함

Kotlin에서 data class란?

data class는 데이터 저장을 주요 목적으로 하는 클래스에 대해 표준 메서드를 자동으로 생성하는 Kotlin의 구문 구조입니다. data class를 선언하면 컴파일러가 기본 생성자의 모든 속성을 기반으로 equals, hashCode, toString, copy 및 componentN의 구현을 만듭니다.

개발자가 IDE나 Lombok과 같은 라이브러리를 사용하여 getter, setter, equals, hashCode 및 toString을 수동으로 작성해야 하는 Java의 일반 클래스와 달리, Kotlin은 내장 메커니즘을 제공합니다. 이는 코드를 줄일 뿐만 아니라 일관성을 보장합니다. 자동 메서드는 항상 현재 속성 구조와 일치합니다.

JetBrains Kotlin Survey(2025)에 따르면 data class는 Kotlin 프로젝트의 78%에서 사용되며, 이는 언어에서 가장 요구되는 기능 중 하나입니다. 특히 DTO, API 응답 모델 및 MVVM의 상태 객체를 사용하는 아키텍처에서 인기가 높습니다.

구문 및 기본 기능

data class는 class 앞에 data 키워드를 사용하여 선언합니다. 자동 메서드에 참여하는 모든 속성은 기본 생성자에 지정됩니다.

kotlin
data class User(
    val id: Int,
    val name: String,
    val email: String
)

줄의 코드로 Java의 수십 줄에 달하는 상용구를 대체합니다. 컴파일러는 세 가지 속성 모두에 대해 equals, hashCode, toString, copy 및 component1~component3을 생성합니다.

기본 생성자 외부의 속성

자동 메서드에는 기본 생성자의 속성만 포함됩니다. 클래스 본문에서 속성을 선언해도 equals, hashCode, toString 및 copy에 참여하지 않습니다.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice is NOT included in equals/hashCode/copy
}

기본 생성자의 제한 사항

data class의 기본 생성자에는 최소 하나의 매개변수가 있어야 합니다. 모든 매개변수는 val 또는 var로 표시되어야 합니다. data class에는 open, abstract, sealed 또는 inner 한정자를 사용할 수 없습니다.

자동 메서드 equals, hashCode 및 toString

equals와 hashCode는 기본 생성자의 모든 속성 값을 기반으로 생성됩니다. data class의 두 인스턴스는 해당하는 모든 속성이 같으면 동일한 것으로 간주됩니다.

값 비교를 위한 equals

Java에서 기본 객체 비교는 참조 비교(==)입니다. 값 비교를 위해서는 equals를 재정의해야 합니다. Kotlin data class는 이를 자동으로 수행하여 구조적 비교에 ==를 사용할 수 있게 합니다.

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

디버깅을 위한 toString

toString 메서드는 모든 속성의 이름과 값을 포함한 읽기 쉬운 객체 표현을 반환합니다. 이는 기본 출력이 16진수 형식의 해시 코드를 표시하는 Java와 비교하여 로깅 및 디버깅을 크게 단순화합니다.

Kotlin 문서(2026)에 따르면 data class의 toString 형식은 “User(id=1, name=John, email=john@example.com)”입니다. 기본 생성자에서 속성을 제거하면 toString이 자동으로 업데이트되어 동기화 해제 위험이 없습니다.

copy 함수 및 구조 분해

copy는 data class의 주요 기능 중 하나입니다. 지정된 속성의 값을 변경할 수 있는 얕은 복사본을 만듭니다.

kotlin
data class Order(
    val id: Long,
    val status: String,
    val amount: Double
)

val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"

copy는 함수형 스타일과 불변성(immutability)을 갖춘 아키텍처에서 필수적입니다. 기존 객체를 변경하는 대신 수정된 필드로 새 복사본을 만들어 코드를 더 예측 가능하게 하고 멀티스레드 시나리오에서 안전하게 만듭니다.

componentN을 통한 구조 분해

data class는 선언 순서대로 각 속성에 대해 component1, component2 등의 함수를 자동으로 생성합니다. 이를 통해 객체를 변수로 분해할 수 있습니다.

kotlin
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)")  // "1: Alice (alice@example.com)"

구조 분해는 람다 및 for-each 루프에서도 작동하여 data class를 컬렉션 작업에 편리하게 만듭니다.

제한 사항 및 권장 사항

첫 번째 제한 — data class는 다른 data class의 상속을 지원하지 않습니다. 일반 클래스나 인터페이스에서만 상속할 수 있습니다.

두 번째 — 자동 메서드에는 기본 생성자의 속성만 포함됩니다. 클래스 본문의 속성은 무시되므로 이를 잊으면 잘못된 equals가 발생할 수 있습니다.

세 번째 — data class는 open, abstract, sealed 또는 inner가 될 수 없습니다. 항상 final입니다.

네 번째 — data class 내부의 컬렉션에 대해 copy는 얕은 복사를 수행합니다. 복사된 컬렉션 내부의 요소를 변경하면 원본에 영향을 미칩니다.

Kotlin 모범 사례(2026)에 따르면 data class는 DTO, API 모델, 값 객체 및 상태 객체에 최적입니다. 비즈니스 로직이 있는 구성 요소에는 일반 클래스를 사용하는 것이 좋습니다.

자주 묻는 질문

data class가 다른 data class를 상속할 수 있나요?

아니요, data class는 다른 data class를 상속할 수 없습니다. 그러나 일반 클래스를 상속하거나 인터페이스를 구현할 수 있습니다.

기본 생성자에 몇 개의 속성이 있어야 하나요?

최소 하나의 속성이 필요합니다. 최대 개수는 제한이 없지만 구조 분해를 위해 componentN이 생성됩니다.

클래스 본문의 속성이 equals에 영향을 미치나요?

아니요, 자동 메서드는 기본 생성자의 속성만 고려합니다. 클래스 본문의 속성은 equals, hashCode, toString 및 copy에 참여하지 않습니다.

자동 메서드를 수동으로 재정의할 수 있나요?

예, 당신은 data class 본문에서 equals, hashCode 또는 toString을 재정의할 수 있습니다. 이 경우 컴파일러는 자체 구현을 생성하지 않습니다.

data class는 일반 클래스와 어떻게 다른가요?

data class는 equals, hashCode, toString, copy 및 componentN을 자동으로 생성합니다. 일반 클래스는 수동 구현 없이는 이러한 메서드를 제공하지 않습니다.

요약

  • data class — 자동 생성 메서드로 데이터를 저장하기 위한 Kotlin 구문 구조
  • equals 및 hashCode — 기본 생성자 속성을 기반으로 한 구조적 비교
  • toString — 디버깅 및 로깅을 위한 객체의 읽기 쉬운 표현
  • copy — 명명된 인수로 개별 필드를 교체하는 얕은 복사
  • componentN — 컬렉션 작업을 위한 객체의 변수로의 구조 분해
  • 제한 — 기본적으로 final, 최소 하나의 속성, data->data 상속 불가
  • 용도 — DTO, API 모델, 값 객체, MVVM의 상태

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기