Menu
Coddy logo textTech

데이터 클래스

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 32번째.

데이터 클래스는 주된 역할이 데이터를 보관하는 클래스입니다. data 수정자를 사용하면 컴파일러가 주 생성자의 속성으로부터 toString(), equals(), hashCode(), copy() 및 componentN()을 생성합니다:

data class Point(val x: Int, val y: Int)

main 내부에서:

val a = Point(1, 2)
val b = Point(1, 2)
println(a)
println(a == b)
println(setOf(a, b).size)

출력:

Point(x=1, y=2)
true
1

data가 없으면 println은 클래스 이름과 Point@1b6d3586 같은 해시 코드를 표시하며, 같은 값을 가진 두 객체도 서로 같지 않습니다. copy()는 일부 속성이 변경된 새 객체를 만들고 원본은 그대로 두므로, val 속성을 사용하는 데이터 클래스는 변경할 수 없는 값으로 작동합니다.

data class User(val name: String, val email: String, val admin: Boolean = false)

main 내부에서:

val ada = User("Ada", "ada@example.com")
val boss = ada.copy(admin = true)
println(ada)
println(boss)
println(ada == boss)

출력:

User(name=Ada, email=ada@example.com, admin=false)
User(name=Ada, email=ada@example.com, admin=true)
false

구조 분해 선언은 객체를 변수로 풀어냅니다: val (x, y) = point는 생성자의 순서에 따라 생성된 component1()과 component2()를 호출합니다. 또한 for 루프와 람다 매개변수에서도 사용할 수 있으며, _는 속성을 건너뜁니다:

data class Score(val player: String, val points: Int, val level: Int)

main 내부:

val scores = listOf(Score("ada", 120, 3), Score("bo", 95, 2))
for ((player, points) in scores) println("$player: $points")
val (_, bestPoints, bestLevel) = scores.maxBy { it.points }
println("best: $bestPoints at level $bestLevel")

출력:

ada: 120
bo: 95
best: 120 at level 3

기본 생성자의 속성만 참여합니다. 클래스 본문에 선언된 속성은 toString, equals, hashCode 및 copy에서 제외됩니다. 데이터 클래스에는 생성자 매개변수가 하나 이상 필요하며, 모든 매개변수는 val 또는 var여야 합니다.

data class Reading(val sensor: String, val value: Int) {
    var note = ""
}

main 내부에서:

val r1 = Reading("t1", 20)
val r2 = Reading("t1", 20)
r1.note = "checked"
println(r1)
println(r1 == r2)

출력:

Reading(sensor=t1, value=20)
true
challenge icon

챌린지

쉬움

Book을 값으로 출력되고 비교되도록 데이터 클래스로 만드세요. 그런 다음 세 함수를 완성하세요. parse(line)은 Dune;Herbert;1965를 Book으로 변환하고, newEdition(book, year)은 새로운 연도가 적용되고 제목에 (new edition)이 추가된 복사본을 반환하며, describe(book)은 구조 분해 선언을 사용하여 Dune by Herbert, 1965를 반환합니다.

제공된 코드는 모든 입력 줄을 분석하고, 각 책, 중복 항목의 수, 첫 번째 책의 새 판본(연도 2024), 그리고 서로 다른 모든 책의 설명을 출력합니다.

코드는 Book.kt와 BookTools.kt에 작성하세요. Main.kt에는 제공된 입력/출력 코드가 있으며 편집할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 있는 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    val books = input.map { parse(it) }
    for (b in books) println(b)
    println("duplicates: ${books.size - books.distinct().size}")
    println(newEdition(books[0], 2024))
    for (b in books.distinct()) println(describe(b))
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드