본문 바로가기
Java & Kotlin/Kotlin

[Kotlin] Data, Enum, Sealed 클래스

by heekng 2022. 7. 6.
반응형

Data, Enum, Sealed 클래스

Data Class

Java

public class JavaPersonDto {

    private final String name;
    private final int age;

    public JavaPersonDto(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        JavaPersonDto that = (JavaPersonDto) o;
        return age == that.age && Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "JavaPersonDto{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Kotlin

data class PersonDto(
    val name: String,
    val age: Int
)
  • 계층간의 데이터를 전달하기 위한 DTO는 다음을 포함하고 있다.
    • 데이터(필드)
    • 생성자와 getter
    • equals, hashCode
    • toString
  • IDE를 활용할 수도 있고, lombok을 활용할 수도 있지만 클래스가 장황해지거나, 클래스 생성 이후 추가적인 처리를 해줘야 하는 단점이 있다.
  • 코틀린에서 data 키워드를 붙여주면 equals, hashCode, toString을 자동으로 만들어줕다.
  • 여기에 named argument까지 활용한다면? builder pattern을 사용하는 것 같은 효과도 있다.

Enum Class

Java

public enum JavaCountry {

    KOREA("KO"),
    AMERICA("US");

    private final String code;

    JavaCountry(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

Kotlin

fun handleCountry(country: Country) {
    when (country) {
        Country.KOREA -> TODO()
        Country.AMERICA -> TODO()
        Country.A -> TODO()
    }
}

enum class Country(
        private val code: String
) {

    KOREA("KO"),
    AMERICA("US"),
    A("A")
    ;

}
  • 자바의 Enum과 동일하게 추가적인 클래스를 상속받을 수 없다.
    인터페이스는 구현할 수 있으며, 각 코드가 싱클톤이다.
  • Enum을 이용해 분기처리를 할 때, 코틀린에서는 when을 이용해 읽기쉬운 코드로 바꿀 수 있다.
    • 또한 컴파일러가 Enum에 대한 모든 코드를 알고 있기 때문에 다른 타입에 대한 로직을 작성하지 않아도 된다.
    • Enum에 변화가 있다면 알 수 있다.

Sealed Class, Sealed Interface

Kotlin

sealed class HyundaiCar(
        val name: String,
        val price: Long
)

class Avante : HyundaiCar("아반떼", 1_000L)
class Sonata : HyundaiCar("소나타", 2_000L)
class Grandeur : HyundaiCar("그렌저", 3_000L)
  • sealed: 봉인을 한
  • Sealed Class는 컴파일 타임 때 하위 클래스의 타입을 모두 기억한다.
    • 즉, 런타임 때 클래스 타입이 추가될 수 없다.
    • 따라서 Enum Class에서 when을 이용하는 것과 같은 장점을 가진다.
    • Abstract Class와 다른점이 이것이다.
  • 하위 클래스는 같은 패키지에 있어야 한다.
  • Enum과 다른 점
    • 클래스를 상속받을 수 있다.
    • 하위 클래스는 멀티 인스턴스가 가능하다.
반응형

'Java & Kotlin > Kotlin' 카테고리의 다른 글

[Kotlin] 람다  (0) 2022.07.07
[Kotlin] 함수  (0) 2022.07.07
[Kotlin] 배열과 컬렉션  (0) 2022.07.07
[Kotlin] 중첩 클래스를 다루는 방법  (0) 2022.07.06
[Kotlin] object를 다루는 방법  (0) 2022.07.06
[Kotlin] 접근제어를 다루는 방법  (0) 2022.07.06