Dart에서는 SealedClass
를 사용하여 여러 타입의 서브클래스를 가질 수 있는 안전한 데이터 클래스를 정의할 수 있습니다. 이는 특히 불변 데이터 모델링과 명시적 타입 검사를 위한 강력한 도구입니다. SealedClass
는 Dart의 Null Safety와 결합하여 타입 안정성과 코드의 가독성을 높입니다.
base
: 추상 기본 클래스로, 모든 서브클래스가 상속받아야 합니다. 이를 통해 특정 타입 집합의 상속을 강제합니다.subclasses
: SealedClass
의 서브클래스를 정의하여 다양한 상태를 나타냅니다. 각 서브클래스는 특정 상태를 명시적으로 표현합니다.아래 예제는 SealedClass
를 사용하여 네트워크 요청 상태를 안전하게 관리하는 방법을 보여줍니다.
sealed class NetworkState {}
class Loading extends NetworkState {}
class Success extends NetworkState {
final String data;
Success(this.data);
}
class Error extends NetworkState {
final String message;
Error(this.message);
}
void handleState(NetworkState state) {
if (state is Loading) {
print('Loading...');
} else if (state is Success) {
print('Data: ${state.data}');
} else if (state is Error) {
print('Error: ${state.message}');
}
}
void main() {
var currentState = Loading();
handleState(currentState);
currentState = Success('Data loaded');
handleState(currentState);
currentState = Error('Failed to load data');
handleState(currentState);
}
아래는 Dart에서 Sealed Class를 사용하는 예제입니다.
// base.dart 파일
sealed class Shape {
const Shape();
}
class Circle extends Shape {
final double radius;
const Circle(this.radius);
}
class Rectangle extends Shape {
final double width;
final double height;
const Rectangle(this.width, this.height);
}
// main.dart 파일
import 'base.dart';
void printShapeArea(Shape shape) {
switch (shape) {
case Circle c:
print('Circle area: ${3.14 * c.radius * c.radius}');
break;
case Rectangle r:
print('Rectangle area: ${r.width * r.height}');
break;
}
}
void main() {
Shape shape1 = Circle(10);
Shape shape2 = Rectangle(5, 10);
printShapeArea(shape1); // Circle area: 314.0
printShapeArea(shape2); // Rectangle area: 50.0
}
SealedClass
를 사용할 때 상태 객체를 불변으로 설계하여 상태 관리의 예측 가능성을 높입니다.