데이터 클래스(Data Class)와 객체 복사(copy)
데이터 클래스는 데이터를 저장하고 전달하는 용도로 최적화된 클래스이다.
코틀린에서는 data 키워드 하나로 자동으로 여러 편의 기능을 제공한다.
데이터 클래스 기본 선언
data class User(val name: String, val age: Int)
이 한 줄로 아래 기능들이 자동 생성된다.
- toString()
- equals() / hashCode()
- copy()
- componentN() (구조 분해 선언)
데이터 클래스의 주요 특징
- 0열 선택0열 다음에 열 추가
- 1열 선택1열 다음에 열 추가
- 0행 선택0행 다음에 행 추가
- 1행 선택1행 다음에 행 추가
- 2행 선택2행 다음에 행 추가
- 3행 선택3행 다음에 행 추가
- 4행 선택4행 다음에 행 추가
- 5행 선택5행 다음에 행 추가
|
항목
|
설명
|
|
키워드
|
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) = userprintln(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)
데이터 클래스와 일반 클래스 비교
- 0열 선택0열 다음에 열 추가
- 1열 선택1열 다음에 열 추가
- 2열 선택2열 다음에 열 추가
- 0행 선택0행 다음에 행 추가
- 1행 선택1행 다음에 행 추가
- 2행 선택2행 다음에 행 추가
- 3행 선택3행 다음에 행 추가
- 4행 선택4행 다음에 행 추가
- 5행 선택5행 다음에 행 추가
|
구분
|
일반 클래스
|
데이터 클래스
|
|
선언 키워드
|
class
|
data class
|
|
toString()
|
수동 구현 필요
|
자동 생성
|
|
equals() / hashCode()
|
수동 구현 필요
|
자동 생성
|
|
copy()
|
없음
|
자동 생성
|
|
구조 분해
|
불가능
|
가능
|
- 셀 병합
- 행 분할
- 열 분할
- 너비 맞춤
- 삭제
데이터 클래스에서 사용 불가한 문법
- abstract, open, sealed, inner 클래스는 불가능
- 주 생성자에 최소 하나의 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)가 필요한 경우, 중첩 데이터 클래스에 대해 수동 구현을 고려하자.
'IT기기 팁' 카테고리의 다른 글
| 코틀린 인터페이스 (0) | 2025.12.06 |
|---|---|
| 코틀린 클래스와 상속 (0) | 2025.12.06 |
| 코틀린 객체와 동반 객체 (0) | 2025.12.06 |
| 코틀린 상속과 인터페이스 (0) | 2025.12.06 |
| 코틀린 클래스 (0) | 2025.12.06 |