# dataClass

이 글에서는 data class에서 derive된 copy(), componentN()을 다룰 것이다.\
getter, setter 및 equals(), hashCode()는 이전에 써둔 글을 참조하면 된다.

## copy()

```
data class User(val name: String, val phone: String){
}

val user1 = User("ingkells","galaxy")
val user2 = user1.copy(phone = "iphone") // name만 변경하고자 할 때

println(user1.toString())
println(user2.toString())
```

출력값

```
User(name=ingkells, phone=galaxy)
User(name=ingkells, phone=iphone)
```

data class의 copy에 매개변수로 원하는 값을 넣으면 그 부분만 바꾸어서 복사를 해준다는 것을 알 수 있다.

## 객체 destructuring

```
val (name, phone) = user1
val (_, phone) = user2
```

위 코드의 첫째줄처럼 객체가 가지고 있는 프로퍼티를 개별 변수로 분해하여 할당할 수 있다.\
두번째줄은 첫번째 인자가 필요없을 경우 사용하지 않음을 '\_'을 사용하여 나타내는 것이다.

이는 for in 을 사용한 반복문 구조, 람다식 등에 유용하게 사용될 수 있다.

### destructuring 예시 코드

```
// userList는 User를 자료형으로하는 list
for((name, phone) in userList){
    println(name, phone)
}

val lambda = {
    (name, phone): User ->
    println(name, phone)
}

lambda(user1)
```

## componentN()

```
val name = user1.component1()
val phone = user1.component2()
```

위 코드는 기본적인 component()을 보여준다.\
componentN()으로 프로퍼티의 순서대로 프로퍼티를 가져올 수 있는 것이다.
