Kotlin에는 일반 class보다 데이터를 저장하기에 더욱 적합한 멤버 함수를 가지는 data class를 제공합니다.
문법
일반적은 class 선언문 앞에 data
키워드를 붙여 사용합니다.
ex.
data class Todo(val title: String, var isDone: Boolean)
생성자 외부에서 선언된 멤버 변수는 data class를 이용하는 특징에 대한 대상이 아니게 됩니다.
만약 다음과 같이 정의했다면, isDone 멤버 변수는 아래 특징에서 다루는 equals()/hashCode(), toString(), componentN(), copy()를 사용할 수 없습니다.
ex.
data class Todo(val title: String) {
val isDone: Boolean = false
}
특징
맨 위에서 언급하였듯이, data class는 data를 관리하기 위한 메서드를 기본적으로 가지고 있습니다.
equals()
/ hashCode()
equals()
와 hashCode()
는 ==
연산자를 통해 비교하기 위해 필요한 메서드입니다.
equals()
는 객체 자신이 가진 멤버 변수들과 비교 대상의 멤버 변수들의 이름, 타입, 값이 같은지를 비교하여 모두 같으면 True를 반환하는 메서드입니다.
(override
하여 재정의할 수 있지만 권장하지 않습니다.)
hashCode()
는 멤버 변수들을 조합하여 정수로 만드는 메서드이기 때문에 equals()
로 같다고 판명난 두 객체의 hashCode()
의 값 역시 동일한 것이 보장됩니다.
toString()
toString()
메서드는 data class의 내부 값들을 알기 쉽게 String으로 변환해줍니다.
ex.
@Test
fun todo_test() {
val todo1 = Todo("title", false)
val todo2 = Todo("title2", true)
println(todo1) // => Todo(title=title, isDone=false)
println(todo2) // => Todo(title=title2, isDone=true)
}
componentN()
componentN()
메서드는 멤버 변수들의 선언 순서에 따라 N에 대응되어 값을 반환해줍니다.
또한, 선언 순서에 따라 구조 분해(destructuring)도 가능합니다.
ex.
@Test
fun todo_test() {
val todo = Todo("title", false)
println(todo.component1()) // => title
println(todo.component2()) // => false
val (todoTitle, todoIsDone) = todo
println(todoTitle) // => title
println(todoIsDone) // => false
}
copy()
data class는 대체로 관리의 편의를 위해 immutable로 관리하는 편입니다.
예를 들어 여러 스레드에서 동시에 변경을 시도한다면 문제가 될 수도 있기 때문입니다.
immutable 객체의 값 변경을 위해서는 새로운 객체를 만들어야 하는데, 이를 편하게 도와줍니다.
ex.
@Test
fun todo_test() {
val todo = Todo("title", false)
val copiedTodo = todo.copy("new title", true)
println(todo) // => Todo(title=title, isDone=false)
println(copiedTodo) // => Todo(title=new title, isDone=true)
}
참고
'공부 > Kotlin' 카테고리의 다른 글
일급 컬렉션 (First Class Collection) (2) | 2023.11.23 |
---|