-
[Kotlin] DataClassKotlin 2022. 9. 14. 16:29
- DataClass는 매개체의 데이터를 관리하는 용도로 사용하는 클래스
- DataClass는 자바에서의 dto 에 lombok 을 적용한것과 거의 비슷. 상속될수 없고, 추상클래스로 만들수 없으며 단독으로만 사용이 가능한 클래스
- abstract, open, sealed, inner 클래스로 정의할 수 없음. 반드시 주 생성자를 가지고 있어야 함- Data Class 는 개발자의 개발 편리성을 위해 몇 가지 메서드가 자동으로 구현됨
- equals : 객체가 가지고 있는 변수를 모두 비교하는 메서드
- hashCode : 객체를 구분하기 위한 고유한 정수값
- copy : 객체를 복제하는 메서드
- toString : 객체가 가지고 있는 변수의 값을 출력
- componentN : 객체 분해 - 멤버변수들의 사용
class TestClass1(var a1:Int, var a2:Int) { var a3: Int = 0 constructor(a1: Int, a2: Int, a3: Int) : this(a1, a2) { this.a3 = a3 } fun testMethod1() { println("testMethod1 of TestClass1") } } data class TestClass2(var a1:Int, var a2:Int){ var a3:Int = 0 constructor(a1:Int, a2:Int, a3:Int) : this(a1, a2) { this.a3 = a3 } fun testMethod2(){ println("testMethod2 of TestClass2") } } data class TestClass3(var a1:Int, var a2:Int, var a3:Int)
fun main(){ var obj1 = TestClass1(100, 200) // 대표생성자 println("obj1.a1 : ${obj1.a1}"); println("obj1.a2 : ${obj1.a2}") println("obj1.a3 : ${obj1.a3}") var obj2 = TestClass1(100, 200, 300) // 보조생성자 println("obj2.a1 : ${obj2.a1}") println("obj2.a2 : ${obj2.a2}") println("obj2.a3 : ${obj2.a3}") obj1.testMethod1() obj2.testMethod1() println() var obj3 = TestClass2(100, 200) println("obj3.a1 : ${obj3.a1}") println("obj3.a2 : ${obj3.a2}") println("obj3.a3 : ${obj3.a3}") var obj4 = TestClass2(100, 200, 300) println("obj4.a1 : ${obj4.a1}") println("obj4.a2 : ${obj4.a2}") println("obj4.a3 : ${obj4.a3}") obj3.testMethod2() obj4.testMethod2() }
toString의 사용println("일반 클래스 TestClass1 의 객체 obj1 의 toStirng : $obj1") println("데이터 클래스 TestClass2 의 객체 obj3 의 toStirng : $obj3") // data class 는 개발자가 사용하기 쉽도록 toString 메서드를 자동으로 오버라이딩 함 // 다만 주생성자에서 만들어진 멤버변수가 아니라면 toString 반환내용에 포함되지 않음 var obj31: TestClass3 = TestClass3(10, 20, 30) println("데이터 클래스 TestClass3의 객체 obj31의 toString: $obj31")
equals의 사용
var obj5 = TestClass1(100, 200, 300) var obj6 = TestClass1(100, 200, 300) if(obj5 == obj6) println("TestClass1 객체들 obj5와 obj6은 같은 객체") else println("TestClass1 객체들 obj5와 obj6은 다른 객체") // 일반 클래스의 객체는 참조값(주소)를 비교 var obj7 = TestClass2(100, 200, 300) var obj8 = TestClass2(100, 200, 500) if(obj7 == obj8) println("TestClass2 객체들 obj7과 obj8은 같은 객체") else println("TestClass2 객체들 obj7과 ojb8은 다른 객체") // 데이터 클래스의 객체는 주생성자에서 생성된 멤버변수까리 비교 var obj32: TestClass3 = TestClass3(10,20,30) var obj33: TestClass3 = TestClass3(10,20,30) if(obj32 == obj33) println("TestClass2 객체들 obj32와 obj33은 같은 객체") else println("TestClass2 객체들 obj32와 obj33은 다른 객체")
Copy Method
val obj10 = obj7.copy() // copy 클래스는 새로운 객체 생성후 원본 객체의 멤버변수들을 복사해서 복사본 객체를 만들어냄 // 주생성자에서 만들어진 멤버변수만 복사되고, // 나머지는 클래스에서 정의된 초기값으로 값이 정해짐 // a1, a2는 obj7 객체가 갖고 있던 멤버변수의 값을 복사, a3는 클래스 정의할 때 지정한 초기값 복사 obj7.a1 = 500 println("obj7.a1 : ${obj7.a1}"); println("obj7.a2 : ${obj7.a2}") println("obj7.a3 : ${obj7.a3}"); println("obj7 : $obj7") println("obj10.a1 : ${obj10.a1}"); println("obj10.a2 : ${obj10.a2}") println("obj10.a3 : ${obj10.a3}"); println("obj10 : $obj10") // 데이터 클래스의 copy 메서드로 생성된 객체는 이역시도 data class 의 객체로 생성되서 // 필요한 모든 메서드가 오버라이딩 되어 있는 상태로 사용이 가능함
Component Method
- 주생성자에서 만들어진 멤버변수들의 값을 뱔도로 얻어서 사용하는 메서드
- 코틀린의 클래스에서는 멤버변수에 대한 getter 와 setter 가 이미 생성되기 때문에 그리 많이 사용되는 메서드는 아님
val num1 = obj7.component1() val num2 = obj7.component2() println("num1 : $num1") println("num2 : $num2") var obj11 = TestClass3(100, 200, 300) val num3 = obj11.component1() val num4 = obj11.component2() val num5 = obj11.component3() println("num3 : $num3") println("num4 : $num4") println("num5 : $num5") // a3 멤버변수를 데이터클래스에서 자동오버라이딩 또는 자동생성되는 메서드에서 사용되게 하려면 // 주생성자에 멤버변수 선언을 포함시켜 주어야함
component 메서드의 변형된 사용
val (num10, num11) = obj7 // component라는 키워드 없이 객체 안의 멤버변수를 다 꺼내서 왼쪽 변수들에 차례로 저장 println("num10 : $num10") println("num11 : $num11") val (num12, num13, num14) = obj11 println("num12 : $num12") println("num13 : $num13") println("num14 : $num14")
'Kotlin' 카테고리의 다른 글
[Kotlin] NullException (0) 2022.09.14 [Kotlin] Ex(Product, Repairable) (0) 2022.09.14 [Kotlin] Card Game (0) 2022.09.14 [Kotlin] Set (0) 2022.09.14 [Kotlin] Map (0) 2022.09.14