개발 공부 기록하기/01. JAVA & Kotlin

[코틀린] data class란?

lannstark 2021. 1. 7. 00:12

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를 제공해 주는 것이 간결하게 느껴진다.

끝!