Kotlin의 데이터 클래스
Kotlin의 데이터 클래스(Data Classes)는 주로 데이터를 보유하는 용도로 사용되는 특별한 클래스입니다.
이 가이드에서는 Kotlin 데이터 클래스의 다양한 측면을 상세히 살펴보겠습니다.
데이터 클래스 기본 (Data Class Basics)
데이터 클래스는 data
키워드로 표시됩니다:
data class User(val name: String, val age: Int)
컴파일러는 주 생성자에 선언된 모든 속성에 대해 자동으로 다음과 같은 멤버 함수를 생성합니다:
.equals()/.hashCode()
쌍.toString()
(예: "User(name=John, age=42)").componentN()
함수 (속성 선언 순서에 해당).copy()
함수
데이터 클래스 요구사항 (Data Class Requirements)
데이터 클래스는 다음 요구사항을 충족해야 합니다:
- 주 생성자에는 최소 하나의 매개변수가 있어야 합니다.
- 모든 주 생성자 매개변수는
val
또는var
로 표시되어야 합니다. - 데이터 클래스는
abstract
,open
,sealed
,inner
일 수 없습니다.
클래스 본문에 선언된 속성 (Properties Declared in the Class Body)
컴파일러는 자동 생성된 함수에 대해 주 생성자에 정의된 속성만 사용합니다. 클래스 본문에 선언된 속성은 이러한 자동 생성에서 제외됩니다:
data class Person(val name: String) {
var age: Int = 0
}
val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20
println("person1 == person2: ${person1 == person2}")
// person1 == person2: true
println("person1 with age ${person1.age}: ${person1}")
// person1 with age 10: Person(name=John)
println("person2 with age ${person2.age}: ${person2}")
// person2 with age 20: Person(name=John)
이 예제에서 age
속성은 equals()
, toString()
등의 자동 생성 함수에서 고려되지 않습니다.
복사 (Copying)
.copy()
함수를 사용하면 객체의 일부 속성만 변경하고 나머지는 그대로 유지한 새 객체를 만들 수 있습니다:
data class User(val name: String, val age: Int)
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
데이터 클래스와 구조 분해 선언 (Data Classes and Destructuring Declarations)
데이터 클래스에 대해 생성된 컴포넌트 함수를 사용하면 구조 분해 선언이 가능합니다:
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
// Jane, 35 years of age
표준 데이터 클래스 (Standard Data Classes)
Kotlin 표준 라이브러리는 Pair
와 Triple
클래스를 제공합니다. 하지만 대부분의 경우 명명된 데이터 클래스를 사용하는 것이 더 좋은 설계 선택입니다. 이는 속성에 의미 있는 이름을 제공하여 코드의 가독성을 높이기 때문입니다.
Kotlin의 데이터 클래스는 데이터를 다루는 간결하고 강력한 방법을 제공합니다. 자동으로 생성되는 유용한 메서드들 덕분에 보일러플레이트 코드를 크게 줄일 수 있으며, 이는 코드의 가독성과 유지보수성을 향상시킵니다.
데이터 클래스는 특히 DTO(Data Transfer Objects), 도메인 모델, 값 객체(Value Objects) 등을 표현할 때 매우 유용합니다. 또한 불변성(immutability)을 쉽게 구현할 수 있어, 함수형 프로그래밍 스타일에도 잘 맞습니다.
하지만 데이터 클래스가 항상 최선의 선택은 아닙니다. 복잡한 비즈니스 로직이 필요한 경우나 상속을 통한 다형성이 필요한 경우에는 일반 클래스가 더 적합할 수 있습니다. 따라서 사용 사례를 잘 고려하여 데이터 클래스를 적절히 활용하는 것이 중요합니다.
Kotlin, 데이터클래스, DTO, 값객체, 구조분해, 복사함수, equals, hashCode, toString, 컴포넌트함수, 불변성, 안드로이드개발, 서버개발, 함수형프로그래밍, 코틀린문법
'개발&프로그래밍' 카테고리의 다른 글
[kotlin] 제네릭: in, out, where (0) | 2024.08.14 |
---|---|
[kotlin] Sealed classes & interfaces (0) | 2024.08.14 |
[kotlin] 확장 기능(Extensions) (0) | 2024.08.14 |
[kotlin] 가시성 수정자(Visibility modifiers) (0) | 2024.08.13 |
[kotlin] 인터페이스(interface) (0) | 2024.08.13 |
댓글