728x90
데이터 클래스(Data Class)
우리는 데이터를 보관하는 것이 주된 목적인 클래스를 만드는 것은 흔한 일이다. 이러한 클래스에서 일부 표준 기능과 일부 유틸리티 기능을 매번 기계적으로 만드는 경우가 있다. 코틀린에선 이를 지원하기 위해 데이터 크래스를 제공한다.
data class User(val name: String, val age: Int)
val jack = User("Jack", 1)
컴파일러는 기본 생성자에 선언한 모든 프로퍼티로부터 다음 멤버를 생성한다.
- equals() / hashCode() 쌍
- "User(name=John, age=42)"형식의 toString()
- 선언 순서대로 프로퍼티에 대응하는 componentN() 함수
- copy() 함수
데이터 클래스가 일관성 + 의미 있는 기능을 제공하기 위한 조건은 다음과 같다.
- 기본 생성자는 최소 한 개의 매개변수가 필요하다.
- 모든 주요 생성자 패러미터는 프로퍼티로 선언해야 한다.
- 데이터 클래스는 추상, open, sealed, 내부 클래스로 선언할 수 없다.
추가로 멤버 생성은 멤버 상속에 대해 다음 규칙을 따른다.
- 데이터 클래스 몸체에 equals(), hashCode(), toString() 구현이 있거나
- 상위 클래스에 final 구현이 있으면, 이 함수를 생성하지 않고 존재하는 구현을 사용한다.
- 상위 타입에 open이고 호환하는 타입을 리턴하는 componentN() 함수가 있다면 데이터 클래스는 오버 라이딩하는 대응 함수를 생성한다.
- componentN()과 copy()함수의 직접 구현은 허용하지 않는다.
만약 기본 생성자가 필요하면 모든 프로퍼티에 기본 값을 지정하면 된다.
data class User(val name: String = "", val age: Int = 0)
복사
객체를 복사할 때 일부만 수정해야할 때가 있다. 이러한 용도를 위해 copy()를 생성한다. 위 User클래스로 예를 들어보자.
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)
데이터 클래스와 분리 선언
데이터 클래스에 생성되는 컴포넌트 함수는 분리선언에 데이터 클래스를 사용할 수 있게 한다.
val jane = User("jane", 35)
val (name, age) = jane
println("$name, $age years of age")
표준 데이터 클래스
표준 라이브러리는 Pair와 Triple을 제공한다. 만약 정의해야하는 속성이 많은 경우 이름을 가진 데이터 클래스를 사용하는 것이 더 나은 설계 선택이다. 왜냐면 프로퍼티에 의미 있는 이름을 사용해서 코드 가독성을 높여주기 때문이다.
참고
Data classes | Kotlin
kotlinlang.org
728x90
'코틀린' 카테고리의 다른 글
제네릭 ( in & out) (0) | 2023.09.14 |
---|---|
봉인된 클래스 및 인터페이스(Seald Class & Interface) (0) | 2023.04.10 |
확장(Extensions) (0) | 2023.03.07 |
가시성 수식어(Visibility modifiers) (0) | 2023.02.02 |
Functional (Single Abstract Method) Interface (1) | 2023.02.02 |