Data class

홍승범·2023년 1월 18일

Kotlin

목록 보기
1/8

데이터 보관을 목적으로 만들어진 클래스로서 생성자 프로퍼티에 대한 toString, equals, hashCode, copy, compoenetsN 메소드를 자동으로 생성해준다.

기본 모양은 아래와 같다. class 키워드 앞에 data라는 키워드를 붙임으로써 사용할 수 있다.

data class Site(val url: String, val title: String) {
	val description = ""
}

특징은 아래와 같다

  1. 클래스의 생성자에 1개 이상의 프로퍼티를 포함해야 한다
  2. 생성자 프로퍼티는 val 또는 var로 선언되어야 한다
  3. 클래스에 abstract, inner, open, sealed를 붙일 수 없다
  4. data class를 상속할 수 없다(1.1 버전 이후 sealed 클래스는 상속받을 수 있으며, 인터페이스는 구현할 수 있다)
  5. 생성자 프로퍼티가 아닌 내부에서 선언한 프로퍼티는 toString등에 영향을 미치지 않는다.

독특한 점이 데이터 클래스를 상속받을 수 없다는점. 그리고 웬만하면 데이터 클래스는 상속받아 구현하지 말라고들 한다. 왜일까?

예를들면 아래와 같은 상황이 있다.

open class SuperUser(var gender: Int = 0)
data class User(val age: Int, val name: String) : SuperUser(0)

상기 코드는 data 클래스의 프로퍼티로 super 클래스의 프로퍼티가 포함되지 않았다. 따라서 gender는 User 클래스의 hashCode, equals 등에 영향을 주지 않는다. 이말인 즉슨 gender의 값이 변경되더라도 User 클래스는 동등하다라고 계산될 수 있다는 것. 이런면을 방지하고자, 상속을 제한하고 있는것이다.

굳이 상속을 써야 한다면?

추상클래스나 인터페이스등으로 상속해야 한다.

abstract class SuperUser { abstract var gender: Int }
data class User(val age: Int, val name: String, override var gender: Int) : SuperUser()

프로퍼티를 추상화 함으로써 생성자에 포함될 수 있도록 해야 정확한 동등성 비교가 가능할 것이다.


https://selfish-developer.com/entry/kotlin-data-class-%EB%8A%94-%EC%83%81%EC%86%8D%EC%9D%84-%EA%B0%80%EB%8A%A5%ED%95%98%EB%A9%B4-%EC%93%B0%EC%A7%80-%EB%A7%90%EC%9E%90#:~:text=%EC%9D%B4%EA%B2%83%EC%9D%80%20data%20class%20%EA%B0%80%20%EC%9E%90%EB%8F%99,%EC%9D%84%20%EC%93%B0%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EA%B2%83%EC%9D%B4%20%EC%A2%8B%EB%8B%A4.

https://minkukjo.github.io/language/2020/06/01/Kotlin-13/

profile
그냥 사람

0개의 댓글