Language/kotlin

다양한 클래스 다루기

kimjingyu 2023. 5. 23. 02:19
728x90

Data Class

  • DTO 클래스
    • 데이터(필드)
    • 생성자와 getter
    • equals, hashCode
    • toString
  • data 키워드를 붙여주면 아래 메서드 해결
    • equals, hashCode
    • toString
  • 여기에 named argument 까지 활용하면 builder pattern을 쓰는 것 같은 효과도 있다.
  • 자바에서도 JDK16부터 record class를 도입하긴 했다.
data class Person(
    private val name: String,
    private val age: Int
)

Enum Class

  • 특징
    • 추가적인 클래스를 상속받을 수 없다.
    • 인터페이스는 구현할 수 있으며, 각 코드가 싱글톤이다.
enum class Country(
    val code: String
) {
    KOREA("KR"),
    AMERICA("US"),
    ;
}
  • when은 Enum Class 혹은 Sealed Class와 함께 사용할 경우에 진가를 발휘한다.
    • 자바의 경우 코드가 많아지게 되고, if else 의 로직 처리에 대한 애매함이 생긴다.
private static void handleCountry(JavaCountry country) {
    if (country == JavaCountry.KOREA) {
      // 로직 처리
    }

    if (country == JavaCountry.AMERICA) {
      // 로직 처리
    }
}
private fun handleCountry(country: Country) {
    when (country) {
        Country.KOREA -> TODO()
        Country.AMERICA -> TODO()
    }
}
  • 장점
    • 가독성
    • 컴파일러가 country의 모든 타입을 알고 있어서 다른 타입에 대한 로직(else)를 작성하지 않아도 된다.
    • Enum에 변화가 있으면 알 수 있다.

Sealed Class, Sealed Interface

  • 상속이 가능하도록 추상클래스를 만들고 싶은데, 외부에서는 이 클래스를 상속받지 않았으면 좋겠을 때, 하위 클래스를 봉인하자는 개념에서 만들어진 클래스이다.
  • 특징
    • 컴파일 타임 때, 하위 클래스의 타입을 모두 기억한다.
    • 즉, 런타임 때, 클래스 타입이 추가될 수 없다.
    • 하위 클래스는 같은 패키지에 있어야 한다.
  • Enum과 다른 점
    • 클래스를 상속받을 수 있다.
    • 하위 클래스는 멀티 인스턴스가 가능하다.
  • 추상화가 필요한 엔티티 혹은 DTO에 sealed class를 활용할 수 있다.
    • 자바 JDK17에서도 sealed class가 추가되었다.
728x90