728x90
Enum
- 열거형. 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성하고 그 중 하나의 상태를 선택해 나타내는 방식이다.
- 특징
- enum class 안에는 상수를 나타내는 대문자로 나타낸다.
- enum 객체들은 고유한 속성을 가질 수 있다.
- 일반 클래스처럼 함수 선언도 가능하다.
enum class Color (val red: Int, val green: Int, val blue: Int) {
RED(255, 0, 0),
GREEN(0, 255, 0),
BLUE(0, 0, 255); <- ;이 핵심
fun isRed() = this == Color.RED
}
- 단점
- 각 객체들이 서로 다른 형태를 가질 수 없다.
- enum 클래스의 각 상수들은 싱글톤 디자인 패턴을 따르기 때문에 단 하나의 인스턴스만 존재하게 된다.
- 따라서 최초에 설정한 enum 각각에 대한 상태를 변경할 수 없다.
- RED(255,0,0)이라고 정의해뒀으면, 속성값들을 바꿀 수 없다는 이야기이다.
- 상속이 불가능한 형태이기 때문에 enum에 대한 서브 클래스를 생성할 수도 없다.
- 각 객체들이 서로 다른 형태를 가질 수 없다.
enum class Result {
SUCCESS,
FAILED(val exception: Exception);
}
Sealed
- Enum과 같은 value 당 제한을 가지면서 각 value의 형태를 다르게 확장성 있도록 가져가기 위해서 sealed class를 사용한다.
- sealed 클래스는 자기 자신이 추상 클래스이고, 자신을 상속받는 여러 서브 클래스들을 가질 수 있다.
- 이를 사용하면 enum 클래스와 달리 상속을 지원하기 때문에 상속을 활용한 풍부한 동작을 구현할 수 있다.
- 특징
- sealed class의 서브 클래스들은 반드시 같은 파일 내에 선언되어야 한다. 단, sealed 클래스의 서브 클래스를 상속한 클래스들은 같은 파일 내에 없어도 된다.
- sealed class는 기본적으로 abstract 클래스이다.
- sealed class는 private 생성자만 가진다.
- 각 타입을 특정 범위로 묶을 수 있다.
- 각각의 요소가 되는 항목들 역시 다른 형태의 값을 지닐 수 있다.
- sealed class를 상속받는 클래스들은 같은 kt 파일 또는 패키지 안에 존재해야 한다.
- 내부적으로 private한 constructor를 갖기 때문이다.
- 외부에서 sealed class를 상속받는다면 컴파일 에러가 발생한다.
- 서브 클래스 각각은 각기 다른 값을 가지고 개성있게 생성될 수 있도록 되어있다.
- 서브 클래스들은 class, data class, object 모두 가능하다.
- 상태값이 바뀌지 않는 서브 클래스의 경우 object를 권장
sealed class Color
data class Red(val r: Int, val g: Int, val b: Int) : Color()
data class Orange(val r: Int, val g: Int, val b: Int) : Color()
data class Yellow(val r: Int, val g: Int, val b: Int) : Color()
data class Green(val r: Int, val g: Int, val b: Int) : Color()
data class Blue(val r: Int, val g: Int, val b: Int) : Color()
data class Indigo(val r: Int, val g: Int, val b: Int) : Color()
data class Violet(val r: Int, val g: Int, val b: Int) : Color()
Sealed Class 의 장점
- sealed 클래스의 서브 클래스 각각에 대해 여러 개의 인스턴스 생성이 가능하다.
- 이 덕분에 상태값을 유동적으로 변경할 수 있다.
- sealed 클래스의 계층을 생성할 수 있다.
인용
https://velog.io/@ddyy094/Enum-class%EC%99%80-Sealed-class
https://velog.io/@haero_kim/Kotlin-Sealed-Class-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
https://jgeun97.tistory.com/242
728x90
'Language > kotlin' 카테고리의 다른 글
다양한 함수 다루기 (0) | 2023.05.24 |
---|---|
배열과 컬렉션 다루기 (0) | 2023.05.23 |
다양한 클래스 다루기 (0) | 2023.05.23 |
중첩 클래스 다루기 (0) | 2023.05.22 |
object 키워드 다루기 (0) | 2023.05.22 |