데이터 클래스 - swkim0128/PARA GitHub Wiki
- 데이터를 저장하거나 모델링할 때 사용되는 클래스로, 코틀린에서는 data 키워드로 선언합니다.
- 데이터 클래스는 다음 메서드들을 자동으로 생성합니다:
- equals(): 객체의 내용 비교.
- hashCode(): 객체의 해시 코드 생성.
- toString(): 객체의 문자열 표현.
- copy(): 객체 복사.
- componentN(): 프로퍼티를 반환하는 함수(디스트럭처링 지원).
문법
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)
}
- 데이터 클래스는 자동으로 객체의 내용을 포함한 문자열을 반환합니다.
fun main() {
val user = User("Alice", 25)
println(user) // 출력: User(name=Alice, age=25)
}
- 객체의 내용을 비교합니다.
fun main() {
val user1 = User("Alice", 25)
val user2 = User("Alice", 25)
println(user1 == user2) // 출력: true
}
- 객체를 복사하면서 일부 속성만 변경할 수 있습니다.
fun main() {
val user1 = User("Alice", 25)
val user2 = user1.copy(age = 30)
println(user2) // 출력: User(name=Alice, age=30)
}
- componentN() 메서드를 사용해 객체의 속성을 분해할 수 있습니다.
fun main() {
val user = User("Alice", 25)
val (name, age) = user
println("이름: $name, 나이: $age") // 출력: 이름: Alice, 나이: 25
}
데이터 클래스를 정의할 때는 몇 가지 조건이 있습니다:
- 주 생성자에 최소 하나의 속성을 선언해야 합니다.
- 주 생성자의 모든 속성은 val 또는 var로 선언되어야 합니다.
- 데이터 클래스는 abstract**,** open**,** sealed**,** inner로 선언될 수 없습니다.
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)]
}
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)]
}
- 데이터 클래스는 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])
}
특징 | 데이터 클래스 | 일반 클래스 |
---|---|---|
키워드 | data | 없음 |
equals() | 내용 비교 | 참조 비교 |
hashCode() | 자동 생성 | 수동 구현 필요 |
toString() | 속성을 포함한 문자열 반환 | 메모리 주소 또는 수동 구현 필요 |
copy() | 자동 생성 | 수동 구현 필요 |
디스트럭처링 선언 지원 | 지원 | 지원하지 않음 |
- 데이터 클래스는 상속이 불가능합니다. 하지만 일반 클래스를 상속받아 사용할 수 있습니다.
예제
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])
}
- 데이터 클래스는 불변 데이터 모델링에 적합하므로, 가능한 속성을 val로 선언합니다.
- 데이터 클래스는 데이터를 표현하는 데 집중하고, 복잡한 로직을 포함하지 않도록 설계해야 합니다.
- 데이터 클래스는 기본적으로 equals와 hashCode를 생성하므로, 필요하지 않다면 오버라이딩하지 않습니다.
- 데이터 클래스는 데이터를 저장하거나 모델링하는 데 최적화된 클래스입니다.
- 자동으로 생성되는 메서드(toString, equals, copy, componentN)를 통해 개발 생산성을 높입니다.
- 데이터 클래스는 가독성, 유지보수성, 코드 간결성을 제공하여 다양한 애플리케이션에서 효율적으로 사용됩니다.