코틀린 데이터 클래스와 객체 복사

데이터 클래스(Data Class)와 객체 복사(copy)

데이터 클래스는 데이터를 저장하고 전달하는 용도로 최적화된 클래스이다.
코틀린에서는 data 키워드 하나로 자동으로 여러 편의 기능을 제공한다.


데이터 클래스 기본 선언

data class User(val name: String, val age: Int)

이 한 줄로 아래 기능들이 자동 생성된다.

  1. toString()

  2. equals() / hashCode()

  3. copy()

  4. componentN() (구조 분해 선언)


데이터 클래스의 주요 특징

항목 설명
키워드 data
목적 값 저장 중심 클래스
생성자 반드시 최소 하나의 매개변수 필요
기본 생성 메서드 toString, equals, hashCode, copy, componentN 자동 생성
open / abstract 불가 상속에는 제한이 있음 (final 클래스)

데이터 클래스 생성 및 사용 예시

data class Person(val name: String, val age: Int)

val p1 = Person(“재은”, 29)
val p2 = Person(“재은”, 29)

println(p1) // 출력: Person(name=재은, age=29)
println(p1 == p2) // 출력: true (값 비교)
println(p1 === p2) // 출력: false (참조 비교)


copy() 함수로 객체 복사

데이터 클래스의 핵심 기능 중 하나는 copy() 함수다.
기존 객체의 일부 속성만 변경하여 새 객체를 만들 수 있다.

val user1 = User("재은", 29)
val user2 = user1.copy(age = 30)
println(user1) // User(name=재은, age=29)
println(user2) // User(name=재은, age=30)

copy()는 얕은 복사(Shallow Copy)

copy()기본 타입(primitive) 은 새로 복사하지만,
참조 타입(reference) 은 주소만 복사한다.

data class Address(val city: String)
data class Person(val name: String, val address: Address)
val p1 = Person(“재은”, Address(“서울”))
val p2 = p1.copy()p2.address.city = “부산”

println(p1.address.city) // 출력: 부산 (같은 참조)

깊은 복사(Deep Copy) 가 필요하다면 직접 구현해야 한다.


구조 분해 선언 (Destructuring Declarations)

데이터 클래스는 componentN() 함수를 자동 생성하기 때문에 구조 분해가 가능하다.

val user = User("재은", 29)
val (name, age) = user
println(name) // 재은
println(age) // 29

equals()와 hashCode() 자동 생성

equals()는 값 기반 비교,
hashCode()는 값에 따라 동일한 해시값을 자동 생성한다.

val u1 = User("재은", 29)
val u2 = User("재은", 29)
println(u1 == u2) // true
println(u1.hashCode() == u2.hashCode()) // true

toString() 자동 생성

객체를 문자열로 표현할 때 보기 좋게 자동으로 변환된다.

println(User("재은", 29)) // User(name=재은, age=29)

데이터 클래스와 일반 클래스 비교

구분 일반 클래스 데이터 클래스
선언 키워드 class data class
toString() 수동 구현 필요 자동 생성
equals() / hashCode() 수동 구현 필요 자동 생성
copy() 없음 자동 생성
구조 분해 불가능 가능

데이터 클래스에서 사용 불가한 문법

  1. abstract, open, sealed, inner 클래스는 불가능

  2. 주 생성자에 최소 하나의 val 또는 var 파라미터 필요

// 잘못된 예시
data class Invalid(val name: String) {
// inner class 불가능
inner class Inner
}

실전 예시: 서버 응답 모델

데이터 클래스는 API 응답 객체로 자주 사용된다.

data class ApiResponse(
val status: String,
val code: Int,
val message: String
)
val res = ApiResponse(“success”, 200, “정상 처리되었습니다.”)
println(res)

실전 예시: 리스트 비교 및 복사

data class Product(val id: Int, val name: String)

val p1 = Product(1, “노트북”)
val p2 = Product(1, “노트북”)

println(p1 == p2) // true (값 동일)
println(p1.copy(name = “태블릿”)) // Product(id=1, name=태블릿)


  • DTO, VO, Model 클래스로 가장 적합하다.

  • copy()를 활용하면 불변 객체(Immutable Object)처럼 다룰 수 있다.

  • equals() 자동 생성 덕분에 리스트 비교나 Map 키로도 유용하다.

  • 깊은 복사(Deep Copy)가 필요한 경우, 중첩 데이터 클래스에 대해 수동 구현을 고려하자.



게시됨

카테고리

작성자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다