# Data Class

* 클래스 중 데이터만을 갖는 클래스
* 제약사항&#x20;
  * primary constructor (default constructor)를 선언해 주어야한다.
    * 그 인자는 1개 이상이어야 하며, 모두 Property여야 한다. ( var 혹은 val )
  * abstract, open, sealed, inner 가 아니어야 한다.
* 장점
* 컴파일러가 자동으로 equals(), hashcode(), copy(), toString() 메소드를 생성해준다.
* componentN() 함수를 제공한다. (Destructuring)
* 데이터에 대해 신경쓰지 않고 로직에만 집중할수 있다.

```java
//java
public class JavaPerson {

    private String firstName;

    private String lastName;

    private int age;

    public String getFirstName() { return firstName; }

    public void setFirstName(String firstName) { this.firstName = firstName; }

    public String getLastName() { return lastName; }

    public void setLastName(String lastName) { this.lastName = lastName; }

    public int getAge() { return age; }

    public void setAge(int age) { this.age = age; }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        JavaPerson that = (JavaPerson) o;

        if (age != that.age) {
            return false;
        }
        if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) {
            return false;
        }
        return lastName != null ? lastName.equals(that.lastName) : that.lastName == null;
    }

    @Override
    public int hashCode() {
        int result = firstName != null ? firstName.hashCode() : 0;
        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
        return result;
    }
}

//후...
```

```kotlin
//Kotlin에서의 data class 생성. class 키워드 앞에 data를 붙인다. 
data class DataClassPerson(val firstName: String, val lastName: String, val age: Int)
```

~~*간-결*~~

```kotlin
val person = Person("k", "H", 345)
val person1 = Person("k", "H", 345)

val dataClassPerson = DataClassPerson("k", "H", 345)
val dataClassPerson1 = DataClassPerson("k", "H", 345)

println(person == person1)                        //false, 동등성 비교를 위해 equals()를 재정의 해 줄 필요가 있다.
println(dataClassPerson == dataClassPerson1)      //true, 값이 다 같고 컴파일러가 내부적으로 equals()를 만들어 주기 때문에.

println(dataClassPerson.hashCode())               // ex) -1043107127
println(dataClassPerson1.hashCode())              // ex) -1043107127, 같은 값이 나온다.

println(person.toString())                        //Main$Person@76ed5528
println(dataClassPerson.toString())               //DataClassPerson(firstName="k", lastName="H", age=345)
                                                  //내부적으로 toString()을 만들어주기 때문.
```

기본적으로 Property 들만 만들어 주면 되고, 그 외에 커스텀하게 Function 이라던지 Method 라던지 어떤 상태를 표시해 주려면 그것들만 별도로 구현해 주면 된다.

```kotlin
data class Person(val firstName: String, val lastName: String, val age: Int)

val person = Person("k", "H", 345)

println(person.component(1))    //k
println(person.component(2))    //H
println(person.component(3))    //345
//컴포넌트를 가지고 이런식으로 가져오는 것을 Destructuring이라고 한다. 생성한것을 1개씩 1개씩 쪼개는 것.
//Destructuring을 하면 각각 하나가 변수가 되는것이고 각각 접근할 수가 있다.

val (firstName, lastName, age) = person

println(firstName)
println(lastName)
println(age)

//copy()
//data class에서 일부의 데이터만 변경해서 복사하고 싶을때 사용한다.
val copyPerson = person.copy(age = 19) //age의 값만 바뀐 데이터클래스.
println(copyPerson)    // Person(firstName=k, lastName=H, age=19)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gold.gitbook.io/kotlin/class/data-class.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
