Sealed Class

하요·2024년 7월 8일
0
post-thumbnail

Dart에서 안전하게 데이터 클래스를 관리하기: Sealed Class

Dart에서는 SealedClass를 사용하여 여러 타입의 서브클래스를 가질 수 있는 안전한 데이터 클래스를 정의할 수 있습니다. 이는 특히 불변 데이터 모델링과 명시적 타입 검사를 위한 강력한 도구입니다. SealedClass는 Dart의 Null Safety와 결합하여 타입 안정성과 코드의 가독성을 높입니다.

주요 속성

  • base: 추상 기본 클래스로, 모든 서브클래스가 상속받아야 합니다. 이를 통해 특정 타입 집합의 상속을 강제합니다.
  • subclasses: SealedClass의 서브클래스를 정의하여 다양한 상태를 나타냅니다. 각 서브클래스는 특정 상태를 명시적으로 표현합니다.

주요 특징

  1. 제한된 하위 클래스: Sealed Class는 특정 파일 내에서만 하위 클래스를 가질 수 있습니다. 이를 통해 타입 계층의 예측 가능성을 높이고, 코드의 안전성을 강화할 수 있습니다.
  2. 패턴 매칭: Sealed Class를 사용하면 각 하위 클래스에 대해 명확하게 매칭할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

주요 활용도

  • 데이터 모델링: 여러 타입의 상태를 안전하게 표현할 수 있으며, 예측 가능한 상태 전이를 모델링합니다.
  • 코드 가독성 향상: 명시적인 상태 정의를 통해 코드 가독성과 유지 보수성을 높입니다.
  • 타입 안전성 확보: 컴파일 시 타입 검사를 통해 런타임 오류를 줄입니다.

코드 예제

아래 예제는 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
}

장점

  1. 안전한 타입 계층 관리: Sealed Class는 타입 계층을 명확하게 제한하므로, 코드의 의도하지 않은 확장을 방지할 수 있습니다.
  2. 패턴 매칭의 용이성: Sealed Class를 사용하면 switch 문이나 if-else 문을 통해 각 하위 클래스를 쉽게 매칭할 수 있습니다.
  3. 가독성과 유지보수성 향상: 코드의 구조가 명확해지므로 가독성과 유지보수성이 향상됩니다.

제한사항

  1. 확장이 제한적: Sealed Class는 특정 파일 내에서만 하위 클래스를 가질 수 있으므로, 확장이 제한됩니다.
  2. 추상 클래스와의 차이: 추상 클래스와 다르게, Sealed Class는 하위 클래스를 제한적으로 정의하므로 더 엄격한 타입 계층 관리가 필요합니다.

추가 팁

  • 불변성 유지: SealedClass를 사용할 때 상태 객체를 불변으로 설계하여 상태 관리의 예측 가능성을 높입니다.
  • 명시적 상태 전이: 상태 전이를 명시적으로 정의하여 상태 관리의 복잡성을 줄입니다.
profile
flutter 개발자(진)

0개의 댓글