2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

코틀린의 데이터 클래스에서 copy() 메소드의 사용 예시는?

_____
FAQ: Kotlin 데이터 클래스의 copy() 메소드 사용 예시

Q1. copy() 메소드란 무엇인가요?
A1. 데이터 클래스에 자동으로 추가되는 메소드로, 객체를 복제하면서 일부 프로퍼티만 변경할 때 유용합니다. 내부 구현은 주 생성자 파라미터를 기반으로 새 객체를 생성하는 얕은 복사(shallow copy) 방식입니다.

Q2. 기본 사용법 예시는 어떻게 되나요?
A2.
```
data class User(val name: String, val age: Int)

val user1 = User("Alice", 25)
// 모든 프로퍼티를 동일하게 복제
val user2 = user1.copy()
println(user2) // User(name=Alice, age=25)
```

Q3. 일부 프로퍼티만 변경하려면 어떻게 하나요?
A3. copy() 호출 시 변경할 프로퍼티만 이름으로 지정합니다.
```
val user3 = user1.copy(age = 26)
println(user3) // User(name=Alice, age=26)
```

Q4. 기본값(default value)이 있는 프로퍼티가 있으면 어떻게 작동하나요?
A4. 기본값은 별도 지정하지 않으면 그대로 유지됩니다.
```
data class Point(val x: Int = 0, val y: Int = 0)

val p1 = Point(5, 10)
val p2 = p1.copy(y = 20)
println(p2) // Point(x=5, y=20)
val p3 = p1.copy()
println(p3) // Point(x=5, y=10)
```

Q5. 중첩된(data class 내부에 data class) 객체를 복사할 때는?
A5. 외부 객체는 얕은 복사됩니다. 내부 데이터 클래스도 copy()를 호출해야 깊은 복사 느낌을 낼 수 있습니다.
```
data class Address(val city: String, val zip: String)
data class Person(val name: String, val address: Address)
val p1 = Person("Bob", Address("Seoul", "12345"))
val p2 = p1.copy()
// p2.address도 동일한 Address 인스턴스를 참조(얕은 복사)
println(p1.address === p2.address) // true

// 깊은 복사하려면 내부도 copy()
val p3 = p1.copy(address = p1.address.copy(zip = "54321"))
println(p3.address === p1.address) // false
```

Q6. copy() 사용 시 equals(), hashCode(), toString() 동작은 어떻게 되나요?
A6. 복제된 객체도 데이터 클래스이므로 equals(), hashCode(), toString()가 자동 생성된 형태로 동작합니다.
```
val u1 = User("Alice", 25)
val u2 = u1.copy()
println(u1 == u2) // true
println(u1.hashCode() == u2.hashCode()) // true
println(u2.toString()) // User(name=Alice, age=25)
```

Q7. copy() 호출 시 주의사항이 있나요?
A7.
- 복제된 객체의 프로퍼티가 뮤터블(mutable) 컬렉션이나 객체면 얕은 복사로 인해 원본과 참조 공유에 주의해야 합니다.
- 주 생성자 파라미터에만 적용되므로, 클래스 내부에 추가로 선언된 프로퍼티는 복제되지 않습니다.

Q8. 실전 예시: 주문 상태 관리
A8.
```
data class Order(val id: Int, val status: String)

fun advance(order: Order): Order =
when (order.status) {
"Pending" -> order.copy(status = "Confirmed")
"Confirmed" -> order.copy(status = "Shipped")
else -> order
}

var ord = Order(1, "Pending")
ord = advance(ord) // Order(id=1, status=Confirmed)
ord = advance(ord) // Order(id=1, status=Shipped)
```
코틀린데이터 클래스는 주로 불변(immutable) 객체를 만들기 위해 사용됩니다.

데이터 클래스는 `data` 키워드를 사용하여 정의되며, 주 생성자에 정의된 프로퍼티에 대해 자동으로 `equals()`, `hashCode()()`, `toString()`, `copy()()` 메소드를 생성합니다.

이 중 `copy()` 메소드는 객체의 복사본을 생성하면서 일부 프로퍼티의 값을 변경할 수 있는 유용한 기능을 제공합니다.

데이터 클래스 정의 먼저, 데이터 클래스를 정의해보겠습니다.

예를 들어, `Person`이라는 데이터 클래스를 만들어 보겠습니다.

```kotlin data class Person(val name: String, val age: Int) ``` 위의 `Person` 클래스는 두 개의 프로퍼티 `name`과 `age`를 가지고 있습니다.

이 클래스의 인스턴스를 생성하고, `copy()` 메소드를 사용하여 객체를 복사하는 방법을 살펴보겠습니다.

객체 생성 ```kotlin fun main() { val person1 = Person("Alice", 30) println(person1) // 출력: Person(name=Alice, age=30) } ``` 이제 `person1`이라는 객체가 생성되었습니다.

이 객체를 복사하고, 나이를 변경해보겠습니다.

copy() 메소드 사용 ```kotlin val person2 = person1.copy(age = 31) println(person

2) // 출력: Person(name=Alice, age=31) ``` 위의 코드에서 `person1.copy(age = 31)`을 호출하여 `person1`의 복사본을 만들고, `age` 프로퍼티만 31로 변경했습니다.

결과적으로 `person2`는 이름은 동일하지만 나이가 31인 새로운 객체가 됩니다.

여러 프로퍼티 변경 `copy()` 메소드는 여러 프로퍼티를 동시에 변경할 수도 있습니다.

예를 들어, 이름과 나이를 모두 변경해보겠습니다.

```kotlin val person3 = person1.copy(name = "Bob", age = 2

5) println(person

3) // 출력: Person(name=Bob, age=2

5) ``` 위의 코드에서 `name`과 `age`를 모두 변경하여 `person3`이라는 새로운 객체를 생성했습니다.

기본값과 함께 사용 데이터 클래스의 프로퍼티에 기본값을 설정할 수도 있습니다.

예를 들어, `Person` 클래스에 기본값을 추가해보겠습니다.

```kotlin data class Person(val name: String = "Unknown", val age: Int = 0) ``` 이제 기본값을 사용하여 객체를 생성할 수 있습니다.

```kotlin val person4 = Person() println(person

4) // 출력: Person(name=Unknown, age=0) ``` 기본값을 사용하면서 `copy()` 메소드를 활용하면, 특정 프로퍼티만 변경하면서 나머지는 기본값을 유지할 수 있습니다.

```kotlin val person5 = person4.copy(name = "Charlie") println(person

5) // 출력: Person(name=Charlie, age=0) ``` 결론 코틀린의 데이터 클래스에서 `copy()` 메소드는 객체를 쉽게 복사하고, 필요한 프로퍼티만 변경하여 새로운 객체를 생성할 수 있는 매우 유용한 기능입니다.

이는 불변 객체를 다루는 데 있어 코드의 가독성을 높이고, 객체의 상태를 안전하게 관리하는 데 도움을 줍니다.

데이터 클래스를 사용하면 객체의 상태를 쉽게 변경할 수 있는 방법을 제공하므로, 코틀린에서 객체 지향 프로그래밍을 보다 효과적으로 구현할 수 있습니다.

작성자: 최지은 [비회원] | 작성일자: 1년 전 2024-09-09 09:47:19
조회수: 219 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.