📘 Backend/Kotlin

Kotlin - Classes

신건우 2023. 4. 23. 19:01

💡 코틀린에서 다양한 클래스를 다루는 법

목차

  • Data Class
  • Enum Class
  • Sealed Class, Sealed Interface

💡 Data Class

클래스 뒤에 data 키워드를 붙여주면 아래 항목들이 포함된 클래스가 만들어진다.

  • builder
  • equals
  • hashCode
  • toString

계층간의 데이터를 전달하기 위한 DTO (Data Transfer Object)

  • 데이터 (필드)
  • 생성자와 Getter
  • equals, hashCode, toString
data class PersonDTO(
    val name: String,
    val age Int
)

💡 Enum Class

추가적인 클래스르 상속받을 수 없다.

인터페이스는 구현할 수 있으며, 각 코드가 싱글톤으로 이루어져 있다.

enum calss Country(
    val code: String
) {
    KOREA("KO")
    AMERICA("US")
}

when 키워드는 Enum Class나 Sealed Class와 함께 사용할때 더욱 진가를 발휘한다.


자바 코드 예시

코드가 많아지게 된다면 else 로직 처리에 대한 애매함이 있다

// Java
private static void handleCountry(JavaCountry country) {
    if (country == JavaCountry.KOREA) {
        // 대충 로직
    }

    if (country == JavaCountry.AMERICA) {
        // 대충 로직
    }
}

코틀린 코드 예시

컴파일러가 country의 모든 타입을 알고있어, 다른 타입에 대한 로직(else)을 작성하지 않아도 된다.

Enum에 변화가 있으면 알 수 있다.

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

💡 Sealed Class, Sealed Interface

컴파일 타임때 하위 클래스의 타입을 모두 기억한다.

즉, 런타임때 클래스 타입이 추가될 수 없다.

하위 클래스는 같은 패키지에 있어야 한다.

추상화가 필요한 Entity or DTO에 sealed class를 활용한다.


Enum과 다른점

  • 클래스를 상속받을 수 있다.
  • 하위 클래스는 멀티 인스턴스가 가능하다.

상속이 가능한 추상 클래스를 만들되, 외부에서는 이 클래스를 상속받지 못하게 하는 클래스 예시

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

    class Avante : HyundaiCar("아반떼", 1_000L)
    class Sonata : HyundaiCar("소나타", 2_000L)
    class Granduer : HyundaiCar("그랜저", 3_000L)
}

💡 정리

  • Data Class는 equals, hashCode, tosTring을 자동으로 생성해준다.
  • Enum Class는 Java와 동일하지만 when과 함께 사용하면 큰 장점이 있다.
  • Sealed Class 역시 when과 함께 사용하면 큰 장점이 있다.