Kotlin

[Kotlin] 코틀린 Data Class, 데이터 클래스

별볼일있는 개발자 2023. 8. 18. 15:30

1. Data Class(데이터 클래스)란?

데이터 클래스는 일반 클래스와 달리, 다양한 메소드를 자동으로 생성해주는 클래스이다.

(equals(), hashCode(), toString(), copy(), componentN 의 5가지 함수를 자동으로 생성)

주로 서버에서 받아온 데이터를 받을 때 사용한다.

 

  • 기본 생성자는 1개 이상의 매개 변수를 가져야 함(매개 변수가 없는 생성자를 만들어야 할 때는 프로퍼티 기본값을 지정)
  • 모든 기본 생성자 매개 변수는 val 또는 var로 선언해야 한다.
  • abstract, open, sealed, inner 문법과 같이 사용할 수 없다.

 

2. Data Class 사용법

Data Class 는 클래스 앞에 data 키워드 하나만 붙이면 사용가능하다. 자세한 내용은 아래에서 확인해본다.

 

3. 일반 클래스와의 비교

위 코드를 보면 일반 클래스인 Book1 클래스와 데이터 클래스인 Book2 클래스 두개가 각각 title과 price 속성을 갖고 있다.

각각 book1, book2 인스턴스에 equals(), hashCode(), toString()을 호출한 결과 아래와 같다.

 

 

 

일반 클래스인 Book1 클래스는 예상했던 결과가 제대로 나오지 않았고,

데이터 클래스인 Book2 클래스는 제대로 결과가 출력됨을 알 수 있다.

이것은 data class가 코드상으로는 보이지 않지만 내부적으로 equals()와 hashCode(), toString()을 호출했기 때문이다.

 

기존에 자바 개발자라면 dto 등의 클래스에, getter, setter, toString, hashCode 등의 메서드를 오버라이딩해서 수동으로 추가를 해줬겠지만 코틀린에서는 data 키워드 하나만으로 이 귀찮은 작업을 해줄 수가 있다.

 

4. equals(), hashCode(), toString(), copy(), componentN  에 대해서

1) equals() : 값을 비교할 때 일반적으로 " == " 연산자를 사용한다. 코틀린에서 " == " 연산자를 사용하면 내부적으로 equals를 호출한다. equals() 는 주소값이 아닌 값 자체의 동등함을 비교를 한다. 아래 예제를 보면

위 코드의 결과는 어떻게 될까? 정답은 true 이다. 변수 a에도 b에도 동일하게 "hello"가 들어있기 때문이다.

 

그렇다면 만약에 위 두 변수의 참조 타입의 주소값을 비교하려면 어떻게 해야할까?

 

코틀린에서는 " === " 연산자를 지원한다. " === " 연산자는 변수의 주소값 비교를 할 때 사용된다.

 

" == " , " === " 연산자들에 대해서는 추후에 깊게 다뤄볼 예정이다.

 

2) hashCode() : 주어진 객체를 해싱 알고리즘에 의해 계산한 int 값을 return 해준다. 동일한 객체는 동일한 해시코드를 반환한다. hash와 관련된 자료구조(hashMap, hashTable) 는 동등성 연산인 equals 하기 전에 먼저 hash 비교를 수행한다. 즉 hashCode()의 값이 동일한 경우에만 equals 연산이 수행된다.

 

3) toString() : 인스턴스의 속성과 값을 문자열로 출력한다. 현재 어떤 값들이 들어있는지 확인할 때 사용한다. 

 

4) copy() : 객체를 복사하여 같은 내용의 새 객체를 만든다. 물론 원하는 파라미터만 수정해서 새로운 객체를 생성할 수도 있다. 아래 코드에서 book2는 book1의 값 전체를 그대로 복사했기 때문에 같은 값이 출력되고, book3은 복사를 할 때 값을 수정한 것을 알 수 있다. 그래서 기존 객체를 유지하면서 새롭게 객체를 만들 때 사용하면 된다.

5) componentN : 객체의 속성을 순서대로 반환하는 함수이다. 이 함수는 사용자가 직접 호출해서 사용하는 함수가 아니라 파라미터들을 자동으로 꺼내 쓸 수 있는 기능을 지원한다.

위 코드를 보면 Book 클래스의 첫번째 파라미터를 component1()로 구현되고, 두번째 파라미터를 component2()로 구현되서 각 파라미터마다 번호가 붙어서 분해가 가능한 구조가 된다.

 

이와 같이 코틀린에서 Data Class는 코드를 줄여주고 여러 메서드들을 편리하게 사용할 수 있게 해준다.

 

코틀린으로 개발하는 개발자라면 반드시 알아야 할 클래스이다.