반응형
Flutter 개발을 위한 Dart 언어 기초 시리즈 세 번째 시간입니다. 프로그래밍의 핵심인 조건문과 반복문을 마스터해서 똑똑한 프로그램을 만들어봅시다!
이 글에서 배우는 것
- if문으로 조건에 따른 분기 처리
- switch문으로 다중 선택 처리
- 삼항 연산자로 간단한 조건 처리
- for, while, do-while 반복문 완전 정복
- break와 continue로 반복문 제어
- 실무에서 자주 사용하는 패턴들
if문: 조건에 따라 다른 길 선택하기
프로그래밍에서 가장 기본적이면서도 중요한 개념입니다. "만약 ~라면"의 논리를 코드로 표현합니다.
기본 if문
int age = 25;
if (age >= 18) {
print('성인입니다.');
}
if-else 문
if (age >= 60) {
print('어르신이시군요!');
} else if (age >= 18) {
print('성인이시네요!');
} else {
print('미성년자입니다.');
}
복합 조건문
bool hasLicense = true;
int age = 25;
// AND 조건 (&&)
if (age >= 18 && hasLicense) {
print('운전할 수 있습니다.');
}
// OR 조건 (||)
if (age < 18 || !hasLicense) {
print('운전할 수 없습니다.');
}
// NOT 조건 (!)
if (!(age >= 18)) {
print('미성년자입니다.');
}
조건 연산자 활용
| 연산자 | 의미 | 예시 |
|---|---|---|
== |
같음 | age == 18 |
!= |
다름 | name != '홍길동' |
> |
크다 | score > 90 |
>= |
크거나 같다 | age >= 18 |
< |
작다 | price < 1000 |
<= |
작거나 같다 | count <= 10 |
삼항 연산자: 간단한 조건을 한 줄로
int score = 85;
// 기본 형태: 조건 ? 참일때값 : 거짓일때값
String grade = score >= 90 ? 'A' : 'B';
// 중첩 사용 가능
String detailedGrade = score >= 90 ? 'A' :
score >= 80 ? 'B' :
score >= 70 ? 'C' : 'F';
print('점수 $score점 -> 등급: $detailedGrade');
null 병합 연산자
String? nickname;
String displayName = nickname ?? '익명'; // nickname이 null이면 '익명' 사용
print('표시될 이름: $displayName'); // 익명
nickname = '개발자';
displayName = nickname ?? '익명';
print('닉네임 설정 후: $displayName'); // 개발자
switch문: 여러 값 중 하나 선택하기
많은 조건을 깔끔하게 처리할 때 if-else보다 switch가 더 읽기 쉽습니다.
기본 switch문
String day = 'Monday';
switch (day) {
case 'Monday':
print('월요일: 새로운 한 주의 시작!');
break;
case 'Tuesday':
print('화요일: 힘내세요!');
break;
case 'Wednesday':
print('수요일: 벌써 반이나!');
break;
case 'Saturday':
case 'Sunday':
print('주말: 푹 쉬세요!'); // 여러 case 처리
break;
default:
print('올바른 요일이 아닙니다.');
}
Dart 3.0+ 새로운 switch 표현식
int month = 3;
// 표현식으로 직접 값 반환
String season = switch (month) {
1 || 2 || 12 => '겨울',
3 || 4 || 5 => '봄',
6 || 7 || 8 => '여름',
9 || 10 || 11 => '가을',
_ => '잘못된 월' // default와 같음
};
print('$month월은 $season입니다.');
for문: 정해진 횟수 반복하기
가장 기본적인 반복문으로, 정확히 몇 번 반복할지 알 때 사용합니다.
기본 for문
// 1부터 5까지 출력
for (int i = 1; i <= 5; i++) {
print('숫자: $i');
}
// 역순 출력
for (int i = 5; i >= 1; i--) {
print('카운트다운: $i');
}
// 2씩 증가
for (int i = 2; i <= 10; i += 2) {
print('짝수: $i');
}
for문의 구조 분석
for (초기값; 조건; 증감) {
// 실행할 코드
}
- 초기값: 반복 시작 전 한 번만 실행
- 조건: 매 반복마다 체크, false면 종료
- 증감: 매 반복 후 실행
- 본문: 조건이 true일 때 실행
while문: 조건이 참인 동안 반복
언제까지 반복할지 정확히 모를 때 사용합니다.
int count = 1;
while (count <= 3) {
print('현재 카운트: $count');
count++; // 반드시 조건을 변경해야 무한루프 방지
}
// 리스트 처리 예제
List<String> tasks = ['코딩', '운동', '독서'];
int taskIndex = 0;
while (taskIndex < tasks.length) {
print('${taskIndex + 1}. ${tasks[taskIndex]} 완료!');
taskIndex++;
}
do-while문: 최소 한 번은 실행
조건을 나중에 검사하므로 최소 한 번은 반드시 실행됩니다.
int attempts = 0;
do {
attempts++;
print('시도 횟수: $attempts');
} while (attempts < 3);
// 사용자 입력 검증에 유용
String userInput;
do {
// userInput = getUserInput(); // 사용자로부터 입력 받기
userInput = 'valid'; // 예시
print('입력값 검증 중...');
} while (userInput != 'valid');
반복문 제어: break와 continue
break: 반복문 완전히 종료
for (int i = 1; i <= 10; i++) {
if (i == 5) {
print('5에 도달! 반복 중단');
break; // 반복문 즉시 종료
}
print('숫자: $i');
}
// 출력: 1, 2, 3, 4, "5에 도달! 반복 중단"
continue: 현재 반복만 건너뛰기
for (int i = 1; i <= 5; i++) {
if (i == 3) {
print('3은 건너뛰어요!');
continue; // 이번 반복만 건너뛰고 다음으로
}
print('숫자: $i');
}
// 출력: 1, 2, "3은 건너뛰어요!", 4, 5
중첩 반복문: 구구단 예제
// 2단부터 4단까지
for (int dan = 2; dan <= 4; dan++) {
print('=== ${dan}단 ===');
for (int num = 1; num <= 5; num++) {
print('$dan × $num = ${dan * num}');
}
print(''); // 단 사이 공백
}
패턴 출력 예제
// 별표 삼각형 만들기
for (int i = 1; i <= 5; i++) {
String stars = '';
for (int j = 1; j <= i; j++) {
stars += '★';
}
print(stars);
}
// 출력:
// ★
// ★★
// ★★★
// ★★★★
// ★★★★★
실전 활용 예제들
1. 성적 처리 시스템
List<int> scores = [95, 87, 76, 92, 68];
for (int i = 0; i < scores.length; i++) {
int score = scores[i];
String grade;
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else if (score >= 70) {
grade = 'C';
} else {
grade = 'F';
}
print('학생 ${i + 1}: $score점 -> $grade등급');
}
2. 패스워드 유효성 검사
bool validatePassword(String password) {
if (password.length < 8) {
print('❌ 패스워드는 8자 이상이어야 합니다.');
return false;
}
if (!password.contains(RegExp(r'[0-9]'))) {
print('❌ 숫자가 포함되어야 합니다.');
return false;
}
if (!password.contains(RegExp(r'[!@#$%^&*]'))) {
print('❌ 특수문자가 포함되어야 합니다.');
return false;
}
print('✅ 유효한 패스워드입니다.');
return true;
}
// 사용 예
List<String> passwords = ['123', 'abc123', 'mypassword123!'];
for (String password in passwords) {
print('\n패스워드 "$password" 검증:');
validatePassword(password);
}
3. 간단한 게임 메뉴 시스템
void showMenu() {
print('=== 게임 메뉴 ===');
print('1. 게임 시작');
print('2. 설정');
print('3. 도움말');
print('q. 종료');
}
void processMenu(String choice) {
switch (choice.toLowerCase()) {
case '1':
print('🎮 게임을 시작합니다!');
break;
case '2':
print('⚙️ 설정 메뉴입니다.');
break;
case '3':
print('❓ 도움말을 표시합니다.');
break;
case 'q':
print('👋 게임을 종료합니다. 안녕히 가세요!');
break;
default:
print('❌ 잘못된 선택입니다.');
}
}
4. 피보나치 수열 생성
void printFibonacci(int count) {
int a = 0, b = 1;
print('피보나치 수열 (첫 $count개):');
for (int i = 0; i < count; i++) {
if (i == 0) {
print('$i: $a');
} else if (i == 1) {
print('$i: $b');
} else {
int next = a + b;
print('$i: $next');
a = b;
b = next;
}
}
}
printFibonacci(10);
// 출력: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
성능과 베스트 프랙티스
1. 조건문 최적화
// ✅ Good: 자주 발생하는 조건을 먼저
if (user.isActive && user.isPremium && user.hasValidSubscription) {
// 프리미엄 기능
}
// ✅ Good: 간단한 조건은 삼항 연산자
String status = user.isOnline ? '온라인' : '오프라인';
// ❌ Bad: 불필요한 중첩
if (score >= 90) {
if (attendance >= 80) {
grade = 'A';
}
}
// ✅ Good: 조건 합치기
if (score >= 90 && attendance >= 80) {
grade = 'A';
}
2. 반복문 최적화
List<String> items = ['a', 'b', 'c', 'd', 'e'];
// ✅ Good: 길이를 변수에 저장
int length = items.length;
for (int i = 0; i < length; i++) {
print(items[i]);
}
// ❌ Bad: 매번 length 계산
for (int i = 0; i < items.length; i++) {
print(items[i]);
}
// ✅ Best: for-in 사용 (가장 효율적)
for (String item in items) {
print(item);
}
3. 무한루프 방지
// ✅ Good: 안전한 while문
int maxAttempts = 100;
int attempts = 0;
while (condition && attempts < maxAttempts) {
// 작업 수행
attempts++;
// 조건 변경 로직 반드시 포함
if (someCondition) {
break;
}
}
// ❌ Bad: 무한루프 위험
while (true) {
// 종료 조건이 불명확
}
조건문 vs 반복문 선택 가이드
| 상황 | 추천 | 이유 |
|---|---|---|
| 간단한 참/거짓 판단 | if문 | 가독성 좋음 |
| 여러 값 중 선택 | switch문 | 명확한 구조 |
| 정확한 반복 횟수 | for문 | 카운터 관리 편함 |
| 조건 기반 반복 | while문 | 유연한 종료 조건 |
| 최소 1회 실행 필요 | do-while문 | 검증 후 반복 |
정리
조건문과 반복문은 프로그래밍의 핵심입니다.
- 조건문: 상황에 따라 다른 동작 (
if,switch,?:) - 반복문: 같은 작업을 여러 번 (
for,while,do-while) - 제어문: 반복의 흐름 조절 (
break,continue)
이제 프로그램이 똑똑하게 판단하고 효율적으로 반복 작업을 수행할 수 있습니다!
반응형
'flutter' 카테고리의 다른 글
| Flutter는 어떻게 작동할까? 아키텍처와 네이티브 개발 완전 분석 (0) | 2025.09.22 |
|---|---|
| Flutter 시작하기: 크로스 플랫폼 앱 개발의 첫걸음 (0) | 2025.09.22 |
| Dart 기초 마스터하기 #4 List와 Map으로 데이터 다루기 (0) | 2025.09.21 |
| Dart 기초 마스터하기 #2 함수와 클래스로 코드 구조화하기 (0) | 2025.09.21 |
| Dart 기초 마스터하기 #1 변수와 데이터 타입 완전 정복 (0) | 2025.09.21 |