반응형

자바와 코틀린의 data class

이름, 나이, 성별을 갖는 데이터 클래스가 있다고 하자.

자바로 구현한다면 아래와 같을 것이다.

public class Person {
    String name;
    int age;
    String gender;
    
    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    
    // getter & setter 생략
}

흔히 POJO(Plain Old Java Object) 클래스라고 불리는 이 녀석은 딱히 비즈니스 로직을 갖고 있지 않으면서도 너무 많은 보일러 플레이트 코드를 필요로 한다.

코틀린에서는 이러한 데이터만을 다루는 클래스에 대해 아주 간편한 문법을 제공한다.

그냥 data class 키워드로 생성하여 생성자에 parameter들을 정의해주면 된다.

data class Person(var name: String, var age: Int, var gender: String)

이 한 줄의 코드면 끝이다.

놀라울 따름이다. 코틀린의 data class는 생성자부터 getter & setter, 심지어 canonical methods까지 알아서 생성해준다.

 

이러한 데이터 클래스를 선언하려면 몇 가지 제한 사항이 있다.

  • 기본 생성자에는 최소 하나의 파라미터가 있어야 한다.
  • 기본 생성자의 파라미터는 val이나 var여야만 한다.
  • 데이터 클래스는 abstract, open, sealed, inner가 되면 안 된다.

Canonical Methods

캐노니컬 메소드는 Any에 선언된 메소드다. (참고로 Any는 자바의 Object처럼 코틀린에서 모든 객체의 조상이 되는 객체이다.) 따라서 코틀린의 모든 인스턴스가 갖고 있는 메소드를 뜻한다.

코틀린의 data class는 모든 캐노니컬 메소드를 올바르게 구현하고 있다.

메소드는 다음과 같다.

  • equlas(other: Any?): Boolean - 이 메소드는 참조가 아니라 데이터 클래스 간 값의 일치를 비교한다.
  • hashCode(): Int - 해쉬코드는 인스턴스의 숫자 표현이다. hashCode()가 같은 인스턴스에서 여러 번 호출될 때 항상 동일한 값을 반환해야 한다. equals()로 비교할 때 참을 반환하는 두 인스턴스는 같은 hashCode()를 가져야만 한다.
  • toString(): String - 인스턴스의 문자열 표현이다. 데이터 클래스는 이를 멤버 변수의 값을 나열하도록 자동으로 재정의 한다.

 

 

copy() 메소드

개발을 하다 보면 종종 데이터 클래스의 복사를 하고 싶을 때가 있다.

코틀린의 데이터 클래스는 copy() 메소드를 통해 원하는 파라미터를 오버라이딩해서 데이터 클래스의 새로운 인스턴스를 생성할 수 있게 한다.

즉, 얕은 복사와 깊은 복사 중에서도 깊은 복사에 해당하는 copy라고 보면 되겠다.

val james = Person("James", 20, "male")
val tom = james.copy(name = "Tom")  // 이름만 Tom으로 바꾸고 나이와 성별은 james에서 복사

 

디스트럭쳐링(Destructuring)

코틀린은 디스트럭쳐링을 제공한다.

디스트럭쳐링이 뭔지 모르는 사람이라도 아래의 예시를 보면 바로 알 수 있을 것이다.

val james: Person = Person("James", 20, "male")
val (name, age, gender) = james

james라는 데이터 객체가 갖고 있는 데이터들을 별도의 메소드나 작업 없이 한 번에 꺼내올 수 있다.

경우에 따라서 모든 값이 필요하지 않다면, 사용되지 않는 모든 값은 밑줄(_)로 대체할 수 있다.

val (name, _, gender) = james

 


개인적으로 코틀린의 가장 만족스러운 부분 중 하나이다. 물론 자바에서도 Lombok이 그 역할을 어느 정도 해주지만, 플러그인 형태로 사용하는 것과 언어 차원에서 제공해주는 것에는 체감이 다르다.

너무 말도 안 되게 코드 라인 수가 줄어서 적응이 잘 안 된다는 것 빼고는 너무 좋은 문법이다.

반응형
반응형