sealed trait
vs. enum
Scala에서 sealed trait
와 enum
은 모두 여러 가지 값을 나타내는 타입을 정의하는 데 사용되지만, 구조와 용도에서 차이가 있습니다. 둘 다 Sum Type(합 타입)을 정의하는 데 쓰일 수 있지만, 세부적인 동작과 기능에서 차이를 보입니다. 이 차이를 더 명확히 하기 위해 각각을 살펴보겠습니다.
sealed trait
는 다양한 하위 타입들을 정의할 수 있는 추상적인 데이터 구조입니다. Scala에서 sealed
키워드는 해당 트레잇을 상속할 수 있는 타입들을 제한합니다. 즉, sealed
가 선언된 트레잇을 상속받는 모든 하위 타입들은 같은 파일 내에서 정의되어야 합니다. 이는 컴파일러가 해당 트레잇을 상속하는 모든 타입을 알고 있어야만 하기 때문에, 패턴 매칭에서 컴파일러가 exhaustive check (모든 경우를 다루었는지 확인)를 할 수 있도록 돕습니다.
sealed trait Animal
case class Dog(name: String) extends Animal
case class Cat(name: String) extends Animal
case class Bird(name: String) extends Animal
sealed trait Animal
은 Animal
이라는 추상적인 개념을 나타내고, 그 하위 타입인 Dog
, Cat
, Bird
가 각각 구체적인 동물 타입을 나타냅니다.sealed trait
는 매우 유연합니다. 하위 타입은 case class
, object
, 또는 다른 sealed trait
일 수 있으며, 각 하위 타입은 서로 다른 필드를 가질 수 있습니다.Scala 3에서 도입된 enum
은 열거형 타입을 정의하는 더 간결하고 제한적인 방식입니다. enum
은 특정한 상태나 값들을 열거하는 데 사용되며, 간단한 Sum Type을 정의하는 데 적합합니다. 기존의 sealed trait
+ case class
패턴을 더 명시적이고 구조화된 방식으로 대체할 수 있습니다. enum
은 기본적으로 고정된 선택지 목록을 나타내며, 그 자체로 더 직관적입니다.
enum Animal {
case Dog(name: String)
case Cat(name: String)
case Bird(name: String)
}
enum Animal
은 Animal
의 하위 타입들을 정의하는 더 간결한 방식입니다.enum
의 각 경우(case)는 값 또는 필드를 가질 수 있으며, 컴파일러는 기본적으로 모든 경우를 알고 있어 패턴 매칭에서 exhaustive check를 제공합니다.특징 | sealed trait |
enum |
---|---|---|
유연성 | 더 유연함: case class , object , 또 다른 sealed trait 로 확장 가능 |
구조가 더 제한적: 각 경우는 enum 내에서 정의됨 |
복잡성 | 더 복잡한 데이터 구조를 표현할 수 있음 | 주로 간단한 상태나 값의 집합을 정의하는 데 사용 |
코드 구조 | 여러 파일에 걸쳐 하위 타입을 정의할 수 있음. 단, 같은 파일 안에서만 사용 가능 | 모든 경우는 한 파일에서 정의됨 |
패턴 매칭 | 패턴 매칭에서 모든 하위 타입을 다루도록 컴파일러가 보장 | 패턴 매칭에서 모든 경우를 다룰 수 있음 |
기본 제공 기능 | 별도의 부가 기능이 없음 | enum 은 추가적인 기능을 제공 (ex: 메소드, 열거 순서 등) |
sealed trait
을 사용하는 것이 좋습니다. 예를 들어 복잡한 데이터 구조를 정의해야 하거나, 여러 파일에 걸쳐 타입을 확장하고 싶다면 sealed trait
이 적합합니다.enum
은 명확하게 열거할 수 있는 고정된 선택지를 정의할 때 적합합니다. 복잡한 상속 구조가 필요 없고, 간단한 선택지들을 표현하고자 할 때 enum
을 사용하는 것이 더 간단하고 명시적입니다.결론적으로, **Scala 2에서는 sealed trait
**로 Sum Type을 정의했지만, **Scala 3에서는 enum
**을 사용하여 간결하고 더 명시적인 방식으로 열거형 타입을 정의할 수 있습니다.