본문 바로가기
Flutter for Beginners

Dart 3.0의 향상된 switch 문

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

Dart

Dart 3.0의 향상된 switch 문

Dart 3.0에서는 switch 문이 크게 향상되어 패턴 매칭(Pattern Matching), 표현식(switch expression), 가드 절(Guard Clause) 등을 지원합니다.
이제 switch 문을 더욱 간결하고 강력하게 사용할 수 있습니다.

1. switch 표현식 (switch expression)

Dart 3.0에서는 switch 문을 표현식(expression)으로 사용하여 값을 반환할 수 있음.

1.1. 기존 switch 문 (Dart 2.x)

String getColorMeaning(String color) {
  switch (color) {
    case 'red':
      return '정지';
    case 'yellow':
      return '주의';
    case 'green':
      return '진행';
    default:
      return '알 수 없음';
  }
}
getColorMeaning('red'); // '정지'

1.2. Dart 3.0의 switch 표현식

String getColorMeaning(String color) => switch (color) {
  'red' => '정지',
  'yellow' => '주의',
  'green' => '진행',
  _ => '알 수 없음',
};

void main() {
  print(getColorMeaning('red'));    // 정지
  print(getColorMeaning('yellow')); // 주의
  print(getColorMeaning('blue'));   // 알 수 없음
}
정지
주의
알 수 없음
  • switch 문이 한 줄로 간결해짐
  • =>를 사용하여 값을 반환
  • _ (와일드카드)를 사용하여 default 대체 가능

2. 패턴 매칭 (Pattern Matching)

Dart 3.0에서는 switch 문에서 패턴 매칭을 지원하여 더 정교한 조건 검사 가능.

2.1. 타입 기반 패턴 매칭

String checkType(Object value) => switch (value) {
  int => '정수입니다.',
  double => '실수입니다.',
  String => '문자열입니다.',
  _ => '알 수 없는 타입',
};

void main() {
  print(checkType(10));       // 정수입니다.
  print(checkType(3.14));     // 실수입니다.
  print(checkType("Hello"));  // 문자열입니다.
  print(checkType(true));     // 알 수 없는 타입
}
  • int, double, String 등의 타입을 직접 검사 가능
  • 기존 if (value is int) {...} 패턴보다 더 간결하고 직관적

2.2. 패턴 매칭을 활용한 객체 검사

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);
}

String describePerson(Person person) => switch (person) {
  Person(name: 'Alice', age: 20) => 'Alice는 20살입니다.',
  Person(name: 'Bob', age: _) => 'Bob의 나이는 중요하지 않습니다.',
  _ => '이름을 모르는 사람입니다.',
};

void main() {
  print(describePerson(Person('Alice', 20)));  // Alice는 20살입니다.
  print(describePerson(Person('Bob', 30)));    // Bob의 나이는 중요하지 않습니다.
  print(describePerson(Person('Charlie', 25))); // 이름을 모르는 사람입니다.
}
  • 객체 필드 매칭 가능 (Person(name: 'Alice', age: 20))
  • _를 사용하여 특정 필드는 무시 가능 (age: _)

3. 가드 절 (Guard Clause)

Dart 3.0에서는 switch 문에서 추가적인 조건을 검사할 수 있도록 when 키워드 지원.

3.1. when을 사용한 추가 조건 검사

String categorizeNumber(int number) => switch (number) {
  > 0 => '양수',
  < 0 => '음수',
  0 => '영',
  _ => '숫자가 아님',
};

void main() {
  print(categorizeNumber(10));  // 양수
  print(categorizeNumber(-5));  // 음수
  print(categorizeNumber(0));   // 영
}
  • > 또는 < 조건을 사용하여 숫자의 범위 검사 가능
  • if 문보다 더 직관적이고 간결함

3.2. when을 활용한 가드 패턴

String checkAge(int age) => switch (age) {
  >= 18 when age < 65 => '성인',
  >= 65 => '노인',
  _ => '미성년자',
};

void main() {
  print(checkAge(10));  // 미성년자
  print(checkAge(25));  // 성인
  print(checkAge(70));  // 노인
}
  • when을 사용하여 추가적인 논리 검사 가능
  • 여러 개의 패턴을 조합하여 더 정교한 분기 처리 가능

4. switch 문에서 레코드(Records) 활용

Dart 3.0에서는 레코드(Records)와 switch 문을 함께 사용 가능.

4.1. 레코드를 이용한 패턴 매칭

(String, int) describeUser(String name, int age) => (name, age);

String getUserCategory((String, int) user) => switch (user) {
  ('Alice', > 18) => 'Alice는 성인입니다.',
  ('Bob', _) => 'Bob은 나이에 상관없이 특별합니다.',
  _ => '일반 사용자',
};

void main() {
  print(getUserCategory(describeUser('Alice', 25)));  // Alice는 성인입니다.
  print(getUserCategory(describeUser('Bob', 17)));    // Bob은 나이에 상관없이 특별합니다.
  print(getUserCategory(describeUser('Charlie', 30))); // 일반 사용자
}
  • 레코드(Records)를 활용한 값 패턴 매칭 가능
  • _를 사용하여 특정 값 무시 가능

5. switch 표현식과 리스트 활용

Dart 3.0에서는 리스트(List)에서도 switch 문을 활용할 수 있음.

5.1. 리스트를 switch 문으로 매칭

String processList(List<int> numbers) => switch (numbers) {
  [1, 2, 3] => '1, 2, 3이 포함된 리스트',
  [4, 5, _] => '4와 5가 포함된 리스트',
  _ => '알 수 없는 리스트',
};

void main() {
  print(processList([1, 2, 3]));  // 1, 2, 3이 포함된 리스트
  print(processList([4, 5, 6]));  // 4와 5가 포함된 리스트
  print(processList([10, 20]));   // 알 수 없는 리스트
}
  • 리스트 패턴을 활용하여 특정 요소가 포함된 경우를 검사 가능
  • _를 사용하여 특정 요소만 검사 가능

switch 문 요약

기능 설명 예제
switch 표현식 switch 문을 값 반환 용도로 사용 switch (value) { case 1 => 'one'; }
패턴 매칭 특정 타입, 값, 객체를 검사 switch (value) { case int => '정수'; }
가드 절 (when) 추가 조건 검사 switch (value) { case >= 18 when value < 65 => '성인'; }
레코드와 switch 레코드와 함께 사용 가능 switch ((name, age)) { case ('Alice', > 18) => '성인'; }
리스트 패턴 매칭 리스트의 특정 요소 검사 switch (list) { case [1, 2, 3] => '일치'; }

 

728x90