English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin 데이터 클래스(Data)

在本文中,您将学习在Kotlin中创建数据类。您还将了解数据类必须满足的要求及其标准功能。

이런 경우가 발생할 수 있습니다: 데이터를 저장하기 위한 클래스를 만들어야 합니다. 이 경우, 클래스를 data로 표시하여 데이터 클래스를 생성할 수 있습니다. 예를 들어,

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

이러한 클래스에 대해 컴파일러는 자동으로 생성합니다:

  • copy() 함수, equals()와 hashCode() 및 메인 생성자의 toString() 형식

  • componentN() 함수

이 함수들에 대해 자세히 논의하기 전에, 데이터 클래스가 충족해야 하는 요구사항에 대해 논의해 보겠습니다.

Kotlin 데이터 클래스의 요구사항

요구사항은 다음과 같습니다:

  • 메인 생성자는 최소한 하나의 매개변수를 가지고 있어야 합니다.

  • 메인 생성자의 매개변수는 val(읽기 전용) 또는 var(읽기 및 쓰기)로 표시해야 합니다.

  • 클래스는 공개적, 추상적, 내부적, 또는 닫힌 클래스가 될 수 없습니다.

  • 이 클래스는 다른 클래스를 확장하거나 인터페이스를 구현할 수 있습니다. 만약 사용하고 계신 것은1.1이전의 Kotlin 버전에서는 이 클래스는 인터페이스를 구현할 수 있습니다.

示例:Kotlin 数据类使用

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val jack = User("jack", 29)
    println("이름 = ${jack.name}")
    println("나이 = ${jack.age}")
}

이 프로그램을 실행할 때, 출력은 다음과 같습니다:

name = jack
age = 29

데이터 클래스를 선언할 때, 컴파일러는 배경에서 toString()、equals()、hashCode() 등과 같은 여러 함수를 자동으로 생성합니다. 이는 코드의 간결성을 유지하는 데 도움이 됩니다. Java를 사용하면 많은 스탬플 코드를 작성해야 합니다.
다음 함수를 사용해 보겠습니다:

copy() 함수 - 복제

데이터 클래스에서는 copy() 함수를 사용하여 다른 속성을 가진 객체 복제본을 생성할 수 있습니다. 그 작동 방식은 다음과 같습니다:

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
   
    //복제 함수를 사용하여 객체를 생성합니다
    val u2 = u1.copy(name = "Randy")
    println("u1: name = ${u1.name}, name = ${u1.age")
    println("u2: name = ${u2.name}, name = ${u2.age")
}

이 프로그램을 실행할 때, 출력은 다음과 같습니다:

u1: name = John, name = 29
u2: name = Randy, name = 29

toString() 메서드 - 문자열 반환

toString() 함수는 객체의 문자열 표현을 반환합니다.

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
    println(u1.toString())
}

이 프로그램을 실행할 때, 출력은 다음과 같습니다:

User(name = John, age =29)

hashCode()와 equals()

hashCode() 메서드는 객체의 해시 코드를 반환합니다. 두 객체가 같다면, hashCode()는 같은 정수 결과를 생성합니다.

두 객체가 같다면 (hashCode()가 같다면), equals()가 true를 반환합니다. 객체가 다르다면, equals()가 false를 반환합니다.

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
    val u2 = u1.copy()
    val u3 = u1.copy(name = "Amanda")
    println("u1 hashCode = ${u1.hashCode()")
    println("u2 hashCode = ${u2.hashCode()")
    println("u3 hashCode = ${u3.hashCode()")
    if (u1.equals(u2) == true)
        println("u1 == u2.")
    else
        println("u1 != u2.")
    if (u1.equals(u3) == true)
        println("u1 == u3.")
    else
        println("u1 != u3.")
}

이 프로그램을 실행할 때, 출력은 다음과 같습니다:

u1 hashCode = 71750738
u2 hashCode = 71750738
u3 hashCode = 771732263
u1 == u2.
u1 != u3.

해석 성명

해석 성명을 사용하여 객체를 여러 변수로 분해할 수 있습니다. 예를 들어:

data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")
    val (name, age, gender) = u1
    println("이름 = $name")
    println("나이 = $age")
    println("성별 = $gender")
}

이 프로그램을 실행할 때, 출력은 다음과 같습니다:

name = John
age = 29
gender = Male

이는 컴파일러가 데이터 클래스에 대해 component() 함수의 모든 속성을 생성할 것이기 때문에 가능합니다. 예를 들어:

data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")
    println(u1.component1())     // John
    println(u1.component2())     // 29  
    println(u1.component3())     // "Male"
}

이 프로그램을 실행할 때, 출력은 다음과 같습니다:

John
29
Male