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
댓글
댓글 쓰기