Dart 튜토리얼 5편: 제어 흐름과 패턴 매칭
요약
핵심 요지
문서가 설명하는 범위
분기: if,if-case, switch를 다룬다.반복: for, for-in, while, do-while,break6,continue7를 정리한다.패턴:pattern matching과destructuring8 개념을 설명한다.패턴종류:list9,map10,record11,object12,wildcard13패턴을 소개한다.
읽는 시간: 11분 | 난이도: 초급
참고 자료
- Branches - if/switch 분기
- Loops - for/while 반복
- Patterns - 패턴 매칭 개요
- Pattern types - 패턴 종류
문제 상황
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
TIPDart는 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
TIPDart는 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();}
break와continuefor (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-case로JSON구조를 검증하면 코드가 간결해집니다.// 패턴 매칭으로 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
-
pattern(패턴): 값의 형태를 검사하고 구조를 분해하는 문법이다. ↩
-
branch(분기): 조건에 따라 실행 경로를 나누는 흐름 제어다. ↩
-
loop(반복): 같은 동작을 여러 번 수행하는 흐름 제어다. ↩
-
pattern matching(패턴 매칭): 값이 패턴과 일치하는지 확인하는 과정이다. ↩
-
if-case(조건 패턴 분기): if에 패턴을 결합해 구조 검증과 추출을 동시에 하는 문법이다. ↩
-
break(중단): 반복이나 switch를 즉시 종료하는 키워드다. ↩
-
continue(건너뛰기): 현재 반복을 건너뛰고 다음 반복으로 이동하는 키워드다. ↩
-
destructuring(구조 분해): 패턴으로부터 값을 꺼내 변수에 담는 동작이다. ↩
-
list(리스트): 값의 목록 형태를 표현하는 패턴 종류다. ↩
-
map(맵): 키와 값 구조를 표현하는 패턴 종류다. ↩
-
record(레코드): 고정 길이 필드 묶음을 표현하는 패턴 종류다. ↩
-
object(객체): 객체의 속성 구조를 표현하는 패턴 종류다. ↩
-
wildcard(와일드카드): 어떤 값이든 매칭하는 패턴 종류다. ↩
-
JSON(제이슨): 키와 값으로 이루어진 텍스트 기반 데이터 형식이다. ↩
-
boolean(불리언): true 또는 false 값을 가지는 논리 타입이다. ↩
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!