퉁탕퉁탕 만들어보자

Data class 본문

Computer/Kotlin

Data class

호숀티 2022. 4. 17. 12:44
반응형

java를 사용하면서 data 저장용으로만 사용되는 클래스를 만들어서 쓰는 일이 꽤 많다.

이때 java의 경우는 equals() 와 hashCode()를 override해서 재정의해주지 않으면, 모든 field값이 같더라도 비교연산이 제대로 수행되지 않는다.

kotlin에서는 data class를 제공하여 위 두 함수를 compiler가 알아서 만들어주기 때문에 좀더 편하게 작업이 가능하다.

 

사용법

data class User(val name: String, val age: Int)

 

*사용시 주의할점

primary constructor안에 있는 property 들에 대해서만 equals와 hashCode가 연산이 되기 때문에 

property를 생성자에 만들어야한다.

data class Person(val name: String) {
    var age: Int = 0
}
fun main() {
    val person1 = Person("John")
    val person2 = Person("John")
    person1.age = 10
    person2.age = 20
    
    // 나이가 다른데 true로 나옴
    println("person1 == person2: ${person1 == person2}")
}

 

*그 외 편리한점

1. toString() 도 알아서 만들어주는데, 이것도 디버깅할때 무지 편하게 쓸수있다.

data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person("John", 30)
    // 출력값: Person(name=John, age=30)
    println("${person1.toString()}")
}

2. copy() 함수를 제공하여 손쉽게 object 생성이 가능하다. 특정 필드의 값만 바꾸는 것도 가능하다.

data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person("John", 30)
    println("${person1.toString()}")
    //Person(name=John, age=30)
    
    val clone = person1.copy()
    println("${clone.toString()}")
    // Person(name=John, age=30)

    val babyClone = clone.copy(age=2)
    println("${babyClone.toString()}")
    // Person(name=John, age=2)
}

3. 구조분해 할당

이건 꼭 JS같은 느낌인데, 이런식으로 생성도 가능하다.

val jane = User("Jane", 35)

//name과 age에 각각 jane.name과 jane.age가 할당된다.
val (name, age) = jane

하지만 순서를 알고 써야하기 때문에 주의해서 잘 써야한다.

728x90
반응형

'Computer > Kotlin' 카테고리의 다른 글

Dokka 에서 SourceSet 설정하기  (0) 2023.05.14
Multi Module 프로젝트에서 Dokka 적용하기  (0) 2023.05.13
Kotlin Generic (in, out)  (0) 2022.04.23
Sealed class  (0) 2022.04.17
loops  (0) 2022.03.31