프로그래밍/Kotlin

[코틀린 / Kotlin] 데이터 클래스

pupu91 2022. 10. 20. 16:42
반응형

 

데이터 클래스

단순히 값을 저장하기 위한 용도로 클래스를 활용하려면 data 키워드를 이용해서 정의할 수 있다.
이 때 유용하게 활용할 수 있는 여러 메소드를 자동으로 구현해준다.
단, 주 생성자에 정의 된 속성만 이용해서 메소드의 내용을 구성한다.

toString : 객체의 내용 문자열 반환
equals : 두 객체의 속성 값 비교(주소 값 비교 x)
copy : 원본 객체 속성 값 복사 된 새로운 객체 생성
hashCode : 객체의 속성 값 비교
componentN: 객체의 속성 값 반환

컬렉션을 사용할 때는 equals, hashCode 등의 메소드가 오버라이딩 되어야 한다(속성 값 동등 비교를 위해)
/* class 앞에 data만 붙여주면 됨 */
data class PersonClass(var name: String, var age: Int)

fun main(){

    var p1 = PersonClass("짱구", 17)
    var p2 = PersonClass("짱구",17)
    var p3 = PersonClass("스폰지밥",16)

    /* toStirng */
    println(p1.toString())
    println(p1)

    /* equals
       비교 연산자(==)를 이용하면 내부적으로 equals 메소드가 호출 되고
       메소드의 인자값으로 비교할 대상 객체가 전달 된다.*/
    println(p1 == p1)
    println("equals: ${p1.equals(p2)}")
    println(p1 == p3)

    /* 참조 비교 연산자(===)를 사용하면 두 객체의 참조가 같은지(동일 객체)를 비교한다.*/
    println(p1 === p2)

    /* copy */
    var copied1 = p1.copy()
    println(copied1)
    println("복사 이후 : ${ p1 === copied1 }")

    /* 명명인자를 전달하는 형식으로 속성 값을 전달하면 
      해당 속성의 내용만 변경 된 복사 객체를 생성할 수 있다.*/
    var copied2 = p1.copy(name="네모네모")
    var copied3 = p1.copy(age=2)
    println("이름만 변경한 복사 객체$copied2")
    println("이름만 변경한 복사 객체$copied3")

    /* componentN
    *  구조 분해 할당을 이용할 때 componentN 메소드가 유용하게 활용된다. */
     /* var p1Name = p1.component1()
        var p1Age = p1.component2()*/
	
    //위의 주석한 코드와 동일하게 동작하는 코드 p1객체를 분해해서 name. age 하나씩 할당한다~
    var (p1Name, p1Age) = p1 
    println(p1Name)
    println(p1Age)

    /* hashCode */
    println(p1.hashCode())
    println(p2.hashCode())
    println(p3.hashCode())
}

출력 결과
PersonClass(name=짱구, age=17)
PersonClass(name=짱구, age=17)
true
equals: true
false
false
PersonClass(name=짱구, age=17)
복사 이후 : false
이름만 변경한 복사 객체PersonClass(name=네모네모, age=17)
이름만 변경한 복사 객체PersonClass(name=짱구, age=2)
짱구
17
51057110
51057110
440031487
반응형