ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14강. 코틀린에서 다양한 클래스를 다루는 방법
    BackEnd/Kotlin 2024. 3. 13. 22:00
    반응형
    1. Data Class
    2. Enum Class
    3. Sealed Class

     

    Data Class

      다음은 계층간의 데이터를 전달하기 위한 Java의 DTO(Data Transfer Object) 클래스입니다. DTO 클래스에는 다음과 같은 항목들이 존재하며, IDE를 활용하거나 lombok을 사용해 생성할 수 있습니다. 

    • 데이터(필드)
    • 생성자와 getter
    • equals, hashCode
    • toString
    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 키워드를 붙여주면 equals, hashCode, toString을 자동으로 만들어 줍니다.

    data class PersonDto(
        val name: String,
        val age: Int,
    )

      여기에 named argument까지 활용하면 builder pattern을 쓰는 것 같은 효과까지 누릴 수 있습니다.

     

      Java에서는 JDK16부터 Kotlin의 data class 같은 record class를 도입하였습니다.

     

    Enum Class

      다음은 Java의 Enum 클래스입니다. Enum 클래스는 추가적인 클래스를 상속받을 수 없고 인터페이스는 구현할 수 있으며, 각 코드는 싱글톤입니다.

    public enum JavaCountry {
    
      KOREA("KO"),
      AMERICA("US"),
      ;
    
      private final String code;
    
      JavaCountry(String code) {
        this.code = code;
      }
    
      public String getCode() {
        return code;
      }
    
    }

     

      Kotlin으로 구현하면 다음과 같습니다.

    enum class Country(
      val code: String
    ) {
      KOREA("KO"),
      AMERICA("US"),
      ;
    }

     

      Enum에 대한 분기 처리를 할 때 Kotlin에서는 when을 사용해서 조금 더 읽기 쉬운 코드로 바꿀 수 있고, 컴파일러가 Enum의 모든 타입을 알고 있어 다른 타입에 대한 로직(else)을 작성하지 않아도 됩니다. 또한 Enum에 변화가 있으면 알 수 있습니다(IDE Warning).

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

     

    Sealed Class

      Sealed Class는 상속이 가능하게 계층 구성을 하고 싶으나 외부에서는 해당 클래스를 상속받지 않게 하기 위해 사용합니다. 즉, 하위 클래스를 봉인하기 위해 사용합니다.

    • 컴파일 타임 때 하위 클래스의 타입을 모두 기억합니다. 즉, 런타임 때 클래스 타입이 추가될 수 없습니다.
    • 하위 클래스는 같은 패키지에 있어야 합니다.
    • Enum Class와 다른 점은 Sealed Class는 클래스를 상속받을 수 있으며, 하위 클래스는 멀티 인스턴스가 가능합니다.
    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 Class 또한 when과 함께 주로 사용합니다.

    private fun handleCar(car: HyundaiCar) {
        when (car) {
            is Avante -> TODO()
            is Grandeur -> TODO()
            is Sonata -> TODO()
        }
    }

     

    JDK17에서도 Sealed Class가 추가되었습니다.

     

     

     

    감사합니다.

    반응형

    댓글

Designed by Tistory.