Skip to main content
Summary

흐름 제어란 무엇인가

지금까지의 코드는 위에서 아래로 한 줄씩 실행되었습니다. 하지만 실제 프로그램은 항상 같은 일만 하지 않습니다. 사용자의 나이에 따라 다른 메시지를 보여 주고, 입력이 올바를 때까지 다시 물어보며, 정해진 횟수만큼 계산을 반복합니다.

이처럼 프로그램의 실행 순서를 바꾸는 문법을 흐름 제어라고 합니다. C#에서 흐름 제어의 핵심은 두 가지입니다.

  • 조건문: 조건이 참일 때만 특정 코드를 실행한다.

  • 반복문: 같은 코드를 여러 번 실행한다.

조건문과 반복문을 사용할 수 있어야 단순히 값을 계산하는 프로그램을 넘어, 상황에 따라 반응하는 프로그램을 만들 수 있습니다.

조건문과 반복문으로 흐름 제어하기AI 생성 이미지

if, else if, else로 조건 나누기

if 문은 조건이 true일 때만 중괄호 안의 코드를 실행합니다. 조건에는 보통 비교 연산자와 논리 연산자를 사용합니다.

int age = 20;
bool hasTicket = true;

if (age >= 18 && hasTicket)
{
    Console.WriteLine("입장할 수 있습니다.");
}

실행 결과:

입장할 수 있습니다.

조건이 거짓일 때 실행할 코드는 else에 작성합니다.

int age = 15;

if (age >= 18)
{
    Console.WriteLine("성인입니다.");
}
else
{
    Console.WriteLine("미성년자입니다.");
}

실행 결과:

미성년자입니다.

조건이 여러 갈래라면 else if를 사용합니다. 예를 들어 점수에 따라 등급을 나누는 코드는 다음처럼 작성할 수 있습니다.

Console.Write("점수 입력: ");
string? input = Console.ReadLine();

if (int.TryParse(input, out int score))
{
    if (score >= 90)
    {
        Console.WriteLine("A 등급");
    }
    else if (score >= 80)
    {
        Console.WriteLine("B 등급");
    }
    else if (score >= 70)
    {
        Console.WriteLine("C 등급");
    }
    else
    {
        Console.WriteLine("다시 공부해 봅시다.");
    }
}
else
{
    Console.WriteLine("숫자를 입력해야 합니다.");
}

입력과 실행 결과 예:

점수 입력: 85
B 등급

여기서 중요한 점은 조건의 순서입니다. score >= 90을 먼저 검사해야 A 등급을 올바르게 판단할 수 있습니다. 만약 score >= 70을 먼저 쓰면 95점도 그 조건에 걸려 C 등급처럼 처리될 수 있습니다. else if는 위에서부터 차례대로 검사하고, 한 조건이 참이면 나머지 조건은 더 이상 검사하지 않습니다.

switch 문으로 여러 경우 처리하기

if 문은 범위를 비교할 때 좋습니다. 반면 하나의 값이 여러 정해진 값 중 무엇인지에 따라 나눌 때는 switch 문이 읽기 좋습니다.

Console.Write("메뉴 선택(1~3): ");
string? menu = Console.ReadLine();

switch (menu)
{
    case "1":
        Console.WriteLine("새 게임을 시작합니다.");
        break;
    case "2":
        Console.WriteLine("설정을 엽니다.");
        break;
    case "3":
        Console.WriteLine("프로그램을 종료합니다.");
        break;
    default:
        Console.WriteLine("알 수 없는 메뉴입니다.");
        break;
}

입력과 실행 결과 예:

메뉴 선택(1~3): 2
설정을 엽니다.

case는 값이 일치할 때 실행되는 구역입니다. default는 어떤 case에도 해당하지 않을 때 실행됩니다. 각 case 끝의 break는 switch 문을 빠져나가라는 뜻입니다.

최신 C#에서는 값을 바로 만들어 내는 switch 식도 자주 사용합니다. 여기서 식은 조건에 따라 하나의 결과값을 만드는 코드라고 생각하면 됩니다.

Console.Write("등급 입력(A/B/C): ");
string? grade = Console.ReadLine();

string message = grade switch
{
    "A" => "훌륭합니다.",
    "B" => "좋습니다.",
    "C" => "조금 더 연습해 봅시다.",
    _ => "알 수 없는 등급입니다."
};

