ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] DataClass
    Kotlin 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

    댓글

Designed by Tistory.