[kotlin] Data Class

dnjstjt12·2024년 6월 29일

Data Class

코틀린에서 data class는 주로 데이터를 보관하는데 사용된다.

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

컴파일러는 인스턴스를 문자열로 출력해주거나, 비교하고, 복사하는 작업을 하는 함수를 자동으로 생성한다.

  • equals()/ hashCode()
  • toString()
  • componentN()
  • copy()

data class의 특징

  • 기본 생성자는 파라미터가 하나 이상 있어야한다.
  • 모든 파라미터는 val 이나 var로 표시해야 한다.
  • abstract, open, sealed, inner class로 선언할 수 없다.
  • data class안에 equals(), toString(), hashCode()를 Override를 사용해 재정의 가능

toString()

toString메서드를 통해 해당 클래스에 대한 정보를 반환해 준다.

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

fun main() {
  var A = User("abcd",1)
  println(A.toString())
}
User(name=abcd, age=1)

equals()

두 객체가 동일한지 판단해 준다.

자바와 다르게 코틀린에서 참조 타입에서 "=="를 연산자를 사용할 경우 equals()를 호출한다.
"==="를 사용할 경우 참조 타입의 주소 값을 비교해준다.

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

fun main() {
  var A = User("abcd",1)
  var B = User("abcd",1)
  println(A.equals(B))
  println(A==B)
  println(A===B)
}
true
true
false

hashCode()

객체를 식별할 수 있는 정수값을 반환한다.

eqauls()는 hashCode()를 호출 해 두 객체의 hashcode를 비교한 후, hashcode가 동일한 경우 두 객체의 class가 같은 지 비교한다.

equals이 true면 두 객체의 hashCode는 같지만, 두 객체의 hashCode가 같으면 equals는 true가 아닐 수 있다.

다음은 class가 다르지만, 원소의 값은 같은 두 객체의 예시이다.

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

fun main() {
    var A = User("abcd",1)
    var B = User1("abcd",1)
    println(A.hashCode() == B.hashCode())
    println(A.equals(B))
}
true
false

A,B의 class는 다르지만, 원소의 값이 같기 때문에 hashCode값은 같다.
class가 다르기 때문에 equals()결과는 false이다.

ComponentN()

data class의 생성자에 속성순서 N에 대해, componentN을 지원한다.

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

fun main() {
    var A = User("abcd",1)
    println(A.component1())
    println(A.component2())
}
abcd
1

Copy()

객체를 복사하는 기능과, 나머지 속성을 변경하지 않고 일부 속성을 변경할 때 사용된다.

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

fun main() {
    var A = User("abcd",1)
    println(A.copy().toString())
    println(A.copy(name = "efgh").toString())
}
User(name=abcd, age=1)
User(name=efgh, age=1)

구조 분해

data class에 대해 생성된 요소를 구조 분해 선언할 수 있다.

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

fun main() {
    var A = User("abcd",1)
    var(name,age) = A
    println("${name}, ${age}")
}
abcd, 1

참고
https://kotlinlang.org/docs/data-classes.html#data-classes-and-destructuring-declarations
https://devhyeon0312.tistory.com/34

profile
안녕하세요!

0개의 댓글