데이터 클래스(Data Class)는 애플리케이션에서 사용되는 데이터를 보관하는 역할을 하는 클래스입니다. Java에서 데이터를 담기 위해 사용하는 POJO(Plain Old Java Object) 클래스와 매우 유사한 개념입니다.
데이터 클래스란?
Java에서는 클래스의 속성에 접근하기 위해 getter와 setter 메서드를 직접 작성해야 합니다. 반면 Kotlin에서는 클래스를 데이터 클래스로 선언하면 컴파일러가 멤버 변수에 접근하는 데 필요한 지원 메서드들을 자동으로 생성해 줍니다. 컴파일러는 생성자 파라미터에 대한 getter와 setter뿐만 아니라 hashCode(), equals(), toString(), copy() 메서드까지 함께 만들어 주므로 보일러플레이트 코드를 크게 줄일 수 있습니다.
Kotlin에서 클래스가 데이터 클래스로 인정받기 위해서는 다음 조건을 충족해야 합니다.
주 생성자(primary constructor)에는 최소한 하나 이상의 매개변수가 있어야 합니다.
주 생성자의 모든 매개변수는 val 또는 var로 표시되어야 합니다.
데이터 클래스는 abstract, open, sealed, inner로 선언할 수 없습니다.
즉, 데이터 클래스는 직접 상속(확장)할 수 없습니다. 하지만 동일한 기능을 구현해야 한다면 슈퍼 클래스(super class)를 선언하고 하위 클래스(sub-class)에서 해당 속성들을 오버라이드하는 방식으로 우회할 수 있습니다.
예제 코드
다음 예제에서는 두 개의 데이터 클래스인 "Student"와 "Book"을 생성합니다. 그리고 추상 클래스 "Resource"를 선언한 뒤, "Book" 클래스 내부에서 "Resource" 클래스의 속성을 오버라이드하여 상속과 같은 효과를 구현합니다.
data class Student(val name: String, val age: Int)
fun main(args: Array<String>) {
val stu = Student("Student1", 29)
val stu2 = Student("Student2", 30)
println("Student1 Name is: ${stu.name}")
println("Student1 Age is: ${stu.age}")
println("Student2 Name is: ${stu2.name}")
println("Student2 Age is: ${stu2.age}")
val b = Book(1L, "India", "123222") // 추상 클래스 구현
println(b.location)
}
// 슈퍼 클래스 선언
abstract class Resource {
abstract var id: Long
abstract var location: String
}
// Resource 클래스의 속성을 오버라이드
data class Book (
override var id: Long = 0,
override var location: String = "",
var isbn: String
) : Resource()
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
Student1 Name is: Student1 Student1 Age is: 29 Student2 Name is: Student2 Student2 Age is: 30 India
결과에서 볼 수 있듯이, 데이터 클래스 "Book"이 추상 클래스 "Resource"의 속성(id, location)을 성공적으로 오버라이드했으며, "location" 값인 India가 정상적으로 출력되었습니다. 이처럼 데이터 클래스 자체의 상속은 불가능하지만, 추상 클래스를 활용하면 공통 속성을 재사용하는 구조적 설계가 가능합니다.