Class Modifiers 클래스 수식자

외부 라이브러리의 클래스 상속, 구현, 인스턴스 생성 권한을 통제하고 타입 본문을 제약합니다

수식자 작성 순서 [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)

배타 규칙

  1. sealed + abstract:sealed에 abstract 속성이 내장되므로 중복 선언 금지
  2. interface/final/sealed + mixin:함께 사용할 수 없음
  3. 동일 계층에 base /interface/final /sealed 를 동시 선언 불가

Class Modifiers 클래스 수식자

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다