Console.WriteLine(message);

입력과 실행 결과 예:

등급 입력(A/B/C): A
훌륭합니다.

_는 앞의 어떤 경우에도 맞지 않는 나머지 경우를 뜻합니다. switch 문은 여러 줄의 동작을 처리할 때 좋고, switch 식은 조건에 따라 하나의 값을 정할 때 좋습니다.

for 반복문: 횟수가 정해져 있을 때

반복문은 같은 코드를 여러 번 실행합니다. 그중 for 문은 반복 횟수가 분명할 때 많이 사용합니다.

for (int i = 1; i <= 5; i++)
{
    Console.WriteLine($"{i}번째 실행");
}

실행 결과:

1번째 실행
2번째 실행
3번째 실행
4번째 실행
5번째 실행

for 문의 괄호 안은 세 부분으로 나뉩니다.

for (초기값; 반복 조건; 반복 후 실행)

위 예제에서 int i = 1은 반복을 시작할 숫자입니다. i <= 5는 반복을 계속할 조건입니다. i++는 한 번 반복할 때마다 i를 1씩 증가시킵니다.

합계를 구할 때도 for 문을 자주 사용합니다.

int sum = 0;

for (int i = 1; i <= 10; i++)
{
    sum += i;
}

Console.WriteLine($"1부터 10까지의 합: {sum}");

실행 결과:

1부터 10까지의 합: 55

while과 do-while: 조건이 중심일 때

while 문은 조건이 참인 동안 반복합니다. 반복 횟수보다 "언제 끝날지"가 더 중요할 때 사용합니다.

다음 코드는 사용자가 올바른 숫자를 입력할 때까지 계속 묻습니다.

int number;

while (true)
{
    Console.Write("숫자 입력: ");
    string? input = Console.ReadLine();

    if (int.TryParse(input, out number))
    {
        break;
    }

    Console.WriteLine("숫자 형식이 아닙니다. 다시 입력하세요.");
}

Console.WriteLine($"입력한 숫자: {number}");

입력과 실행 결과 예:

숫자 입력: hello
숫자 형식이 아닙니다. 다시 입력하세요.
숫자 입력: 30
입력한 숫자: 30

while (true)는 일부러 무한 반복을 만드는 코드입니다. 대신 올바른 입력을 받으면 break로 반복문을 빠져나옵니다. 이런 코드를 작성할 때는 반복문을 끝낼 조건이 분명히 있는지 꼭 확인해야 합니다.

do-while 문은 조건을 나중에 검사합니다. 그래서 본문이 최소 한 번은 실행됩니다.

string? answer;

do
{
    Console.Write("계속할까요? (y/n): ");
    answer = Console.ReadLine();
}
while (answer != "y" && answer != "n");

Console.WriteLine($"선택: {answer}");

입력과 실행 결과 예:

계속할까요? (y/n): maybe
계속할까요? (y/n): y
선택: y

for, while, do-while의 선택 기준은 간단합니다.

  • 반복 횟수가 정해져 있다면 for

  • 조건이 참인 동안 계속 반복해야 한다면 while

  • 조건과 관계없이 최소 한 번은 실행해야 한다면 do-while

break와 continue로 반복 흐름 바꾸기

break는 반복문을 즉시 끝냅니다. 예를 들어 1부터 숫자를 검사하다가 처음으로 7의 배수를 만나면 멈출 수 있습니다.

for (int i = 1; i <= 20; i++)
{
    if (i % 7 == 0)
    {
        Console.WriteLine($"첫 번째 7의 배수: {i}");
        break;
    }
}

실행 결과:

첫 번째 7의 배수: 7

continue는 현재 반복만 건너뛰고 다음 반복으로 넘어갑니다. 다음 코드는 1부터 10까지 중 홀수만 출력합니다.

for (int i = 1; i <= 10; i++)
{
    if (i % 2 == 0)
    {
        continue;
    }

    Console.WriteLine(i);
}

실행 결과:

1
3
5
7
9

break는 반복문 전체를 끝내고, continue는 이번 차례만 넘긴다는 차이가 있습니다.

중첩 조건문과 중첩 반복문 줄이기

조건문 안에 조건문을 넣거나, 반복문 안에 반복문을 넣을 수 있습니다. 이를 중첩이라고 합니다.

