Kotlin Data Class

Kotlin Data Class

  • DataClass는 매개체의 데이터를 관리하는 용도로 사용하느 클래스이다.
  • abstract, open, sealed, inner 클래스로 정의할 수 없다.
  • 반드시 주 생성자를 가지고 있어야 한다.
  • DataClass 를 사용하면 몇가지 메소드를 기본적으로 추가해서 사용상의 용이하게 할 수 있다.

Data Class의 메서드

  • equals : 객체가 가지고 있는 변수를 모두 비교하는 메서드
  • hashCode : 객체를 구분ㄴ하기 위한 고유한 정수값
  • copy : 객체를 복제하는 메서드
  • toString : 객체가 가지고 있는 변수의 값을 출력
  • componentN : 객체 분해
 이러한 메서드들이 자동으로 오버라이딩되어서 추가된다.


data class TestClass {
}

data class는 위와 같이 class 앞에 data를 붙여준다. data class는 무조건 주 생성자가 있어야 하므로 없으면 아래와 같은 에러가 발생한다.

Kotlin: Data class must have at least one primary constructor parameter


abstract data class TestClass2(var a1:Int, var a2:Int) {
}



open data class TestClass2(var a1:Int, var a2:Int) {
}


Kotlin: Modifier 'abstract' is incompatible with 'data'
Kotlin: Modifier 'open' is incompatible with 'data'

또한, data class는 abstract, open 등의 추상크래스, 부모 클래스로 선언될 수 없다.



Data Class 의 toString

fun main() {
var obj1 = TestClass1(100, 200)
var obj2 = TestClass2(100, 200)

println(obj1.toString())
println(obj2.toString())
}

class TestClass1(var a1:Int, var a2:Int) {

}

data class TestClass2(var a1:Int, var a2:Int) {
}

// Result
TestClass1@330bedb4
TestClass2(a1=100, a2=200)

일반 class의 toString 메서는 클래스의 이름 @ id 값을 출력하나, dataclass의 tostring 메서드는 멤버변수의 값을 그대로 출력해준다.


Data Class 의 객체 분해

 data class의 componetN 메서드를 이용해서 멤버 변수 각각을 분해 할 수 있다.

fun main() {
var obj1 = TestClass1(100, 200)
var obj2 = TestClass2(100, 200)

var(num1, num2) = obj1 // Error
var(num3, num4) = obj2 // Normal
}

class TestClass1(var a1:Int, var a2:Int) {

}

data class TestClass2(var a1:Int, var a2:Int) {
}
 data class인 TestClass2 는 Component1(), Component2() 메서드를 내부적으로 가지고 있기 때문에 각 멤버 변수를 객체 분해하여 변수에 담을 수 있지만, 일반 클래스에서는 해당 부분을 담을 수 없다. 

Kotlin: Destructuring declaration initializer of type TestClass1 must have a 'component1()' function

댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super