일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- text
- Collection
- Android
- 함수
- 웹크롤러
- 클래스
- Flutter
- ML
- 크롤러
- 다트
- import
- variable
- 콜렉션
- crawler
- animation
- Class
- pushnamed
- 플러터
- Yocto
- package
- 코틀린
- kotlin
- 파이썬
- python
- map
- List
- DART
- function
- textstyle
- set
- Today
- Total
조용한 담장
코틀린(Kotlin) 클래스(Class) : 데이터 클래스 (Data Classes) 본문
코틀린의 데이터 클래스(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 을 통해 변수 Jane, age 가 선언되면서 값이 설정 되었다.
Standard Data Classes
Standard libray 는 Pair 와 Triple 을 제공한다.
'kotlin' 카테고리의 다른 글
코틀린(Kotlin) 클래스(Class) : Sealed Classes (0) | 2019.12.31 |
---|---|
코틀린(Kotlin) 클래스(Class) : 열거 클래스 (Enum classes) (0) | 2019.12.31 |
코틀린(Kotlin) 클래스(Class) : 확장 (Extensions) (0) | 2019.12.31 |
코틀린(Kotlin) 클래스(Class) : Visibility Modifiers (0) | 2019.12.31 |
코틀린(kotlin) 클래스(Class) : 인터페이스 (Interfaces) (0) | 2019.12.31 |