[Kotlin] Data Class

Hood·2024년 12월 24일

Kotlin

목록 보기
9/18
post-thumbnail

✍  코틀린과 친해지자

PS문제를 하나씩 풀다보니 공부가 필요한 문법에 대해서 정리한 글입니다.


Data Class 개념

코틀린 공식 문서에 따르면 데이터 클래스는 주로 데이터를 보관하는데 사용됩니다.
각 데이터 클래스에 대해 컴파일러는 자동으로 인스턴스를 비교하고
인스턴스를 복사하는 등의 작업을 할 수 있는 추가 맴버 함수를 생성합니다.

Kotlin에서의 Data Class는 다음과 같이 표시됩니다.

data class User(val name:String, val age:Int)

생성된 코드의 일관성과 의미 있는 동작하려면 요구 사항을 충족시켜줘야 합니다.

  1. 기본 생성자에는 최소한 하나의 매개변수가 있어야 합니다.
  2. 모든 기본 생성자 매개변수는 val, var로 표시되어야 합니다.
  3. 다른 클래스를 상속받을 수 없습니다.

Class vs Data Class

클래스와 데이터 클래스의 차이는
편리함을 제공해주는 유용한 메소드들이 자동으로 생성된다는 점입니다.

  • hashCode()
  • copy()
  • equals()
  • toString()
  • componentN()

toString()

생성된 객체를 그대로 출력해보면 갖고 있는 프로퍼티의 값들이 알아서 출력되는 것
다음과 같이 변수 a에 저장되어 있는 것을 출력해보면
People 데이터 클래스 형식처럼 출력되는 데 이것이 바로 toString() 메소드에 출력된 것이다.

data class People (
    val name : String,
    val age : Int,
)

fun main(){
    val a = People("Smith", 20)
    val b = Person("Nick", 24)

    println(a)
    //People(name=Smith, age=20)
}

Copy()

특정 필드 값만 바꿔서 복사하는 메소드이다.

	val copyA = a.copy(age = 30)
	print(copyA)
    //People(name=Smith, age=30)

위에서 만든 People 데이터 클래스안에 copy를 쓰게 되면 a라는 사람의 이름이 복사된 채
나이만 30으로 바뀌어 출력되는 것을 확인할 수 있습니다.

hashCode()

프로퍼티 값이 완전히 같은 두 Data Class 객체를 만들고 hashCode()를 출력해보면
같은 값을 확인할 수 있습니다.
이때 data class가 아닌 class는 다른 값을 출력합니다.

fun main(){
    val a = People("Smith", 20)
    println(a.hashCode())
    //-1814841199
    val copyA = a.copy()
    print(copyA.hashCode())
    //-1814841199
}

equals()

두 객체를 비교하는 연산입니다.
== 연산자로 두 객체가 동일한 값을 담고있는지 알 수 있습니다.
또한 === 연산자를 통해 메모리 상에 같은 객체인지도 확인할 수 있습니다.

componentN()

data class는 componentN()메소드가 생성되기에
각 프로퍼티에 번호가 붙어 구조분해가 가능한 형태가 됩니다.

fun main(){
    val a = People("Smith", 20)
    val (name, age) = a
    println("구조 분해 : $name, $age")
    //구조 분해 : Smith, 20
}

📌결론

데이터가 두 개라면 Pair를 세 개라면 Triple을 사용하는 데
여러 개 받아야 할 때 data class를 사용하면 편리한 메소드를 사용할 수 있습니다.

참고자료
Data classes
[Kotlin] 감동 실화 Data Class 알아보기

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글