본문 바로가기

Flutter/Dart

Dart 3.0 핵심 정리

 

🔵 1. Records (레코드) - 여러 값 한 번에 묶는 기능 추가됨

기존에는 여러 개의 값을 반환하려면 List, Map, class 같은 거 써야 했음.
이제 Records(레코드) 기능이 추가돼서 더 간편하게 가능해짐!

(String, int) getUser() {
  return ('Alice', 25);
}

void main() {
  var user = getUser();
  print(user.$1); // Alice
  print(user.$2); // 25
}

이름 지정 가능해짐

({String name, int age}) getUser() {
  return (name: 'Alice', age: 25);
}

void main() {
  var user = getUser();
  print(user.name); // Alice
  print(user.age);  // 25
}

📌 요점
✔ 여러 값 한 번에 리턴 가능
✔ 이름 붙이면 $1, $2 안 쓰고 가독성 높아짐


🟢 2. Validation Switch (검증 가능한 스위치) 추가됨

기존 switch 문에서 조건 검증할 때 따로 if 써야 했는데,
이제 when 키워드를 추가하면 더 깔끔하게 가능해짐!

String checkType(dynamic value) {
  return switch (value) {
    int i when i > 0 => "양수",
    int i when i < 0 => "음수",
    String s => "문자열: $s",
    _ => "알 수 없는 타입",
  };
}

void main() {
  print(checkType(10));  // 양수
  print(checkType(-5));  // 음수
  print(checkType("Hello")); // 문자열: Hello
  print(checkType(0.5)); // 알 수 없는 타입
}

📌 요점
✔ when 키워드로 조건 추가 가능
✔ 패턴 매칭 활용 가능


🔴 3. sealed class - 서브클래스 강제됨 & 패턴 매칭 필수

  • abstract + final 느낌
  • switch 문에서 모든 경우를 체크해야 함
  • 같은 파일 내에서만 상속 가능
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()); // 🐱 고양이임!
}

📌 요점
✔ switch에서 모든 경우 다 체크해야 함
✔ 같은 파일 내에서만 상속 가능


🟠 4. base class - 상속 가능하지만 implements 불가능

  • extends(상속) 가능
  • implements 불가능
  • base, final, sealed 클래스만 상속 가능
base class Animal {
  void makeSound() => print("소리 냄!");
}

base class Dog extends Animal {
  void bark() => print("멍멍!");
}

class Cat implements Animal { // ❌ 오류 발생!
  void makeSound() => print("야옹!");
}

void main() {
  var dog = Dog();
  dog.makeSound(); // 소리 냄!
  dog.bark(); // 멍멍!
}

📌 요점
✔ extends는 되지만 implements 불가능
✔ base, final, sealed 클래스만 상속 가능


🟡 5. interface class - implements만 가능, extends 불가능

  • implements(구현) 가능
  • extends(상속) 불가능
interface class Animal {
  void makeSound();
}

class Dog implements Animal {
  void makeSound() => print("멍멍!");
}

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

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

  dog.makeSound(); // 멍멍!
  cat.makeSound(); // 야옹!
}

📌 요점
✔ implements만 가능
✔ extends 불가능


🟣 6. mixin class - extends, switch 사용 불가능

  • extends(상속) 불가능
  • switch 사용 불가능
  • on 키워드 사용 불가능
mixin class Animal {
  void makeSound() => print("소리 냄!");
}

// ❌ `extends` 불가능!
// class Dog extends Animal {} // 오류 발생!

// ✅ `implements`만 가능
class Dog implements Animal {
  void makeSound() => print("멍멍!");
}

void main() {
  Dog dog = Dog();
  dog.makeSound(); // 멍멍!
}

📌 요점
✔ implements만 가능
✔ extends, switch, on 불가능


정리

sealed class 같은 파일 내에서만 상속 가능, switch에서 모든 경우 체크해야 함
base class base, final, sealed 클래스만 상속 가능
interface class 오직 implements만 가능
mixin class extends, switch, on 불가능

 

반응형