밤빵's 개발일지
[TIL]20241010 데이터 클래스(Data Class) 본문
데이터 클래스는 데이터를 저장하기 위한 목적으로 사용하는 클래스로, 기본적인 기능을 자동으로 제공해 준다. 자바에서 클래스를 작성할 때는 equals, hashCode, toString 등의 메서드를 직접 구현해야 했지만, 코틀린에서는 이러한 메서드들이 자동으로 생성되기 때문에 훨씬 간결하게 코드를 작성할 수 있다.
▶데이터 클래스란?
데이터 클래스(Data Class)는 주로 데이터를 담기 위해 사용되는 클래스로, 자동으로 생성되는 기본 메서드들(equals, hashCode, toString, copy, componentN)을 제공한다. 이러한 기능 덕분에 데이터 모델을 작성할 때 불필요한 코드를 줄이고, 코드의 가독성을 높일 수 있다. 데이터 클래스는 코틀린에서 유용하게 쓰이며, 특히 간단한 데이터 저장, 비교, 복사 등을 할 때 유리하다.
▶데이터 클래스 선언 방법
데이터 클래스는 data 키워드를 사용하여 선언한다. 데이터 클래스는 반드시 주 생성자에서 하나 이상의 속성을 가져야 하고, 이 속성들은 기본적으로 val 또는 var로 선언된다.
data class Person(val name: String, val age: Int)
→ Person이라는 데이터 클래스를 정의하고, 이 클래스는 name과 age라는 두 개의 프로퍼티를 가지고 있다. 코틀린은 이 클래스를 정의할 때 자동으로 여러 가지 유용한 메서드를 생성해준다.
▶데이터 클래스의 기본 메서드
데이터 클래스는 다음과 같은 메서드들을 자동으로 생성한다.
- equals(): 객체 간의 내용 비교를 위한 메서드로, 데이터 클래스의 프로퍼티 값을 비교하여 두 객체가 같은지 확인한다.
- hashCode(): 해시 기반 컬렉션(Set, Map 등)에서 사용하기 위한 해시 값을 생성한다.
- toString(): 객체의 내용을 문자열로 변환하여 반환한다.
- copy(): 객체를 복사할 때 사용하며, 일부 속성의 값을 변경할 수 있다.
- componentN(): 각각의 프로퍼티를 개별적으로 참조하기 위한 메서드들로, N은 프로퍼티의 순서를 나타낸다. (component1()은 첫 번째 속성, component2()는 두 번째 속성 등)
fun main() {
val person1 = Person("Alice", 25)
val person2 = Person("Alice", 25)
val person3 = Person("Bob", 30)
// toString() 예시
println(person1) // 출력: Person(name=Alice, age=25)
// equals() 예시
println(person1 == person2) // 출력: true (값이 동일하므로)
// hashCode() 예시
println(person1.hashCode() == person2.hashCode()) // 출력: true
// copy() 예시
val person4 = person1.copy(age = 26)
println(person4) // 출력: Person(name=Alice, age=26)
}
→ 이 코드에서 person1과 person2는 같은 데이터를 가지고 있으므로 equals() 메서드가 true를 반환한다. 또한, hashCode() 메서드를 통해 두 객체의 해시 코드도 동일함을 확인할 수 있다. copy() 메서드를 사용하면 객체를 복사하면서 일부 속성 값을 변경할 수 있는데, 이 경우 person4는 age 속성만 26으로 변경된 새로운 객체가 된다.
▶copy() 메서드 활용
데이터 클래스의 copy() 메서드는 객체를 복사하면서 특정 프로퍼티만 변경하고 싶을 때 유용하게 사용된다. 이를 통해 동일한 기본 데이터를 유지하면서 일부 값만 수정된 새로운 객체를 생성할 수 있다.
fun main() {
val original = Person("Charlie", 40)
// copy()로 일부 프로퍼티 값만 변경
val copyPerson = original.copy(age = 41)
println(original) // 출력: Person(name=Charlie, age=40)
println(copyPerson) // 출력: Person(name=Charlie, age=41)
}
→ original 객체를 복사하여 age 값만 변경된 새로운 객체 copyPerson을 생성한다. 원본 객체는 변경되지 않고 그대로 유지되며, 복사된 객체만 수정된 상태로 생성된다.
▶componentN() 함수 활용
데이터 클래스는 각 속성을 순서대로 참조할 수 있는 componentN() 함수들을 자동으로 생성한다. 이를 통해 객체의 각 속성을 쉽게 분해할 수 있다.
fun main() {
val person = Person("Diana", 29)
val (name, age) = person // 구조 분해 선언
println("이름: $name, 나이: $age")
}
→ 코틀린의 구조 분해 선언을 사용하여 데이터 클래스의 각 속성을 변수에 할당할 수 있다. 여기서 component1()은 name에, component2()는 age에 대응된다. 이러한 방식은 데이터 클래스를 더욱 직관적이고 간편하게 사용할 수 있게 한다.
▶데이터 클래스의 제약 사항
데이터 클래스를 선언할 때 몇 가지 제약 사항이 있다.
→ 주 생성자에 최소 하나 이상의 프로퍼티가 있어야 한다.
데이터 클래스는 데이터를 저장하기 위한 클래스이기 때문에, 주 생성자에서 적어도 하나 이상의 프로퍼티를 가져야 한다.
→ abstract, open, sealed, inner 키워드를 사용할 수 없다.
데이터 클래스는 기본적으로 불변 객체를 생성하는 것을 목표로 하므로, abstract나 open 등의 키워드와 함께 사용할 수 없다.
→ 데이터 클래스는 상속받을 수 없다.
데이터 클래스는 상속 계층 구조를 만들기 위한 것이 아니므로, 다른 클래스로부터 상속을 받을 수 없다.
데이터 클래스는 주로 데이터를 담는 용도로 사용되며, equals(), hashCode(), toString(), copy()와 같은 메서드를 자동으로 제공하여 코드의 가독성을 높이고 불필요한 반복 작업을 줄여준다. 특히 객체의 비교나 복사 작업에서 매우 유용하게 사용될 수 있어, 데이터 모델을 정의할 때 적극적으로 활용할 수 있다.
'Kotlin' 카테고리의 다른 글
[TIL]20241012 when 표현식 (0) | 2024.10.12 |
---|---|
[TIL]20241011 자바 일반클래스& 코틀린 데이터클래스 (0) | 2024.10.11 |
[TIL]20241009 Extension Functions (0) | 2024.10.09 |
[TIL]20241008 코틀린의 함수 선언 & 사용법 (0) | 2024.10.08 |
[TIL]20241007 Safe Call(?.), Elvis 연산자(?:), Not-null Assertion(!!) 활용 (0) | 2024.10.07 |