예를 들어 로그인 상태와 관리자 여부를 함께 확인할 수 있습니다.

bool isLoggedIn = true;
bool isAdmin = false;

if (isLoggedIn)
{
    if (isAdmin)
    {
        Console.WriteLine("관리자 페이지로 이동합니다.");
    }
    else
    {
        Console.WriteLine("일반 사용자 페이지로 이동합니다.");
    }
}
else
{
    Console.WriteLine("로그인이 필요합니다.");
}

이 코드는 동작하지만, 조건이 많아지면 오른쪽으로 계속 밀려 읽기 어려워집니다. 간단한 경우에는 조건을 합치거나, 먼저 제외할 경우를 처리하면 더 읽기 쉽습니다.

bool isLoggedIn = true;
bool isAdmin = false;

if (!isLoggedIn)
{
    Console.WriteLine("로그인이 필요합니다.");
}
else if (isAdmin)
{
    Console.WriteLine("관리자 페이지로 이동합니다.");
}
else
{
    Console.WriteLine("일반 사용자 페이지로 이동합니다.");
}

반복문도 중첩할 수 있습니다. 구구단처럼 행과 열이 있는 출력에 적합합니다.

for (int dan = 2; dan <= 3; dan++)
{
    Console.WriteLine($"[{dan}단]");

    for (int number = 1; number <= 3; number++)
    {
        Console.WriteLine($"{dan} x {number} = {dan * number}");
    }
}

실행 결과:

[2단]
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
[3단]
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9

중첩 자체가 나쁜 것은 아닙니다. 다만 깊이가 깊어질수록 코드를 이해하기 어려워집니다. 조건 이름을 bool 변수로 분리하거나, 불필요한 중첩을 else if로 바꾸는 습관을 들이면 좋습니다. 코드를 작은 단위로 나누는 방법은 다음 장에서 메서드를 배우며 더 자세히 다룹니다.

흔한 실수

첫째, 비교 연산자와 대입 연산자를 혼동하는 경우입니다.

int score = 80;

if (score == 80)
{
    Console.WriteLine("80점입니다.");
}

==는 같은지 비교하고, =는 값을 저장합니다. 조건문에서는 대부분 ==, !=, >, < 같은 비교 연산자를 사용합니다.

둘째, 반복 조건을 잘못 작성해 무한 반복을 만드는 경우입니다.

int count = 1;

while (count <= 5)
{
    Console.WriteLine(count);
    count++;
}

count++를 빼면 count가 계속 1이므로 반복이 끝나지 않습니다. 반복문 안에서 조건에 영향을 주는 값이 바뀌는지 확인해야 합니다.

셋째, 범위의 끝을 헷갈리는 경우입니다.

for (int i = 1; i <= 10; i++)

이 코드는 1부터 10까지 총 10번 실행됩니다. 반대로 i < 10이면 1부터 9까지만 실행됩니다. 반복문을 작성할 때는 시작값, 끝 조건, 증가식을 함께 읽어야 합니다.

넷째, 중괄호를 생략해 의도와 다르게 실행하는 경우입니다. C#에서는 한 줄짜리 if나 for에 중괄호를 생략할 수 있지만, 초보 단계에서는 항상 중괄호를 쓰는 편이 안전합니다.

작은 연습 문제

  1. 사용자에게 나이를 입력받아 13세 미만은 어린이, 13세 이상 19세 미만은 청소년, 19세 이상은 성인이라고 출력해 보세요.

  2. switch 문을 사용해 1은 예금 조회, 2는 입금, 3은 출금, 그 외 값은 잘못된 메뉴라고 출력해 보세요.

  3. for 문으로 1부터 100까지의 짝수 합을 구해 보세요.

  4. 사용자가 q를 입력할 때까지 계속 문자열을 입력받는 while 문을 작성해 보세요.

  5. 1부터 20까지 출력하되, 3의 배수는 출력하지 않도록 continue를 사용해 보세요.

조건문은 프로그램이 판단하게 만들고, 반복문은 프로그램이 꾸준히 일하게 만듭니다. 이 두 가지를 익히면 입력을 검사하고, 메뉴를 만들고, 여러 값을 계산하는 기본 프로그램을 직접 구성할 수 있습니다.

책 목록

C# 학습: 기초 문법부터 작은 프로젝트까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기