안드로이드/Kotlin

[Kotlin] 데이터 클래스(Data class)

block_626 2022. 7. 30. 01:41
class Person (var name: String, var age: Int, var sex: String)

fun main() {
    val person1 = Person("Alice", 20, "female")
    println(person1) // -> Person@71be98f5
}

Data Class

Kotlin은 기존의 Java Data Class보다 손쉽게 Data Class를 정의할 수 있습니다.

 


class Person (var name: String, var age: Int, var sex: String)

fun main() {
    val person1 = Person("Alice", 20, "female")
    println(person1) // -> Person@71be98f5
}

Person 클래스 안에 name, age, sex 3가지 프로퍼티가 있습니다.

현재 println을 통해 값을 출력하게 되면 Person@71be98f5와 같이 랜덤한 문자로 되어진 값이 출력이 됩니다.

코틀린에서 클래스를 만들때는 Java Language spec에 따라서 toString, equal, hashCoide라는 메서드를

구현해야야 합니다.


toString

class Person (
    var name: String,
    var age: Int,
    var sex: String
) {
    override fun toString(): String {
        return "Person(name=$name, age=$age, sex=$sex)"
    }
}
fun main() {
    val person1 = Person("Alice", 20, "female")
    println(person1) // -> Person(name=Alice, age=20, sex=female)
}

클래스에 toString을 override를 해주면 됩니다.

클래스에 toString을 override를 해주게되면 랜덤한 문자값이 아니라 클래스가 가진 property를 보여줍니다.


equals

class Person (
    var name: String,
    var age: Int,
    var sex: String
) {
    override fun toString(): String {
        return "Person(name=$name, age=$age, sex=$sex)"
    }

    override fun equals(other: Any?): Boolean {
        if(other == null || other !is Person) return false
        return name == other.name && age == other.age && sex == other.sex
    }
}

fun main() {
    val person1 = Person("Alice", 20, "female")
    println(person1) // -> Person(name=Alice, age=20, sex=female)
    
    val person2 = Person("Bob", 22, "Male")
    val person3 = Person("Bob", 22, "Male")
    println(person2 == person3) // false -> true
}

person2와 person3의 내용이 동일함에도 불구하고 두 인스턴스가 같지 않다는 판정이 나오게됩니다.(false)

equals는 같은 클래스로부터 인스턴스를 만들었을때 클래스 내부 property가 동일하면 같은 인스턴스로 취급할지 판단하는 메서드입니다.

클래스에 equals를 override 해주게되면 true로 값이 바뀌게 됩니다.

equals에서는 비교대상이 되는 instance를 받아서 null이거나 Person클래스가 아닐 경우에는 false를 반환하지만

Instance Property가 일치할 경우 동일한 객체라는 true판정을 받게됩니다.


hashCode

class Person (var name: String,var age: Int, var sex: String) {
    override fun toString(): String {
        return "Person(name=$name, age=$age, sex=$sex)"
    }

    override fun equals(other: Any?): Boolean {
        if(other == null || other !is Person) return false
        return name == other.name && age == other.age && sex == other.sex
    }

    override fun hashCode(): Int {
        return (name.hashCode() * 31 + age - sex.hashCode()) * 31
    }
}

fun main() {
    val person1 = Person("Alice", 20, "female")
    println(person1) // -> Person(name=Alice, age=20, sex=female)

    val person2 = Person("Bob", 22, "Male")
    val person3 = Person("Bob", 22, "Male")/
    println(person2 == person3) // false -> true

    val personSet = hashSetOf(Person("Alice", 20, "Female"))
    println(personSet.contains(Person("Alice", 20, "Female"))) // false -> true
}

hashCode는 instance의 hash값을 정의하는 메서드입니다.

이 부분을 정의하지 않으면 equals값이 동일하더라도 서로 다른 객체가 되어버립니다.

클래스에 hashCode를 override해주게되면 값이 true로 바뀌게됩니다.


DataClass

data class Person (var name: String, var age: Int, var sex: String)

그냥 property만을 가지는 단순한 클래스일 경우에는 toString, equals, hashCode 다 정의해주는 것이 번거로운 일이기 때문에 코틀린에서는 DataClass라는 새로운 클래스가 있습니다.

DataClass를 사용하면 위에서 언급한 toString, equals, hashCode메서드를 다 자동으로 정의해주기 때문에 간단하게 클래스를 만들 수 있습니다.

DataClass를 사용하는 방법은 간단합니다.

클래스 앞에 data라는 접두어를 붙혀주기만 하면 됩니다.

DataClass - Copy Mothod

data class Person (var name: String, var age: Int, var sex: String)

fun main() {
    val person1 = Person("Bob", 22, "Male")
    val person2 = person4.copy(name = "Alice")
    println(person2) // Person(name=Alice, age=22, sex=Male)
}

 copy는 이미 존재하는 instance의 파라미터만을 바꿔서 사용할 객체를 만들어주는 메서드입니다.

이때 복사는 얕은 복사로 이루어집니다.

Person("Bob", 22, "Male")을 복사해서 name만 Alice로 바꿉니다.

DataClass - destructuring declarations

data class Person (var name: String, var age: Int, var sex: String)

fun main() {
    val person1 = Person("Alice", 24, "Female")
    val (name, age, sex) = person1
    println("$name, $age years old $sex") // Alice, 24 years old Female
}

destructuring declarations는 객체가 소우한 데이터를 쪼개주는 기능을 제공합니다.

'안드로이드 > Kotlin' 카테고리의 다른 글

[Kotlin] Toolbar Custom해보기  (0) 2022.09.28
[Kotlin] Splash 화면 만들기  (0) 2022.08.16
[Kotlin] var와 val의 차이점  (0) 2022.08.06
[Kotlin] View Binding  (0) 2022.07.27
[Kotlin] lateinit과 by lazy  (0) 2022.04.29