패턴 및 매칭 (3.0)
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 87번째.
Dart 3는 단일 표현식에서 데이터를 구조 분해하고 조사할 수 있는 강력한 방법인 패턴 매칭을 도입했습니다. 패턴을 사용하면 객체에서 값을 추출하고, 구조를 확인하며, 변수를 바인딩하는 이 모든 작업을 한 번에 수행할 수 있습니다.
이미 레코드(records)를 사용한 기본적인 구조 분해(destructuring)를 살펴보았습니다. 패턴은 이를 확장하여 객체, 리스트, 맵에서도 작동하도록 합니다:
void main() {
// 리스트 패턴
var numbers = [1, 2, 3];
var [a, b, c] = numbers;
print('$a, $b, $c'); // 1, 2, 3
// 맵 패턴
var user = {'name': 'Alice', 'age': 30};
var {'name': name, 'age': age} = user;
print('$name is $age'); // Alice is 30
}패턴은 switch 표현식에서 특히 강력해집니다. 타입, 값, 구조를 동시에 매칭할 수 있습니다:
String describe(Object obj) {
return switch (obj) {
int n when n < 0 => 'Negative number',
int n => 'Positive number: $n',
String s => 'String of length ${s.length}',
[int first, ...] => 'List starting with $first',
_ => 'Something else',
};
}
void main() {
print(describe(-5)); // Negative number
print(describe(42)); // Positive number: 42
print(describe([1, 2, 3])); // List starting with 1
}when 절은 패턴에 조건을 추가하며, ...은 리스트의 나머지 요소들과 매치됩니다. 언더스코어 _는 무엇이든 매치하는 와일드카드 역할을 합니다. sealed 클래스와 결합하면, 패턴을 통해 복잡한 데이터 구조를 철저하고 타입 안전하게 처리할 수 있습니다.
챌린지
쉬움패턴 매칭을 사용하여 다양한 유형의 입력을 분석하고 분류하는 데이터 분류기를 만들어 봅시다! Dart 3의 강력한 패턴 매칭 기능을 사용하여 다양한 데이터 구조를 식별하고 설명하는 시스템을 만들게 됩니다.
코드를 두 개의 파일로 구성합니다:
classifier.dart:Object매개변수를 받고String설명을 반환하는classify함수를 만듭니다. 패턴 매칭이 포함된 switch 표현식을 사용하여 다음 사례들을 처리하세요:- 빈 리스트
[]는Empty list를 반환해야 합니다. - 정수 요소가 정확히 하나인 리스트는
Single item: [value]를 반환해야 합니다. - 요소가 정확히 두 개인 리스트는
Pair: [first] and [second]를 반환해야 합니다. - 정수로 시작하고 그 뒤에 더 많은 요소가 오는 리스트는
List starting with [first], length: [total length]를 반환해야 합니다 (...rest 패턴을 사용하세요). 'name'과'age'키를 모두 포함하는 맵은[name] is [age] years old를 반환해야 합니다 (맵 패턴 구조 분해를 사용하세요).- 음수인 정수(
when절 사용)는Negative: [value]를 반환해야 합니다. - 0인 정수는
Zero를 반환해야 합니다. - 그 외의 모든 정수는
Positive: [value]를 반환해야 합니다. - 그 외의 모든 값은
Unknown type을 반환해야 합니다.
- 빈 리스트
main.dart: 분류기를 임포트하고 다양한 입력으로 패턴 매칭을 시연합니다. 다음 각 값을 분류한 결과를 출력하세요:- 빈 리스트
[] - 요소가 하나인 리스트:
[42] - 요소가 두 개인 리스트:
['hello', 'world'] - 더 긴 리스트:
[1, 2, 3, 4, 5] - 맵:
{'name': 'Alice', 'age': 25} - 정수
-10 - 정수
0 - 정수
99
- 빈 리스트
이 챌린지는 리스트 패턴, 맵 패턴, 가드(guards)를 위한 when 절, 그리고 rest 패턴(...) 등 레슨에서 배운 모든 주요 패턴 매칭 기능을 결합합니다!
예상 출력:
Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99치트 시트
Dart 3는 단일 표현식에서 데이터를 구조 분해하고 검사하기 위한 패턴 매칭을 도입했습니다.
리스트 패턴
리스트에서 값을 추출합니다:
var numbers = [1, 2, 3];
var [a, b, c] = numbers;
print('$a, $b, $c'); // 1, 2, 3맵 패턴
키를 사용하여 맵을 구조 분해합니다:
var user = {'name': 'Alice', 'age': 30};
var {'name': name, 'age': age} = user;
print('$name is $age'); // Alice is 30패턴을 사용한 Switch 표현식
타입, 값 및 구조에 따라 매칭합니다:
String describe(Object obj) {
return switch (obj) {
int n when n < 0 => 'Negative number',
int n => 'Positive number: $n',
String s => 'String of length ${s.length}',
[int first, ...] => 'List starting with $first',
_ => 'Something else',
};
}패턴 기능
when절: 패턴에 조건을 추가합니다...(나머지 패턴): 리스트의 나머지 요소들과 매칭됩니다_(와일드카드): 무엇이든 매칭됩니다
직접 해보기
import 'classifier.dart';
void main() {
// TODO: classify 함수를 사용하여 각 값을 분류하고
// 결과를 출력하세요
// 빈 리스트로 테스트
print(classify([]));
// TODO: 하나의 요소를 포함하는 리스트로 테스트: [42]
// TODO: 두 개의 요소를 포함하는 리스트로 테스트: ['hello', 'world']
// TODO: 더 긴 리스트로 테스트: [1, 2, 3, 4, 5]
// TODO: 맵(map)으로 테스트: {'name': 'Alice', 'age': 25}
// TODO: 정수 -10으로 테스트
// TODO: 정수 0으로 테스트
// TODO: 정수 99로 테스트
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.