728x90
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
'Flutter for Beginners' 카테고리의 다른 글
플러터(Flutter) 소개 (0) | 2025.03.05 |
---|---|
Dart 3.0의 새로운 클래스 제한자 (Class Modifiers) (0) | 2025.03.04 |
Dart 3.0의 레코드 (Records) (0) | 2025.03.04 |
Dart Completer (커스텀 비동기 처리) (0) | 2025.03.04 |
Dart의 Stream (비동기 데이터 스트림) (0) | 2025.03.04 |