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