728x90
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 |