데이터 클래스
별다른 동작없이 데이터를 가지는 클래스를 만들며 해당 클래스의 기능은 데이터로부터 만든다. 코틀린에서는 이를 데이터 클래스라고 부르며 data
라는 수식어를 사용
data class User(val name: String, val age: Int)
컴파일러가 자동 생성하는 멤버
equals()
/hasCode()
toString()
- 프로퍼티 선언 순서에 따라 대응하는 componentN() 함수
copy()
(아래 참고)
명시적으로 상속받아서 사용 가능
데이터 클래스 충족 조건
- 주요 생성자에는 적어도 하나의 파라매터가 필요
- 모든 주요 생성자 파라매터는
val
혹은var
로 지정 - 데이터 클래스는 추상 클래스, open 클래스, sealed 클래스, inner 클래스일 수 없다
- (1.1 이전) 데이터 클래스는 인터페이스만 구현 가능
1.1 이후 데이터 클래스는 다른 클래스를 확장할 수 있다. (예. Sealed 클래스 참조)
클래스에 파라매터가 없는 생성자가 필요한 경우, 모든 프로퍼티의 기본값을 지정할 필요가 있다 (생성자 잠조)
data class User(val name: String = "", val age: Int = 0)
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)
데이터 클래스와 비구조화 선언 (Destructuring Declarations)
데이터 클래스용으로 생성된 구성 요소 함수는 다음과 같이 비구조화 선언에 사용 가능
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // "Jane, 35 years of age" 출력
표준 데이터 클래스
표준 라이브러리에서 Pair
와 Triple
제공
하지만, 대부분 이름을 가지는 데이터 클래스를 사용하는 것으로 코드를 보다 쉽게 읽을 수 있도록 한