외부 라이브러리의 클래스 상속, 구현, 인스턴스 생성 권한을 통제하고 타입 본문을 제약합니다
수식자 작성 순서 [abstract] [base/interface/final/sealed] [mixin] class;일부 수식자는 서로 배타적입니다
1. 수식자 없음
어느 라이브러리에서든 인스턴스 생성, 상속, 구현 가능
// a.dart
class Vehicle {
void move() {}
}
// b.dart
import 'a.dart';
Vehicle v = Vehicle();
class Car extends Vehicle {}
class Mock implements Vehicle {}
Code language: JavaScript (javascript)
2. abstract 추상 클래스
인스턴스 생성 불가;외부에서 extends /implements 사용 가능
abstract class Vehicle {
void move(); // 추상 메서드
}
// 정상 동작
class Car extends Vehicle {
@override void move() {}
}
class Mock implements Vehicle {
@override void move() {}
}
// Vehicle(); // 오류, 인스턴스를 만들 수 없음
Code language: JavaScript (javascript)
3. base class
√ new 허용|√ 외부 extends 가능|× 외부 implements 불가
하위 클래스가 반드시 상위 클래스 구현을 상속하도록 보장하며 외부에서 가짜 구현이 생성되는 것을 막음
// lib/a.dart
base class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
base class Car extends Vehicle {} // √ 상속 시 base/final/sealed 지정 필수
// class Mock implements Vehicle {} // × 외부 구현 금지
Code language: JavaScript (javascript)
4. interface class
√ new 허용|× 외부 extends 불가|√ 외부 implements 가능
// a.dart
interface class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // × 외부 상속 금지
class Mock implements Vehicle { // √ 구현 허용
@override void move() {}
}
Code language: PHP (php)
abstract interface
순수 인터페이스로 가장 자주 사용됨
인스턴스 생성 불가, 외부에서는 implements만 허용
abstract interface class Vehicle {
void move();
}
class Mock implements Vehicle {
@override void move() {}
}
Code language: PHP (php)
5. final class
√ new 허용|× 외부 extends 불가|× 외부 implements 불가
외부에서 파생 클래스를 만들 수 없어 공개 API를 안정적으로 유지
// a.dart
final class Vehicle {}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // ❌
// class Mock implements Vehicle{} // ❌
Code language: JavaScript (javascript)
6. sealed class (봉인 클래스)
× new 불가|× 외부 extends/implements 불가;하위 클래스는 동일 파일 내에 작성해야 함
컴파일러가 모든 직접 하위 클래스를 인지하며 switch 문에서 완전 매칭을 강제
sealed class Vehicle {}
class Car extends Vehicle {}
class Bike extends Vehicle {}
void test(Vehicle v) {
switch(v) {
case Car(): print("car");
case Bike(): print("bike");
}
}
// Vehicle(); // ❌ sealed은 암시적으로 abstract이므로 인스턴스 생성 불가
Code language: PHP (php)
배타 규칙
sealed+abstract:sealed에 abstract 속성이 내장되므로 중복 선언 금지interface/final/sealed+mixin:함께 사용할 수 없음- 동일 계층에 base /interface/final /sealed 를 동시 선언 불가
Class Modifiers 클래스 수식자
Previous: Extension Types
Next: dart:math 라이브러리