Kotlin

data class

kakaroo 2022. 5. 6. 00:41
반응형

data class 란 특별한 로직의 함수 없이 데이터만 포함할 수 있는 VO(Value-Object) class 를 의미합니다.

 

article logo

 

data class는 다음의 조건에 맞게 선언해야 합니다.

  • 주 생성자(primary constructor)를 선언해야 하며, 주 생성자의 매개변수는 최소 하나 이상이어야 한다.
  • 모든 주 생성자의 매개변수는 var 혹은 val 로 선언해야 한다.
  • data class는 abstract, open, sealed, inner 등의 예약어를 추가할 수 없다.

 

위 조건에 맞지 않는 경우의 예를 보겠습니다.

 

주 생성자의 매개 변수가 최소 하나 이상 이어야 한다.

 

주 생성자의 매개변수는 var 혹은 val 로 선언해야 한다. - (1)

 

주 생성자의 매개변수는 var 혹은 val 로 선언해야 한다. - (2)

 

data class는 abstract, open, sealed, inner 등의 예약어를 추가할 수 없다.

 


data class 가 유용한 것은 data class 에 선언한 데이터와 관련된 다양한 기능을 함수로 자동으로 제공하기 때문입니다.

 

  • equals() / hashCode()   --> Any class 에 정의
  • toString()
  • componentN()
  • copy()

 

equals()

객체의 데이터가 같은지를 비교하는 기능을 합니다. 일반 클래스에서는 객체를 비교하지만, data 클래스에서는 객체의 data를 비교합니다. 하지만, 다른 클래스의 객체라면 데이터가 같더라도 equals() 함수는 데이터를 비교하지 않습니다.

data class User(val name: String, val age: Int)
data class Person(val name: String, val age: Int)

val user = User("Kim", 20)
val person = Person("Kim", 20)
println(user.equals(person))	//false

 

주 생성자에 선언한 프로퍼티 값만 비교합니다.

data class User(val name: String, val age: Int) {
	var height: Int = 170
}

val user1 = User("Kim", 20)
val user2 = User("Kim", 20)
user2.height = 180

println(user1.equals(user2))	//true

 

 

toString()

data class의 데이터를 문자열로 반환합니다. 따로 설명하지는 않겠습니다.

 

 

componentN()

data class의 프로퍼티 값을 가져와야 할 때가 있습니다. 이 때, 프로퍼티 이름으로 가져와도 되지만, componentN() 함수를 이용할 수도 있습니다.

 

data class User(val name: String, val age: Int)

val user = User("Kim", 20)

println(user.compoent1)	//Kim
println(user.compoent2)	//20

 

단순히, 프로퍼티 이름을 가져오면 될 텐데, 왜 굳이 componentN() 함수를 사용할까요?

코틀린에서는 다음처럼 데이터의 분해 선언을 할 수 있습니다.

data class User(val name: String, val age: Int, val height: Int = 170)

val user = User("Kim", 20)

val (name, age) = user	//분해 선언(Destructuring declarations), 이 때 componentN() 함수가 사용됨

println("name= $name, age= $age")

 

copy()

이름 그대로 객체를 복사해서 다른 객체를 만들어 주는데, 데이터 클래스의 객체를 이용하다 일부분의 데이터만 변경해서 다른 객체를 만들 때 유용합니다.

data class User(val name: String, val age: Int)

val user1 = User("Kim", 20)
val user2 = user1.copy(name="Park")

println(user1.toString())	//User(name=Kim, age=20)
println(user2.toString())	//User(name=Park, age=20)
반응형

'Kotlin' 카테고리의 다른 글

제네릭  (0) 2022.05.08
연산자 함수, 오버로딩  (0) 2022.05.05
위임자 Delegates (observable, vetoable )  (0) 2022.05.05
전개 연산자 *  (0) 2022.05.05
생성자 (constructor)  (0) 2022.04.30