Study Record

[Kotlin] data class (데이터 클래스), Destructuring declarations 본문

안드로이드/Kotlin

[Kotlin] data class (데이터 클래스), Destructuring declarations

초코초코초코 2023. 8. 31. 22:07
728x90

😶 data class (데이터 클래스)

데이터 클래스는 데이터를 보유하는 것이 주된 목적의 클래스이다.

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

 

데이터 클래스 주의점

데이터 클래스에는 생성자에 매개변수가 하나 이상 있어야 하며 모든 생성자 매개변수는 val, var 로 표시되어야 한다.

또한, 데이터 클래스는 abstract 또는 open, sealed, inner 일 수 없다.

데이터 클래스는 .componentN(), copy() 함수에 대한 명시적인 구현은 허용되지 않는다.

 

 

데이터 클래스는 자동으로 componentN() 함수를 생성해 주기 때문에 Destruction declaration 이 가능하다.

 

😶 Destructuring declarations

다음과 같이 객체를 분리하는 것이 편할 때가 있다. 이를 Destructing declaration 라고 부른다. Destructing declaration 는 한 번에 여러 개의 변수들을 만들 수 있다. 

data class Person(val p1: Int, val p2: String)

fun main() {
    val person = Person(7, "Hello")
    val (age, name) = person
    
    println(age)     // 7
    println(name)    // "Hello"
}

 

Destructing declaration 는 다음과 같은 코드로 컴파일된다.

// val (age, name) = person
val age = person.component1()
val name = person.component2()

component1(), component2() 함수는 Kotlin 에서 사용되는 규칙으로 만약 Person() 클래스의 생성자 매개변수가 3개였다면 component3() 도 존재할 수 있다.

 

단, componentN() 함수는 Destructing declaration 에 사용할 수 있도록 하려면 operator 키워드가 표시될 필요가 있다. 즉,

다음과 같은 Example 클래스의 componentN() 함수는 존재하지 않기 때문에 컴파일 에러가 나온다.

data class Friend()
class Example(val e1: Friend, val e2: String)

fun main() {
    val (e1, e2) = Example(Friend(), "Happy")
}

 

map 에서의 Destructing declaration 

for ((key, value) in map) {
   // do something with the key and the value
}

 

Lambda 에서의 Destructing declaration 

람다 매개 변수에서도 Destructing declaration 을 사용할 수 있다.

map.mapValues { entry -> "${entry.value}!" }
map.mapValues { (key, value) -> "$value!" }

 

😶 데이터 클래스 내의 property

데이터 클래스 안에 선언된 변수는 .toString(), .equals(), .hashCode(), .copy() 구현에서 사용되지 않는다.

따라서, 다음과 같이 name 값이 같지만 age 값은 다른 객체들의 equals() 의 결과는 true 로 나온다.

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

val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20

println("person1 == person2: ${person1 == person2}")
// person1 == person2: true

println("person1 with age ${person1.age}: ${person1}")
// person1 with age 10: Person(name=John)

println("person2 with age ${person2.age}: ${person2}")
// person2 with age 20: Person(name=John)

 

 

 

 

Destructuring declarations | Kotlin

 

kotlinlang.org

 

Data classes | Kotlin

 

kotlinlang.org

 

728x90

'안드로이드 > Kotlin' 카테고리의 다른 글

[Kotlin] Extensions 살펴보기  (0) 2023.08.18
[Kotlin] Enum Class  (0) 2023.08.10
[Kotlin] Exception Class (예외 처리)  (0) 2023.08.09
[Kotlin] coroutines 살펴보기  (0) 2023.08.08
[Kotlin] property  (0) 2023.07.21