코틀린 데이터 클래스(Data Classes)란?
1. 값을 저장하는 클래스를 쉽게 만들 수 있다.
2. 복사, 문자열 가져오기
3. 메소드 재정의 할 수 있다.
data class User(val name: String, val id: Int) { // 1
override fun equals(other: Any?) =
other is User && other.id == this.id // 2
}
fun main() {
val user = User("Alex", 1)
println(user) // 3
val secondUser = User("Alex", 1)
val thirdUser = User("Max", 2)
println("user == secondUser: ${user == secondUser}") // 4
println("user == thirdUser: ${user == thirdUser}")
// hashCode() function
println(user.hashCode()) // 5
println(secondUser.hashCode())
println(thirdUser.hashCode())
// copy() function
println(user.copy()) // 6
println(user === user.copy()) // 7
println(user.copy("Max")) // 8
println(user.copy(id = 3)) // 9
println("name = ${user.component1()}") // 10
println("id = ${user.component2()}")
}
결과
3 : User(name=Alex, id=1)
4 : user == secondUser: true
user == thirdUser: false
5: 63347075
63347075
2390846
6 : User(name=Alex, id=1)
7 : false
8 : User(name=Max, id=1)
9 : User(name=Alex, id=3)
10 : name = Alex :
id = 1
설명
1. 데이터 클래스 생성.
2. 동일한 ID를 가진 사용자를 동일하게 선언하여 equals() 메소드를 재정의
3. toString() 메소드가 기본적으로 구현되어 있어 데이터 링크 정보 출력 됨
4. ID가 동일한 경우 동일한 인스턴스로 판단
5. 데이터 클래스 기본 구현되어 있는 hashCode() 메소드를 사용 할 경우 객체 주소값을 확인 할 수 있어 동일한 인스턴스 확인을 위해 사용
6. 데이터 클래스 기본 구현되어 있는 copy() 메소드를 사용해 쉽게 동일한 데이터 클래스를 복사 할 수 있음.
7. 데이터 클래스 기본 생성된 인스턴스와 copy() 된 인스턴스를 비교 할 경우 다른 것을 확인 할 수 있다. (동일한 값을 가진 데이터 클래스가 별도로 생성됨)
8. copy()와 동시에 특정한 값을 변경해서 복사 할 수 있음.
9. copy()와 동시에 ID값도 변경 가능(8번과 크게 차이점과 활용 방법은 확인 필요)
10. componentN 메소드를 이용해서 속성 값 선언 순서대로 값을 가져 올 수 있음.
JAVA 비교
public class Person implements Serializable {
private final String firstName;
private final String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Person withFirstName(String firstName) {
return new Person(firstName, lastName);
}
public Person withLastName(String lastName) {
return new Person(firstName, lastName);
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Person person = (Person) o;
if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) {
return false;
}
if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) {
return false;
}
return true;
}
public int hashCode() {
int result = firstName != null ? firstName.hashCode() : 0;
result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
return result;
}
public String toString() {
return "Person(" + firstName + "," + lastName + ")";
}
}
출처 : https://gist.github.com/torifat/353d45b1058b93a9ec85
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 클래스를 봉인한다.(Sealed Classes)란? (0) | 2021.07.17 |
---|---|
[Kotlin] enum 클래스(Enum Classes)란? (0) | 2021.07.17 |
[Kotlin] if 조건문 (Conditional Expression) (34) | 2021.06.28 |
[Kotlin] 반복문 만들기 (Loops) (0) | 2021.06.21 |
[Kotlin] 상속 클래스 만들기 (Inheritance) (0) | 2021.06.20 |