본문 바로가기
개발&프로그래밍

[kotlin] 데이터 클래스(Data classes)

by 재아군 2024. 8. 14.

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)

데이터 클래스는 다음 요구사항을 충족해야 합니다:

  1. 주 생성자에는 최소 하나의 매개변수가 있어야 합니다.
  2. 모든 주 생성자 매개변수는 val 또는 var로 표시되어야 합니다.
  3. 데이터 클래스는 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 표준 라이브러리는 PairTriple 클래스를 제공합니다. 하지만 대부분의 경우 명명된 데이터 클래스를 사용하는 것이 더 좋은 설계 선택입니다. 이는 속성에 의미 있는 이름을 제공하여 코드의 가독성을 높이기 때문입니다.

 

Kotlin의 데이터 클래스는 데이터를 다루는 간결하고 강력한 방법을 제공합니다. 자동으로 생성되는 유용한 메서드들 덕분에 보일러플레이트 코드를 크게 줄일 수 있으며, 이는 코드의 가독성과 유지보수성을 향상시킵니다.

데이터 클래스는 특히 DTO(Data Transfer Objects), 도메인 모델, 값 객체(Value Objects) 등을 표현할 때 매우 유용합니다. 또한 불변성(immutability)을 쉽게 구현할 수 있어, 함수형 프로그래밍 스타일에도 잘 맞습니다.

하지만 데이터 클래스가 항상 최선의 선택은 아닙니다. 복잡한 비즈니스 로직이 필요한 경우나 상속을 통한 다형성이 필요한 경우에는 일반 클래스가 더 적합할 수 있습니다. 따라서 사용 사례를 잘 고려하여 데이터 클래스를 적절히 활용하는 것이 중요합니다.

 


Kotlin, 데이터클래스, DTO, 값객체, 구조분해, 복사함수, equals, hashCode, toString, 컴포넌트함수, 불변성, 안드로이드개발, 서버개발, 함수형프로그래밍, 코틀린문법

댓글