본문 바로가기

flutter

Dart 기초 마스터하기 #3 조건문과 반복문으로 프로그램 제어하기

반응형

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 (초기값; 조건; 증감) {
  // 실행할 코드
}

 

  1. 초기값: 반복 시작 전 한 번만 실행
  2. 조건: 매 반복마다 체크, false면 종료
  3. 증감: 매 반복 후 실행
  4. 본문: 조건이 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)

이제 프로그램이 똑똑하게 판단하고 효율적으로 반복 작업을 수행할 수 있습니다!

반응형