Dart 튜토리얼 5편: 제어 흐름과 패턴 매칭

요약#

핵심 요지#

  • 문제 정의: 복잡한 데이터 구조를 검증하려면 조건문이 중첩되어 가독성이 떨어진다.
  • 핵심 주장: 패턴1은 값의 형태를 매칭하고 구조를 분해하는 문법이다.
  • 주요 근거: 분기2반복3, 패턴 매칭4패턴 종류를 함께 제시한다.
  • 실무 기준: 패턴if-case5, switch 표현식은 Dart 버전 3.0 이상이 필요하다.

문서가 설명하는 범위#

  • 분기: if, if-case, switch를 다룬다.
  • 반복: for, for-in, while, do-while, break6, continue7를 정리한다.
  • 패턴: pattern matchingdestructuring8 개념을 설명한다.
  • 패턴 종류: list9, map10, record11, object12, wildcard13 패턴을 소개한다.

읽는 시간: 11분 | 난이도: 초급


참고 자료#


문제 상황#

JavaScript나 Python에서 JSON14 구조를 검증하려면 조건문이 중첩되어 코드가 길어집니다.
구조 검증과 값 추출이 섞여서 가독성이 떨어집니다.

기존 방식의 한계#

// 패턴 없이 JSON 구조 검증
if (data is Map<String, Object?> &&
data.length == 1 &&
data.containsKey('user')) {
var user = data['user'];
if (user is List<Object> &&
user.length == 2 &&
user[0] is String &&
user[1] is int) {
var name = user[0] as String;
var age = user[1] as int;
print('User $name is $age years old.');
}
}

문제는 다음과 같습니다.

  • 조건이 중첩되어 코드가 길어진다.
  • 구조 검증과 값 추출이 한 곳에 섞인다.
  • 같은 형태의 검증을 반복하게 된다.

해결 방법#

Dart는 분기·반복·패턴을 함께 사용해서 구조를 명확히 표현합니다.

단계 1: 기본 분기#

Why#

NOTE

코드는 결국 “상황에 따라 다른 동작”을 해야 합니다.
이때 분기 규칙이 불명확하면, 예외 케이스가 빠지거나 흐름이 꼬이기 쉽습니다.

bool isAdult(int age) => age >= 20;
// 조건을 빠뜨리면, 특정 케이스가 처리되지 않을 수 있다.

What#

NOTE

분기는 조건에 따라 실행 경로를 나누는 방식이며, Dart의 조건은 boolean15 값이어야 합니다.

How#

TIP

Dart는 if와 else를 지원합니다.
조건은 boolean 표현식이어야 합니다.

if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}

switch 표현식

var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'PENDING':
executePending();
break;
case 'APPROVED':
executeApproved();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
break;
}

Watch out#

WARNING

switch는 각 case가 끝날 때 흐름을 명확히 종료해야 합니다.
즉, break, return, throw 같은 종료 동작이 없으면 컴파일 오류가 납니다.

결론: 기본 분기로 흐름을 명확히 나누고, switch로 여러 조건을 간결하게 처리할 수 있습니다.


단계 2: 반복 제어#

Why#

NOTE

반복은 “규칙적으로 같은 일을 계속 수행”하게 해주지만, 조건/종료가 흔들리면 무한 반복 같은 문제가 생깁니다.
그래서 반복의 종류와 종료 지점을 코드로 분명히 드러내야 합니다.

var i = 0;
// while (i < 3) { print(i); } // 위험: i가 증가하지 않아 무한 반복

What#

NOTE

반복은 동일한 동작을 여러 번 수행하는 흐름 제어이며, Dart는 for/for-in/while/do-while을 제공합니다.

How#

TIP

Dart는 for, for-in, while, do-while을 제공합니다.

// for-in 루프
for (var candidate in candidates) {
candidate.interview();
}
// for 루프
for (var i = 0; i < 5; i++) {
print(i);
}
// while 루프
while (!isDone()) {
doSomething();
}

breakcontinue

for (var i = 0; i < 10; i++) {
if (i == 5) break; // 반복 종료
if (i % 2 == 0) continue; // 다음 반복으로
print(i);
}

