본문 바로가기
Flutter for Beginners

Dart 3.0의 새로운 클래스 제한자 (Class Modifiers)

by Andrew's Akashic Records 2025. 3. 4.
728x90

Dart

Dart 3.0의 새로운 클래스 제한자 (Class Modifiers)

Dart 3.0에서는 클래스의 상속 및 구현을 제한하는 새로운 키워드(제한자) 가 도입되었습니다.
이를 통해 코드의 안정성을 높이고, 명확한 의도를 표현할 수 있습니다.

1. Dart 3.0의 클래스 제한자 종류

키워드 설명 예제
sealed 동일한 파일 내에서만 상속 가능 sealed class Animal {}
interface 인터페이스로만 사용 가능 interface class Animal {}
final 상속 불가 (변경 불가능한 클래스) final class Animal {}
base 상속 가능하지만, 하위 클래스도 base, final, sealed이어야 함 base class Animal {}

2. sealed (봉인 클래스, 제한된 상속)

  • sealed 클래스를 같은 파일 내에서만 상속 가능
  • 외부 파일에서 sealed 클래스를 직접 상속할 수 없음
  • switch 문과 함께 사용하면 모든 하위 클래스를 강제적으로 검사할 수 있음

🔹 sealed 클래스 사용 예제

sealed class Animal {}

class Dog extends Animal {} // 같은 파일 내에서 상속 가능
class Cat extends Animal {} // 같은 파일 내에서 상속 가능

void checkAnimal(Animal animal) {
  switch (animal) {
    case Dog():
      print("강아지입니다.");
    case Cat():
      print("고양이입니다.");
  }
}

void main() {
  checkAnimal(Dog()); // 강아지입니다.
  checkAnimal(Cat()); // 고양이입니다.
}
  • sealed 클래스를 상속받은 모든 서브클래스를 switch 문에서 반드시 검사해야 함.
  • 파일을 벗어나면 상속할 수 없음 (즉, sealed 클래스는 확장 가능하지만, 한정적인 환경에서만 가능).

3. interface (인터페이스 전용 클래스)

  • interface 클래스는 인스턴스화할 수 없고, 오직 implements로만 사용할 수 있음.
  • 모든 메서드는 반드시 구현해야 함.

🔹 interface 클래스 사용 예제

interface class Animal {
  void makeSound(); // 반드시 구현해야 함
}

class Dog implements Animal {
  @override
  void makeSound() {
    print("멍멍!");
  }
}

class Cat implements Animal {
  @override
  void makeSound() {
    print("야옹!");
  }
}

void main() {
  Animal dog = Dog();
  Animal cat = Cat();

  dog.makeSound(); // 멍멍!
  cat.makeSound(); // 야옹!
}
  • interface class는 implements만 가능 (extends는 불가능).
  • 모든 메서드를 구현해야 함.
  • 일반 abstract class와 비슷하지만, 상속 불가능.

4. final (상속 불가 클래스)

  • final 클래스는 완전히 상속이 차단된 클래스.
  • 어떠한 서브클래스도 만들 수 없음.

🔹 final 클래스 사용 예제

final class Animal {
  void makeSound() {
    print("동물이 소리를 냅니다.");
  }
}

// 오류 발생: final 클래스는 상속할 수 없음
// class Dog extends Animal {} 

void main() {
  Animal animal = Animal();
  animal.makeSound(); // 동물이 소리를 냅니다.
}
  • final 키워드가 붙으면 절대 상속할 수 없음.
  • 상속을 허용하고 싶지 않을 때 유용함.

5. base (제한된 상속)

  • base 클래스는 상속할 수 있지만, 하위 클래스도 base, final, sealed이어야 함.
  • 기존 extends보다 더 엄격한 상속 규칙을 적용할 수 있음.

🔹 base 클래스 사용 예제

base class Animal {
  void makeSound() {
    print("동물이 소리를 냅니다.");
  }
}

// base 클래스를 상속할 수 있지만, 새로운 클래스도 `base`, `final`, `sealed`이어야 함
final class Dog extends Animal {}

void main() {
  Dog dog = Dog();
  dog.makeSound(); // 동물이 소리를 냅니다.
}
  • base 클래스는 하위 클래스가 반드시 base, final, sealed 중 하나로 선언되어야 함.
  • 강제적인 일관된 계층 구조를 만들고 싶을 때 사용.

6. Dart 3.0 클래스 제한자 비교표

키워드 상속 가능 여부 구현 (implements) 가능 여부 인스턴스 생성 가능 여부 주요 특징

키워드 상속가능여부 구현가능여부 인스턴스 상생 가능여부 주요 특징
sealed 같은 파일 내에서만 X X switch에서 모든 서브클래스 강제 검사
interface X 모든 메서드 구현 필수 X implements 전용
final X X O 상속 불가능한 클래스
base 하위 클래스도 base, final, sealed이어야 함 X O 제한된 상속 허용

요약

기능 설명 예제
sealed (봉인 클래스) 같은 파일 내에서만 상속 가능 sealed class Animal {}
interface (인터페이스 전용) implements로만 사용 가능 interface class Animal {}
final (완전 상속 불가) 다른 클래스가 상속할 수 없음 final class Animal {}
base (제한된 상속) base, final, sealed 클래스만 상속 가능 base class Animal {}
  • sealed → 특정 파일 내에서만 상속 가능 (switch와 함께 사용하면 강력함).
  • interface → implements로만 사용 가능 (추상 클래스보다 더 엄격한 인터페이스 역할).
  • final완전한 상속 차단 (객체 생성만 가능).
  • base → 제한된 상속을 허용하되, 일관된 계층 구조를 유지할 수 있도록 강제.

 

728x90

'Flutter for Beginners' 카테고리의 다른 글

Flutter vs. React Native  (0) 2025.03.06
플러터(Flutter) 소개  (0) 2025.03.05
Dart 3.0의 향상된 switch 문  (0) 2025.03.04
Dart 3.0의 레코드 (Records)  (0) 2025.03.04
Dart Completer (커스텀 비동기 처리)  (0) 2025.03.04