포스트

Kotlin의 다양한 클래스 다루기


Data Class


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

1
2
3
4
5
6
7
8
9
10
public class JavaPersonDto {

    private final String name;
    private final int age;

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


DTO가 가지는 추가적인 method

  • Data(필드)
  • 생성자 / getter
  • equals / hashCode
  • toString


Kotlin의 DTO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fun main(){
    var dtoV1 = PersonDTO("김용준", 29)
    var dtoV2 = PersonDTO("김용준", 100)
    println(dtoV1.name == dtoV2.name)
    println(dtoV1.age == dtoV2.age)
    println(dtoV1)
}

// data 키워드를 붙이면 data class 라고 한다.
// equals / hashCode / toString 을 자동으로 만들어 준다.
data class PersonDTO (
    val name: String,
    val age: Int
)
  • named argument를 사용하면 builder pattern과 같은 효과
  • 출력 값
    • true
      false
      PersonDTO(name=김용준, age=29)


Java - JDK16

  • Kotlin의 data class같은 record class도입




Enum Class


Java의 Enum Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum JavaCountry {

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

  private final String code;

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

  public String getCode() {
    return code;
  }

}
  • 추가적인 클래스를 상속받을 수 없다.
  • 인터페이스는 구현할 수 있으며, 각 코드(KOREA, AMERICA)가 싱글톤


Kotlin의 Enum Class

1
2
3
4
5
enum class Country (
    private val code: String
){
    KOREA("KO"), AMERICA("US")
}


when

  • Enum Class 혹은 Sealed Class와 함께 사용할 경우, 진가를 발휘한다.


Java의 Enum 분기 처리

1
2
3
4
5
6
7
8
9
  private static void handleCountry(JavaCountry country) {
    if (country == JavaCountry.KOREA) {
      // 로직 처리
    }

    if (country == JavaCountry.AMERICA) {
      // 로직 처리
    }
  }
  • if가 많아 지면 가독성이 안좋아 지고, else로직 처리도 해줘야 한다.


Kotlin의 Enum 분기 처리

1
2
3
4
5
6
fun handleCountry(country: Country) {
    when (country) {
        Country.AMERICA -> println("한국")
        Country.KOREA -> println("미국")
    }
}
  • Country라는 Enum Class를 받아서 when을 사용
    • if문을 남발하지 않아도 되고, 의미없는else처리를 하지 않아도 된다.
    • enum의 변화가 있으면 알 수 있다.
      • 사라진 경우, 추가된 경우 IDE에서 warning으로 알림




Sealed Class, Sealed Interface


Sealed Class란?

  • “봉인을 한” 이라는 뜻
  • 상속이 가능하도록 추상클래스를 만드는데 외부에서 해당 클래스를 상속받지 않았으면 할 때 사용
    • 즉, 하위 클래스를 봉인
  • 컴파일 타입 때 하위 클래스의 타입을 모두 기억
    • 런타임에 클래스 타입이 추가될 수 없다.
  • 하위 클래스는 Sealed Class와 같은 패키지에 있어야 한다.

Enum과 다른 점

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


Kotlin의 Sealed Class

1
2
3
4
5
6
7
8
sealed class HyundaiCar (
    val name: String,
    val price: Long
)

class Avante : HyundaiCar("아반떼", 1_000L)
class Sonata : HyundaiCar("소나타", 2_000L)
class Grandeur : HyundaiCar("그렌저", 3_000L)
  • class 앞에 sealed를 명시
  • 같은 패키지 내에 Avante / Sonata / Grandeur class를 생성


Enum Class와 같이 when 사용 가능

1
2
3
4
5
6
7
private fun handlerCar(car: HyundaiCar){
    when (car){
        is Avante -> println("아반떼")
        is Grandeur -> println("그렌저")
        is Sonata -> println("소나타")
    }
}
  • when안에 Sealed Class가 들어 간다면 is를 이용해서 분기 처리 가능


Sealed Class의 사용

  • 추상화가 필요한 Entity or DTO에 활용
  • JDK17에도 Sealed Class가 추가됨 (문법은 다름)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.