Data Class

  • 클래스 중 데이터만을 갖는 클래스

  • 제약사항

    • primary constructor (default constructor)를 선언해 주어야한다.

      • 그 인자는 1개 이상이어야 하며, 모두 Property여야 한다. ( var 혹은 val )

    • abstract, open, sealed, inner 가 아니어야 한다.

  • 장점

  • 컴파일러가 자동으로 equals(), hashcode(), copy(), toString() 메소드를 생성해준다.

  • componentN() 함수를 제공한다. (Destructuring)

  • 데이터에 대해 신경쓰지 않고 로직에만 집중할수 있다.

//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에서의 data class 생성. class 키워드 앞에 data를 붙인다. 
data class DataClassPerson(val firstName: String, val lastName: String, val age: Int)

간-결

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 라던지 어떤 상태를 표시해 주려면 그것들만 별도로 구현해 주면 된다.

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)

Last updated