본문 바로가기
2학년 2학기/모바일 소프트웨어 - 코틀린

Class(2) - data class

by print_soo 2024. 10. 11.

data class란?

데이터를 저장하고 다루는 용도로 특별하게 설계된 클래스이다. 일반적인 클래스와는 다른 몇가지 자동화된 기능을 제공한다.

주로 값 객체를 만들 떄 유용하다. 

 

일반 클래스에도 equals, hashCode메소드가 있는데 뭐가 다른가?

일반 클래스는 해당 값들의 주소를 비교한다. 따라서 값이 같아도 주소가 다르면 다르다고 판단한다. 하지만 data 클래스는 값을 비교하기ㄷ 때문에 주소가 달라도 값이 같다면 같다고 판단한다.

 

 


data class - toString()

 

data class Fruit(var name: String, var sciName: String, var calories: String)

fun main(){
    val apple = Fruit("Apple", "학명: Malus domestica", "100g당 칼로리: 48kacl")
    println(apple) //Fruit(name=Apple, sciName=학명: Malus domestica, calories=100g당 칼로리: 48kacl)
}

 

일반적인 클래스에서 객체를 출력하면 객체명과 아이디 값만 나왔다. 그래서 우리는 따로 toString 메소드를 재정의해서 값을 출력했다. 하지만 data class는 우리가 재정의한 기능을 자동으로 제공해준다.

 


 

data class - equals, hashCode()

 

data class Fruit(var name: String, var sciName: String, var calories: String)
fun main() {
    val apple = Fruit("Apple", "학명: Malus domestica", "100g당 칼로리: 48kacl")
    val apple2 = Fruit("Apple", "학명: Malus domestica", "100g당 칼로리: 48kacl")

    println(apple == apple2) //true
    println(apple.hashCode() == apple2.hashCode()) //true
}

 

마찬가지로 일반적인 클래스에서는 메모리 주소값을 기준으로 같은지 판별했지만, 데이터 클래스는 값을 기준으로 판단하기 때문에 같다고 판단한다.

 


 

data class - copy()

class Person(var name: String, var age: Int, var isMarried: Boolean)

fun main() {
    val hong = Person("Hong", 42, true)
    val kim = hong
    kim.name = "Kim"
    println(hong.name) //Kim
}

 

 

일반적인 클래스는 변수에 객체를 할당하는 경우 주소 값을 할당하기 때문에, 할당된 변수의 객체에 값을 변경하면 원본의 값도 바뀐다.(위의 코드 참조)

 

data class Person(var name: String, var age: Int, var isMarried: Boolean)
fun main() {
    val hong = Person("Hong", 42, true)
    val kim = hong.copy()
    kim.name = "Kim"
    println(kim.name) //Kim
    println(hong.name) //Hong
}

 

 

하지만 data class는 copy()라는 메소드를 지원한다. 즉, 참조를 하지 않고 복사를 하게 해주는 메소드이다.

 


 

data class - componentN()

: 각 프로퍼티를 순서대로 반환하는 함수로, 객체의 각 프로퍼티를 쉽게 분해(Destructuring)할 수 있도록 자동 생성

 

data class Fruit(val name: String, val sciName: String, var calories: String)
fun main() {
    val apple = Fruit("Apple", "학명: Malus domestica", "100g당 48kcal")

    val fName = apple.component1()
    val sName = apple.component2()
    val cal = apple.component3()
    print("$fName, $sName, $cal") //Apple, 학명: Malus domestica, 100g당 48kcal

}

 

이렇게 각 프로퍼티를 component를 이용해서 접근할 수 있다. 

 

 

아래와 같이 한번에 접근할 수도 있다.

data class Fruit(val name: String, val sciName: String, var calories: String)
fun main() {
    val apple = Fruit("Apple", "학명: Malus domestica", "100g당 48kcal")

    val (fName: String, sName: String, cal: String) = apple
    print("$fName, $sName, $cal") //Apple, 학명: Malus domestica, 100g당 48kcal

}