조용한 담장

코틀린(Kotlin) 클래스(Class) : 데이터 클래스 (Data Classes) 본문

kotlin

코틀린(Kotlin) 클래스(Class) : 데이터 클래스 (Data Classes)

iosroid 2019. 12. 31. 18:16

코틀린의 데이터 클래스(data class) 에 관해 살펴보자.

원문 https://kotlinlang.org/docs/reference/data-classes.html 을 보며 정리.

 

data 를 저장하기 위한 클래스를 data class 라 하며 data 로 표시한다.

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

컴파일러가 자동으로 primary constructor 의 properties 로 부터 아래의 멤버들을 생성한다.

  • equals() / hashCode() pair;
  • "User(name=John, age=42)" 폼의 toString();
  • 선언 순서대로 각 property 에 해당하는 componentN() functions
  • copy()

아래의 요구사항을 충족해야 한다.

  • primary constructor 는 적어도 하나의 파라미터를 가져야 한다.
  • 모든 primary constructor 의 파라미터는 var 또는 val 이 표기되어야 한다.
  • data class 는 abstract, open, sealed, inner 속성을 가질 수 없다.

멤버 상속에 관한 아래의 룰을 따라야 한다.

  • data class 에서 equals(), hashCode(), toString() 을 따로 선언하거나 subclass 에서 final 구현을 하면 이 함수들의 기본 구현을 사용하지 않는다.
  • supertype 이 open 이고 호환되는 타입을 리턴하는 componentN() 함수들을 가지면 대응되는 함수들이 data class 를 위해 생성되고, supertype 을 override 한다. 만약 supertype 의 함수들이 final 이거나 incompatible signature 문제로 override 가 안되면 에러를 리포트 한다.
  • copy(...) 함수를 이미 가진 클래스를 상속하는것은 1.3 에서 금지 된다.
  • componentN()copy() 함수를 직접 구현하는 것은 금지 된다.

JVM 에서, data class 가 파라미터가 없는 constructor 가 필요하면 모든 프로퍼티에 대한 기본 값이 설정되어야 한다.

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

Properties Declared in the Class Body

컴파일러는 자동으로 생성된 함수들을 위한 primary constructor 안에서 정의된 properties 만 사용한다.

특정 property 를 제외하려면 클래스 내부에 선언하면 된다.

data class Person(val name: String) {
    var age: Int = 0
}

위 코드는 name property 만 toString(), equals(), hashCode(), copy() 안에서 사용되며 단 하나의 component function component1() 함수를 가진다.

제외된 property 의 값이 달라도 나머지 property 가 같은 오브젝트는 같은것으로 취급된다.

fun main() {
    val person1 = Person("John")
    val person2 = Person("John")
    person1.age = 10
    person2.age = 20
    println("person1 == person2: ${person1 == person2}")
    println("person1 with age ${person1.age}: ${person1}")
    println("person2 with age ${person2.age}: ${person2}")
}

// output:
// person1 == person2: true
// person1 with age 10: Person(name=John)
// person2 with age 20: Person(name=John)

Copying

copy() 를 통해서 일부 property 를 변경하면서 오브젝트를 복사할 수 있다.

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

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 and Destructuring Declarations

data class 의 component function 은 destructuring declarations 에 사용될 수 있다.

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

destructuring declarations 을 통해 변수 Janeage 가 선언되면서 값이 설정 되었다.

Standard Data Classes

Standard libray 는 Pair 와 Triple 을 제공한다.

 

Comments