반응형
Sealed Class와 Enum Class의 차이점
코틀린에서는 Sealed Class와 Enum Class 모두 특정 값의 집합을 정의하고 관리하는 데 사용됩니다. 하지만 이 둘은 사용 목적과 동작 방식에서 큰 차이가 있습니다. 이번 글에서는 Sealed Class와 Enum Class의 차이점과 각각의 활용 사례를 정리합니다.
1. Enum Class
정의
Enum Class
는 고정된 상수 집합을 정의하는 데 사용됩니다. 이 클래스는 각 상수가 하나의 객체로 간주되며, 비교와 분기에 유용합니다.
특징
- 값의 집합이 고정적이며 컴파일 시점에 정의됩니다.
- 각 상수는 싱글톤 객체로 동작합니다.
- 직렬화와 함께 사용하기 적합합니다.
- 간단한 상수 집합에 적합합니다.
예제
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
fun printDirection(direction: Direction) {
when (direction) {
Direction.NORTH -> println("Heading North")
Direction.SOUTH -> println("Heading South")
Direction.EAST -> println("Heading East")
Direction.WEST -> println("Heading West")
}
}
장점
- 간결하고 사용하기 쉽다.
- 상수 값 비교를 위한 타입 안정성을 보장한다.
- 코드 생성이 최적화되어 있어 성능상 이점이 있다.
단점
- 상수 값 외에 추가적인 데이터나 복잡한 동작을 포함하기 어렵다.
2. Sealed Class
정의
Sealed Class는 확장 가능한 클래스 계층을 정의하는 데 사용됩니다. 이는 특정 클래스 집합의 추상화를 가능하게 하며, 컴파일러가 모든 하위 클래스를 알 수 있게 합니다.
특징
추상 클래스로 동작하며, 하위 클래스는 같은 파일 내에 정의해야 합니다.
불변 데이터를 가지는 다양한 하위 타입을 정의할 수 있습니다.
런타임에 하위 클래스의 인스턴스 타입을 확인하기 용이합니다.
sealed class Shape {
data class Circle(val radius: Double) : Shape()
data class Rectangle(val width: Double, val height: Double) : Shape()
object Unknown : Shape()
}
fun printShape(shape: Shape) {
when (shape) {
is Shape.Circle -> println("Circle with radius: ${shape.radius}")
is Shape.Rectangle -> println("Rectangle with width: ${shape.width} and height: ${shape.height}")
Shape.Unknown -> println("Unknown shape")
}
}
장점
- 하위 클래스에서 데이터를 다룰 때 유연성이 높다.
- when 문을 사용할 때 타입 안전성과 컴파일러의 경고를 활용할 수 있다.
- 다양한 데이터 구조와 복잡한 동작을 정의할 수 있다.
단점
- Enum에 비해 구조가 복잡하다.
- 하위 클래스가 많아지면 관리가 어려워질 수 있다.
3. Sealed Class와 Enum Class의 비교
특징 | Sealed Class | Enum Class |
---|---|---|
사용 목적 | 데이터 구조와 동작이 다양한 하위 타입 관리 | 고정된 상수 값 집합 관리 |
확장성 | 하위 클래스 추가 가능 | 상수 값 추가 불가능 |
데이터 포함 여부 | 가능 (data class와 object 활용) | 불가능 (상수 값만 가짐) |
파일 위치 | 같은 파일 내에 하위 클래스 정의 필요 | 어디서든 접근 가능 |
when 문 사용 시 보장 | 모든 하위 타입을 체크하지 않으면 컴파일 경고 발생 | 모든 Enum 값을 체크하지 않아도 경고 없음 |
복잡한 동작 | 가능 (구현 세부사항 자유롭게 정의) | 불가능 (고정된 동작) |
4. 언제 사용해야 할까?
Enum Class를 사용할 때
- 고정된 상수 집합이 필요할 때
- 값 비교와 간단한 분기 처리가 주목적일 때
Sealed Class를 사용할 때
- 다양한 데이터 구조와 동작을 정의해야 할 때
- 런타임에 확장 가능성을 열어두고 싶을 때
- 복잡한 데이터와 함께 타입 안전성을 유지하고 싶을 때
5. 결론
Sealed Class와 Enum Class는 각각의 목적과 용도가 명확합니다.
단순한 상수 집합이 필요하면 Enum Class를, 다양한 하위 타입과 데이터 구조를 다뤄야 한다면 Sealed Class를 사용하는 것이 좋습니다.
사용하려는 시나리오에 맞게 적절히 선택하여 코드를 설계하면 더 안정적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
반응형
'코틀린' 카테고리의 다른 글
컴포즈 UI 성능과 Stability (1) | 2025.01.18 |
---|---|
코틀린 제네릭이란? (in, out) (1) | 2025.01.14 |
불변 객체 (0) | 2022.12.14 |
inline 함수 (0) | 2022.08.31 |
코틀린 by란? (0) | 2022.06.28 |