English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本文中,您将学习在Kotlin中创建数据类。您还将了解数据类必须满足的要求及其标准功能。
이런 경우가 발생할 수 있습니다: 데이터를 저장하기 위한 클래스를 만들어야 합니다. 이 경우, 클래스를 data로 표시하여 데이터 클래스를 생성할 수 있습니다. 예를 들어,
data class Person(val name: String, var age: Int)
이러한 클래스에 대해 컴파일러는 자동으로 생성합니다:
copy() 함수, equals()와 hashCode() 및 메인 생성자의 toString() 형식
componentN() 함수
이 함수들에 대해 자세히 논의하기 전에, 데이터 클래스가 충족해야 하는 요구사항에 대해 논의해 보겠습니다.
요구사항은 다음과 같습니다:
메인 생성자는 최소한 하나의 매개변수를 가지고 있어야 합니다.
메인 생성자의 매개변수는 val(읽기 전용) 또는 var(읽기 및 쓰기)로 표시해야 합니다.
클래스는 공개적, 추상적, 내부적, 또는 닫힌 클래스가 될 수 없습니다.
이 클래스는 다른 클래스를 확장하거나 인터페이스를 구현할 수 있습니다. 만약 사용하고 계신 것은1.1이전의 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() 함수를 사용하여 다른 속성을 가진 객체 복제본을 생성할 수 있습니다. 그 작동 방식은 다음과 같습니다:
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() 함수는 객체의 문자열 표현을 반환합니다.
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() 메서드는 객체의 해시 코드를 반환합니다. 두 객체가 같다면, 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