Menu
Coddy logo textTech

패턴 및 매칭 (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와 일치합니다. 밑줄 _은 무엇이든 일치하는 와일드카드로 작동합니다. 봉인된 클래스와 결합하면 패턴을 통해 복잡한 데이터 구조를 빠짐없이 타입 안전하게 처리할 수 있습니다.

challenge icon

챌린지

쉬움

패턴 매칭을 사용하여 다양한 유형의 입력을 분석하고 categorize하는 data classifier를 만들어 봅시다! Dart 3의 강력한 패턴 매칭 기능을 사용하여 다양한 data 구조를 식별하고 describe할 수 있는 시스템을 만들게 됩니다.

코드를 두 개의 파일로 구성합니다.

  • classifier.dart: Object 매개변수를 받고 String 설명을 반환하는 classify function을 만듭니다. 패턴 매칭을 사용하는 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는 (when clause 사용) Negative: [value]를 반환해야 합니다.
    • 0인 integer는 Zero를 반환해야 합니다.
    • 그 밖의 integer는 Positive: [value]를 반환해야 합니다.
    • 그 밖의 값은 Unknown type을 반환해야 합니다.
  • 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

이 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로 테스트
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러