Kotlin data class에 대해서 알아보려고 한다.
Java의 data class
Car 이라는 객체를 예시로 Step By Step 접근을 해보자
Plain Java Object로 Car를 작성하면 다음과 같다.
public class Car {
private String name;
private int price;
}
여기서 Car 인스턴스 필드에 접근하기 위한 getter / setter 를 추가하면 아래와 같다.
public class Car {
private String name;
private int price;
public String getName() {
return name;
}
public int price() {
return price;
}
public void setName(String name) {
this.name = name;
}
public void setPrice(int price) {
this.price = price;
}
}
ㅎ... 조금 길어졌다... 하지만 아직 끝나지 않았다. 단순 DTO라면 Object.java
에 존재하는 몇 가지 메소드들 중 equals()
hashCode()
toString()
정도는 구현하는 것이 좋다. 아 참 기본 생성자도 만들어야 한다.
public class Car {
private String name;
private int price;
public Car(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int price() {
return price;
}
public void setName(String name) {
this.name = name;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NewCar newCar = (NewCar) o;
return price == newCar.price && Objects.equals(name, newCar.name);
}
@Override
public int hashCode() {
return Objects.hash(name, price);
}
@Override
public String toString() {
return "NewCar{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
와.. 엄청 길어졌다... 아무리 IntelliJ에서 자동 생성 (command + N)이 가능하다고 해도 클래스 자체가 길어진 것이 불편하게 느껴진다.
이럴때 롬복을 사용할 수 있다.
@AllArgsConstructor
@Getter
@Setter
@ToString
@EqualsAndHashCode
public class Car {
private String name;
private int price;
}
@Data
어노테이션을 사용하면 더 줄일 수 있을 것이다.
Kotlin의 data class
이제 코틀린을 살펴보자.
코틀린에서는 Java의 최종 완성본 Class를 짧게 만들 수 있다.
data class Car(private val name: String, private val price: Int) {
}
끝이다!
이 클래스는 기본 생성자와 getter, setter, toString, equals와 hashCode까지 모두 가지고 있다.
또한 비구조화 할당도 할 수가 있다.
val (name, price) = newCar;
Java에서도 lombok을 사용하면 간단히 data class를 만들 수 있지만 언어 차원에서 data class를 제공해 주는 것이 간결하게 느껴진다.
끝!
'개발 공부 기록하기 > 01. JAVA & Kotlin' 카테고리의 다른 글
[코틀린] companion object이란? (2) | 2021.01.24 |
---|---|
[코틀린 탐구생활] when, 그리고 클린 코드 (0) | 2021.01.20 |
[코틀린] ?. 연산자, ?: 연산자 (2) | 2021.01.05 |
[코틀린] val과 var 차이 (0) | 2021.01.05 |
짧은 코멘트와 함께하는 이펙티브 자바) #20 추상 클래스보다는 인터페이스를 우선하라 (0) | 2020.11.10 |