Kotlin - Data Class 정리 (feat. IntelliJ 사용시 DataClass 변경 테스트)
들어가며
코틀린이 제공하는 data class는 자바에서 DTO 역할을 하는 클래스와 같다.
하지만 자바에서 DTO를 정의할때 생성자 및 게터와 세터 등을 정의해줬던거와 다르게 코틀린의
데이터 클래스는 클래스 정의만 해주면 일반 클래스와 달리 다양한 메서드를 자동으로 생성해준다. 데이터 클래스의 특징들을 정리해본다.
데이터 클래스 생성 시 자동 생성 메서드 및 특징
메서드
hashCode() / copy() / equals() / toString() / componentsN()
특징
- 기본 생성자에 1개 이상의 파라미터 존재해야함
- 기본 생성자의 파라미터가 val 또는 var로 선언해야함
- 다른 클래스를 상속받을 수 없음 (단, sealed 클래스는 상속 받을 수 있으며, 인터페이스는 구현할 수 있음)
- abstract, open, sealed, inner 등 키워드를 붙일 수 없음
- 자동으로 생성한 메서드를 오버라이딩할 경우 오버라이딩한 메서드를 사용함
자바 코드와의 비교
자바
class People {
String name;
int age;
@Override
public String toString(){
return "[People] name : " + name + ", age : " + Integer.toString(age);
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
코틀린
data class People(
val name: String,
val age: Int
)
equals() 메서드 자바와의 비교
자바에서는 값의 동일성 비교시에는 equals() 메서드를 사용하고 메모리 상 같은 객체인지 검사시에는 == 을 사용하였다
코틀린에서는 ==이 값의 비교이며 메모리 상 같은 객체인지 검사시에는 === 을 사용하면 된다.
인텔리제이 사용시 일반 클래스에서 데이터 클래스로의 변환
개발 도구로 인텔리제이를 사용하는데 일반 클래스와 데이터 클래스의 차이점은 class 앞에 data가 붙어 있고 없고의 차이이다. 근데 과연 생성했을때는 일반 클래스 객체로 생성하였는데 data만 붙여준다고 바뀔까? 라는 의문점에서 테스트를 해보았다.
인텔리제이에서 클래스를 만들때 보면 다음과 같이 일반 클래스와 데이터 클래스가 분리되어 있다.
그래서 각 각 클래스와 데이터클래스를 만들어준다.
이 상태에서 생성자를 통해 각각의 객체를 만들어서 print로 찍어보면 다음과 같이 데이터클래스는 자동으로 toStirng() 메서드가 동작하여 다음과 같이 나오는 것을 확인할 수 있다.
그럼 이 상태에서 KotlinClass 객체에 data 만 붙이고 다시 print 했을때 동일하게 toString 메서드가 동작한다면 data만 붙이면 데이터 클래스로 바뀐다는 것을 확정할 수 있다.
자 다음과 같이 data를 붙인다.
프린트를 찍어본다. 아주 잘나온다.
이것으로 결론은 다시 생성해줄 필요없이 data만 붙여주면 알아서 잘 바뀐다는 것을 확인했다.