데이터 클래스 - swkim0128/PARA GitHub Wiki

1. 데이터 클래스란?

  • 데이터를 저장하거나 모델링할 때 사용되는 클래스로, 코틀린에서는 data 키워드로 선언합니다.
  • 데이터 클래스는 다음 메서드들을 자동으로 생성합니다:
  • equals(): 객체의 내용 비교.
  • hashCode(): 객체의 해시 코드 생성.
  • toString(): 객체의 문자열 표현.
  • copy(): 객체 복사.
  • componentN(): 프로퍼티를 반환하는 함수(디스트럭처링 지원).

2. 데이터 클래스 정의

문법

data class 클래스명(val 속성1: 타입, var 속성2: 타입, ...)

예제

data class User(val name: String, val age: Int)

fun main() {
    val user = User("Alice", 25)
    println(user) // 출력: User(name=Alice, age=25)
}

3. 데이터 클래스의 주요 기능

1. toString() 메서드

  • 데이터 클래스는 자동으로 객체의 내용을 포함한 문자열을 반환합니다.
fun main() {
    val user = User("Alice", 25)
    println(user) // 출력: User(name=Alice, age=25)
}

2. equals() 메서드

  • 객체의 내용을 비교합니다.
fun main() {
    val user1 = User("Alice", 25)
    val user2 = User("Alice", 25)
    println(user1 == user2) // 출력: true
}

3. copy() 메서드

  • 객체를 복사하면서 일부 속성만 변경할 수 있습니다.
fun main() {
    val user1 = User("Alice", 25)
    val user2 = user1.copy(age = 30)
    println(user2) // 출력: User(name=Alice, age=30)
}

4. 디스트럭처링 선언

  • componentN() 메서드를 사용해 객체의 속성을 분해할 수 있습니다.
fun main() {
    val user = User("Alice", 25)
    val (name, age) = user
    println("이름: $name, 나이: $age") // 출력: 이름: Alice, 나이: 25
}

4. 데이터 클래스의 조건

데이터 클래스를 정의할 때는 몇 가지 조건이 있습니다:

  1. 주 생성자에 최소 하나의 속성을 선언해야 합니다.
  2. 주 생성자의 모든 속성은 val 또는 var로 선언되어야 합니다.
  3. 데이터 클래스는 abstract**,** open**,** sealed**,** inner로 선언될 수 없습니다.

5. 데이터 클래스 활용 예제

1. 데이터 정렬

data class Person(val name: String, val age: Int)

fun main() {
    val people = listOf(
        Person("Alice", 30),
        Person("Bob", 25),
        Person("Charlie", 35)
    )

    val sorted = people.sortedBy { it.age }
    println(sorted) // 출력: [Person(name=Bob, age=25), Person(name=Alice, age=30), Person(name=Charlie, age=35)]
}

2. 중복 제거

fun main() {
    val users = listOf(
        User("Alice", 25),
        User("Alice", 25),
        User("Bob", 30)
    )

    val uniqueUsers = users.distinct()
    println(uniqueUsers) // 출력: [User(name=Alice, age=25), User(name=Bob, age=30)]
}

3. API 응답 데이터 처리

  • 데이터 클래스는 API 응답 데이터를 모델링하는 데 적합합니다.
data class ApiResponse(val status: String, val data: List<String>)

fun main() {
    val response = ApiResponse("success", listOf("Item1", "Item2", "Item3"))
    println(response) // 출력: ApiResponse(status=success, data=[Item1, Item2, Item3])
}

6. 데이터 클래스와 일반 클래스의 비교

특징 데이터 클래스 일반 클래스
키워드 data 없음
equals() 내용 비교 참조 비교
hashCode() 자동 생성 수동 구현 필요
toString() 속성을 포함한 문자열 반환 메모리 주소 또는 수동 구현 필요
copy() 자동 생성 수동 구현 필요
디스트럭처링 선언 지원 지원 지원하지 않음

7. 데이터 클래스의 확장

  • 데이터 클래스는 상속이 불가능합니다. 하지만 일반 클래스를 상속받아 사용할 수 있습니다.

예제

open class BaseResponse(val status: String)

data class ApiResponse(val status: String, val data: List<String>) : BaseResponse(status)

fun main() {
    val response = ApiResponse("success", listOf("Item1", "Item2"))
    println(response) // 출력: ApiResponse(status=success, data=[Item1, Item2])
}

8. 데이터 클래스 사용 시 주의사항

1. var 대신 val 사용을 권장:

  • 데이터 클래스는 불변 데이터 모델링에 적합하므로, 가능한 속성을 val로 선언합니다.

2. 다중 책임 부여 지양:

  • 데이터 클래스는 데이터를 표현하는 데 집중하고, 복잡한 로직을 포함하지 않도록 설계해야 합니다.

3. equals hashCode 오버라이드 주의:

  • 데이터 클래스는 기본적으로 equals와 hashCode를 생성하므로, 필요하지 않다면 오버라이딩하지 않습니다.

요약

  • 데이터 클래스는 데이터를 저장하거나 모델링하는 데 최적화된 클래스입니다.
  • 자동으로 생성되는 메서드(toString, equals, copy, componentN)를 통해 개발 생산성을 높입니다.
  • 데이터 클래스는 가독성, 유지보수성, 코드 간결성을 제공하여 다양한 애플리케이션에서 효율적으로 사용됩니다.
⚠️ **GitHub.com Fallback** ⚠️