IT기기 팁

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

lt8492 2025. 12. 6. 14:52
반응형

 

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

데이터 클래스는 데이터를 저장하고 전달하는 용도로 최적화된 클래스이다.

코틀린에서는 data 키워드 하나로 자동으로 여러 편의 기능을 제공한다.


데이터 클래스 기본 선언

 

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

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

  1. toString()
  2. equals() / hashCode()
  3. copy()
  4. 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()
없음
자동 생성
구조 분해
불가능
가능
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

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

  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)가 필요한 경우, 중첩 데이터 클래스에 대해 수동 구현을 고려하자.

 

 

반응형

'IT기기 팁' 카테고리의 다른 글

코틀린 인터페이스  (0) 2025.12.06
코틀린 클래스와 상속  (0) 2025.12.06
코틀린 객체와 동반 객체  (0) 2025.12.06
코틀린 상속과 인터페이스  (0) 2025.12.06
코틀린 클래스  (0) 2025.12.06