패턴 및 매칭 (3.0)
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 87번째.
Dart 3에서는 패턴 매칭이 도입되었습니다. 이는 단일 expression에서 data를 구조 분해하고 검사할 수 있는 강력한 방법입니다. 패턴을 사용하면 객체에서 값을 추출하고, 객체의 구조를 확인하며, 변수를 한 번에 바인딩할 수 있습니다.
이미 레코드를 사용한 기본 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)); // 음수
print(describe(42)); // 양수: 42
print(describe([1, 2, 3])); // List starting with 1
}when clause는 패턴에 조건을 추가하고, ...는 list에서 남은 elements와 일치합니다. 밑줄 _은 무엇이든 일치하는 와일드카드로 작동합니다. 봉인된 클래스와 결합하면 패턴을 통해 복잡한 데이터 구조를 빠짐없이 타입 안전하게 처리할 수 있습니다.
챌린지
쉬움패턴 매칭을 사용하여 다양한 유형의 입력을 분석하고 categorize하는 data classifier를 만들어 봅시다! Dart 3의 강력한 패턴 매칭 기능을 사용하여 다양한 data 구조를 식별하고 describe할 수 있는 시스템을 만들게 됩니다.
코드를 두 개의 파일로 구성합니다.
classifier.dart:Object매개변수를 받고String설명을 반환하는classifyfunction을 만듭니다. 패턴 매칭을 사용하는 switch expression으로 다음 case를 처리합니다.- empty list
[]는Empty list를 반환해야 합니다. - 정확히 하나의 integer element가 있는 list는
Single item: [value]를 반환해야 합니다. - 정확히 두 개의 elements가 있는 list는
Pair: [first] and [second]를 반환해야 합니다. - integer로 시작하고 그 뒤에 더 많은 elements가 이어지는 list는
List starting with [first], length: [total length]를 반환해야 합니다. (...rest pattern을 사용합니다.) 'name'과'age'keys를 모두 containing하는 map은[name] is [age] years old를 반환해야 합니다. (map pattern destructuring을 사용합니다.)- 음수인 integer는 (
whenclause 사용)Negative: [value]를 반환해야 합니다. - 0인 integer는
Zero를 반환해야 합니다. - 그 밖의 integer는
Positive: [value]를 반환해야 합니다. - 그 밖의 값은
Unknown type을 반환해야 합니다.
- empty list
main.dart: classifier를 import하고 다양한 input으로 패턴 매칭을 시연합니다. 다음 각 값의 classify 결과를 출력합니다.- empty list
[] - element가 하나인 list:
[42] - elements가 두 개인 list:
['hello', 'world'] - 더 긴 list:
[1, 2, 3, 4, 5] - map:
{'name': 'Alice', 'age': 25} - integer
-10 - integer
0 - integer
99
- empty list
이 challenge는 list patterns, map patterns, guard를 위한 when clause, 그리고 rest pattern(...)을 결합합니다. 이는 lesson에서 다룬 모든 핵심 패턴 매칭 기능입니다!
예상 출력:
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직접 해보기
import 'classifier.dart';
void main() {
// TODO: classify 함수를 사용하여 각 값을 분류하세요
// 그리고 결과를 출력하세요
// 빈 리스트로 테스트
print(classify([]));
// TODO: 요소가 하나인 리스트로 테스트: [42]
// TODO: 요소가 두 개인 리스트로 테스트: ['hello', 'world']
// TODO: 더 긴 리스트로 테스트: [1, 2, 3, 4, 5]
// TODO: 맵으로 테스트: {'name': 'Alice', 'age': 25}
// TODO: 정수 -10으로 테스트
// TODO: 정수 0으로 테스트
// TODO: 정수 99로 테스트
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Dart 컴파일러