enum class
enum 클래스는 미리 정의된 상수들로 이루어진 제한된 집합을 표현하는 클래스입니다. enum 클래스를 사용하면 정해진 상수들로 이뤄진 집합을 타입 안전(type-safe)하게 다룰 수 있습니다.
가장 단순한 형태는 아래와 같습니다.
빠뜨린 부분이 없는 when 식
enum 역시, 다른 타입과 유사하게 when을 사용해 변수 각각의 값을 비교할 수 있습니다. enum 사용 시 when 식에서 enum의 값이 될 수 있는 모든 enum 상수를 다룬다면, 따로 else를 작성하지 않아도 됩니다.
- 코틀린은 내부적으로 빠뜨린 부분이 없는 when 식에는 NoWhenBranchMatchedException 타입의 예외를 던지는 else가 암시적으로 추가됩니다.
- 빠뜨린 부분이 없는 when 식의 장점은, enum 상수가 추가되었을 때 when절에 해당 상수가 빠지는 것을 방지해줍니다.
- else가 없는데, enum 상수를 모두 when 식에서 다루지 않았다면 위와 같이 에러를 발생시켜줍니다.
data class
코틀린은 데이터를 저장하기 위한 목적으로 주로 쓰이는 클래스를 선언하는 유용한 기능을 제공합니다. 이를 data class라고 부르며, data class를 사용하면 컴파일러가 동등성을 비교하거나 String으로 변환하는 등의 기본 연산에 대한 구현을 자동으로 생성해줍니다.
일반적인 class를 사용하여 특정 클래스의 두 인스턴스가 동등한지 비교하면 아래와 같이 해당 변수가 가리키는 객체가 같은지(메모리에서 같은 위치에 존재하는지) 비교하며, 객체의 필드값이 동일한지는 비교하지 않습니다. 이로 인해, 보통 객체의 필드값을 각각 비교하는 등의 커스텀 동등성 비교를 하기 위해서는 equals() 메소드와 이와 연관된 hashCode() 메소드를 구현합니다.
data class는 코틀린이 클래스의 프로퍼티 목록을 기반으로 이러한 메소드를 자동으로 생성해줍니다. 따라서, 아래와 같이 따로 커스텀 equals()를 생성하지 않아도 객체의 필드값들을 기반으로 동등성 비교가 가능합니다.
프로퍼티의 값 비교가 equals()에 의해 이루어지기 때문에 아래 예시와 같이 data class의 프로퍼티에 어떤 타입이 들어가는지에 따라 깊은 동등성이 이루어지는 여부가 달라집니다.
- 프로퍼티로 일반 class가 들어가고 해당 class에 대해 equals()를 따로 오버라이딩하지 않았다면 깊은 동등성 비교가 되지 않습니다.
data class는 equals()와 hashCode() 뿐 아니라 toString() 메소드 역시 생성해줍니다. 이 메소드는 클래스의 인스턴스를 문자열로 변환해줍니다.
참고 자료
'PROGRAMMING LANGUAGE > KOTLIN' 카테고리의 다른 글
[Kotlin Coroutine] 코루틴 기본 이해 & JVM에서의 async (0) | 2024.06.08 |
---|---|
[Kotlin] Collections의 Iterable과 Sequences 차이점 (0) | 2023.08.23 |
[Kotlin] 객체 (0) | 2022.08.25 |
[Kotlin] 널 가능성 (0) | 2022.08.12 |
[Kotlin] 클래스 기초 (0) | 2022.08.12 |