본문 바로가기
Language/Kotlin

[Kotlin] 데이터 클래스(Data Classes)란?

by Jay Son 아기 냥이 해린 짱💖 2021. 7. 14.

코틀린 데이터 클래스(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

 

 

반응형