kotlin

kotlin Data classes

slow333 2023. 2. 6. 22:54

data model 구현에 필요한 class

데이터를 보유하는 것이 주된 목적인 클래스를 만드는 것은 드문 일이 아닙니다. 이러한 클래스에서 일부 표준 기능과 일부 유틸리티 기능은 종종 데이터에서 기계적으로 파생될 수 있습니다. Kotlin에서는 이를 데이터 클래스 라고 하며 다음 과 같이 표시됩니다

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

컴파일러는 기본 생성자에 선언된 모든 속성에서 다음 멤버를 자동으로 파생시킵니다.

  • equals()/hashCode() pair
  • toString() of the form "User(name=John, age=42)"
  • componentN() functions corresponding to the properties in their order of declaration.
  • copy() function (see below).

 

생성된 코드의 일관성과 의미 있는 동작을 보장하려면 데이터 클래스가 다음 요구 사항을 충족해야 합니다.

  • 기본 생성자에는 최소한 하나의 매개변수가 있어야 합니다.
  • 모든 기본 생성자 매개변수는 val또는 var로 표시되어야 합니다 .
  • Data classes는 abstract, open, sealed 또는 inner 일수 없습니다.
data class User(val name: String = "", val age: Int = 0)
 

Properties declared in the class body

컴파일러는 자동으로 생성된 함수에 대한 기본 생성자 내부에 정의된 속성만 사용합니다. 생성된 구현에서 속성을 제외하려면 클래스 본문 내에서 속성을 선언합니다.

data class Person(val name: String) {
    var age: Int = 0
}
속성 이름 만 toString()equals()hashCode()copy()component1() 내부에서 사용되며 component function component1()는 하나만 있습니다 .  Person 개체의 age는 다를 수 있지만 동일한 것으로 취급됩니다.
 
val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20
 

Copying

copy() 기능을 사용하여 개체를 복사 하면 나머지 속성은 변경하지 않고 일부 속성 을 변경할 수 있습니다 . 위 의 클래스에 대한 이 함수의 구현은 다음과 같습니다.

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
 
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
 

Data classes와 구조 분해(destructuring) declarations

데이터 클래스에 대해 생성된 구성 요소 함수를 사용하면 destructuring declarations을 하는 데 사용할 수 있습니다 .

val jane = User("Jane", 35)

jane.component1() // "Jane"
jane.component2() // 35

val (name, age) = jane
println("$name, $age years of age") // prints "Jane, 35 years of age"
 

표준 데이터 클래스

표준 라이브러리는 Pair및 Triple클래스를 제공합니다. 그러나 대부분의 경우 명명된 데이터 클래스는 속성에 의미 있는 이름을 제공하여 코드를 더 읽기 쉽게 만들기 때문에 더 나은 디자인 선택입니다.

'kotlin' 카테고리의 다른 글

kotlin collection  (0) 2023.02.07
kotlin OOB- inheretance  (0) 2023.02.07
kotlin OOB basic  (0) 2023.02.06
kotlin data type  (0) 2023.02.06
Kotlin enum, lateinit, couroutine 등  (0) 2023.01.14