목차

공부/Kotlin

Kotlin의 data class

천만일 2023. 11. 3. 10:40

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)  (1) 2023.11.23