일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- android
- viewmodel
- Navigation
- Button
- data
- activity
- tabbar
- binding
- intent
- TEST
- Coroutines
- appbar
- 앱바
- 안드로이드
- Flutter
- Compose
- 계측
- Dialog
- Kotlin
- textview
- drift
- textfield
- 앱
- 테스트
- ScrollView
- scroll
- DART
- CustomScrollView
- livedata
- LifeCycle
- Today
- Total
Study Record
[Kotlin] data class (데이터 클래스), Destructuring declarations 본문
😶 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)
'안드로이드 > 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 |