Menu
Coddy logo textTech

패턴 및 매칭 (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 클래스와 결합하면, 패턴을 통해 복잡한 데이터 구조를 철저하고 타입 안전하게 처리할 수 있습니다.

challenge icon

챌린지

쉬움

패턴 매칭을 사용하여 다양한 유형의 입력을 분석하고 분류하는 데이터 분류기를 만들어 봅시다! 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로 테스트
}
quiz icon실력 점검

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

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