Watch out#

WARNING

while은 종료 조건이 맞지 않으면 무한 반복이 될 수 있습니다.
특히 조건을 갱신하는 코드가 루프 안에 있는지 먼저 확인하는 습관이 필요합니다.

결론: 반복 규칙을 문법으로 고정하고, break/continue로 흐름을 명확히 제어할 수 있습니다.


단계 3: 패턴 매칭으로 구조 검증과 추출#

Why#

NOTE

데이터 구조를 다룰 때 “키가 없거나 타입이 다른 경우”가 자주 발생합니다.
이런 경우를 매번 중첩 if로 처리하면, 코드가 길어지고 실수도 늘어납니다.

// Map 구조가 예상과 다르면, 런타임에 예외가 날 수 있다.

What#

NOTE

pattern은 값의 “형태”를 기준으로 매칭하고, 매칭되면 내부 값을 변수로 꺼내는 방식입니다.

How#

TIP

pattern은 값의 형태를 매칭하고 구조를 분해합니다.
if-caseJSON 구조를 검증하면 코드가 간결해집니다.

// 패턴 매칭으로 JSON 구조 검증
if (data case {'user': [String name, int age]}) {
print('User $name is $age years old.');
}

Watch out#

WARNING

매칭이 실패하면 변수(name, age)는 만들어지지 않습니다.
따라서 실패 케이스를 같이 두고, “구조가 다를 때 어떻게 할지”를 명확히 해야 합니다.

if (data case {'user': [String name, int age]}) {
print('User $name is $age years old.');
} else {
print('user 정보가 없거나 타입이 다릅니다.');
}

switch 표현식에서 패턴 사용

String describeNumber(num number) {
return switch (number) {
< 0 => 'negative',
0 => 'zero',
> 0 && < 10 => 'small positive',
>= 10 => 'large positive',
};
}

record 패턴

var (name, age) = ('Alice', 25);
print('$name is $age years old.');
// 함수 반환값 분해
(String, int) getUserInfo() => ('Bob', 30);
var (userName, userAge) = getUserInfo();

결론: 구조 검증과 값 추출을 한 줄로 표현하고, 패턴 불일치 시 자동으로 다음 case로 이동합니다.


Footnotes#

  1. pattern(패턴): 값의 형태를 검사하고 구조를 분해하는 문법이다.

  2. branch(분기): 조건에 따라 실행 경로를 나누는 흐름 제어다.

  3. loop(반복): 같은 동작을 여러 번 수행하는 흐름 제어다.

  4. pattern matching(패턴 매칭): 값이 패턴과 일치하는지 확인하는 과정이다.

  5. if-case(조건 패턴 분기): if에 패턴을 결합해 구조 검증과 추출을 동시에 하는 문법이다.

  6. break(중단): 반복이나 switch를 즉시 종료하는 키워드다.

  7. continue(건너뛰기): 현재 반복을 건너뛰고 다음 반복으로 이동하는 키워드다.

  8. destructuring(구조 분해): 패턴으로부터 값을 꺼내 변수에 담는 동작이다.

  9. list(리스트): 값의 목록 형태를 표현하는 패턴 종류다.

  10. map(맵): 키와 값 구조를 표현하는 패턴 종류다.

  11. record(레코드): 고정 길이 필드 묶음을 표현하는 패턴 종류다.

  12. object(객체): 객체의 속성 구조를 표현하는 패턴 종류다.

  13. wildcard(와일드카드): 어떤 값이든 매칭하는 패턴 종류다.

  14. JSON(제이슨): 키와 값으로 이루어진 텍스트 기반 데이터 형식이다.

  15. boolean(불리언): true 또는 false 값을 가지는 논리 타입이다.

공유

이 글이 도움이 되었다면 다른 사람과 공유해주세요!

Dart 튜토리얼 5편: 제어 흐름과 패턴 매칭
https://moodturnpost.net/posts/dart/dart-control-flow-patterns/
작성자
Moodturn
게시일
2026-01-04
Moodturn

목차