break, continue, goto로 반복문 제어하기

  • 18 minutes to read

이번에는 제어문 중 나머지 항목들을 살펴보겠습니다. break 문은 반복문이나 switch 문에서 실행 흐름을 즉시 빠져나갈 때 사용합니다. continue 문은 현재 반복을 중단하고, 다음 반복을 진행하기 위해 반복문의 조건 검사 또는 증감식 등으로 바로 넘어갑니다. goto 문은 코드 내에 지정된 레이블로 무조건 이동할 때 사용되며, 일반적으로는 사용을 지양하지만 특정 상황에서 유용하게 쓰일 수 있습니다.

> // 점프 문: break 문, continue 문, goto 문, ..., throw, return, yield

의사 코드:

BreakPseudo.txt

> // 점프 문: break 문: break로 반복문 끝내기
> 
> var goal = 3;
> 
> var result = "";
> 
> for (var i = 0; i < 100; i++)
. {
.     if (i == goal)
.     {
.         break; 
.     }
.     result += "Hello\n";
. }
> 
> result
"Hello\nHello\nHello\n"
>

ContinuePseudo.txt

> // 점프 문: continue 문: continue 문으로 반복문 코드 건너뛰기 
> // 1부터 100까지 정수 중 7의 배수를 제외한 수들의 합계
> 
> var sum = 0;
> 
> for (var i = 1; i <= 100; i++)
. {
.     if (i % 7 == 0)
.     {
.         continue;
.     }
.     sum += i; 
. }
> 
> sum
4315
>

break, continue, goto로 반복문 제어하기

continue

  • 가장 가까운 반복문(for, while, do-while)의 조건식으로 제어를 건너뜀
  • 반복 중 continue를 만나면 나머지 코드는 실행하지 않고, 다음 반복을 위해 조건식을 다시 평가함
  • 반복을 계속하되, 현재 반복의 뒷부분을 생략하고 넘어갈 때 사용

🛑 break

  • 반복문(for, while, do-while)을 즉시 종료하고 반복문 바깥의 코드로 이동
  • 조건과 관계없이 반복을 빠져나가야 할 때 사용
  • 일반적으로 switch 문에서도 분기 종료를 위해 사용됨

📌 goto

  • 코드의 특정 위치(레이블)로 무조건 이동하는 명령문
  • 레이블(label)은 레이블이름: 형태로 정의하며, goto 레이블이름;으로 이동함
  • 프로그램 흐름을 원하는 위치로 강제 이동할 수 있으나, 구조적 프로그래밍 관점에서는 사용을 지양

break 문

반복문(for, do, while)을 빠져나올 때에는 break 문을 사용할 수 있습니다.

아무것도 하지 않는 프로그램

다음 코드는 말 그대로 아무것도 하지 않는 프로그램입니다. for 문 안에 break를 두어서 바로 for 문을 빠져 나옵니다.

코드: BreakFor.cs

class BreakFor
{
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            if (i >= 0)
            {
                break; // 현재 코드를 만나면 현재 for 문을 종료함
            }
        } // end of for
    }
}

break 키워드를 사용하여 for, while, do 반복문을 바로 빠져 나올 수 있습니다.

무한 루프(Infinite Loop) 빠져 나오기

프로그래밍 언어에서 무한 루프는 루프를 무한정 도는 경우를 말합니다. 특정 조건을 만족할 때에 루프를 빠져나올 땐 break 문을 사용할 수 있습니다.

코드: BreakInfiniteLoop.cs

using System;

class BreakInfiniteLoop
{
    static void Main()
    {
        int number = 0;

        while (true) // 무한 루프
        {
            Console.WriteLine(++number);

            if (number >= 5)
            {
                break; // break 문으로 무한 루프 빠져 나오기 
            }
        }
    }
}
1
2
3
4
5

while (true) {} 코드는 무한 루프입니다. while 문이 계속해서 반복하도록 설정한 후에 number 값을 1씩 증가시켜 출력 후 5보다 크게되면 break 문에 의해서 while 문을 빠져나오도록 설정하였습니다.

break로 반복문 끝내기

다음 코드는 0부터 99까지 반복하는 코드에서 5일 때 for 문(while 문도 동일)을 종료합니다.

코드: BreakDemo.cs

using System;

class BreakDemo
{
    static void Main()
    {
        // break 문: for, while, do 구문을 빠져나가는 역할
        for (int i = 0; i < 100; i++)
        {
            if (i == 5)
            {
                break; // i == 5일 때 for문 종료
            }
            Console.Write($"{(i + 1)}번 반복\t");
        }
        Console.WriteLine();
    }
}
1번 반복        2번 반복        3번 반복        4번 반복        5번 반복 

for 문과 while 문에서 break 문을 만나면 바로 반복문을 더 이상 실행하지 않고 빠져나오게 됩니다.

break 문을 사용하여 while 문 빠져나오기

이번에는 while 문 안에서 break 문을 사용하여 반복문을 중단하는 예제를 살펴보겠습니다. 이 예제는 1부터 10까지 정수를 차례로 더해가다가, 합계가 22 이상이 되는 순간 반복을 멈추는 프로그램입니다.

코드: WhileBreak.cs

// 1부터 10까지 정수의 합을 구해나갈 때, 합이 22 이상이 되면 멈추는 프로그램
using System;

class WhileBreak
{
    static void Main()
    {
        int goal = 22;
        int sum = 0;

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

            if (sum >= goal)
            {
                break;  // 반복문 탈출
            }

            i++;
        }

        Console.WriteLine(
            $"1부터 {i}까지의 합은 {sum}이고, 목표치 {goal} 이상을 달성했습니다.");
    }
}
1부터 7까지의 합은 28이고, 목표치 22 이상을 달성했습니다.

break 키워드는 반복문 실행 도중 특정 조건이 충족되었을 때, 반복을 즉시 종료하고 빠져나오고자 할 때 사용할 수 있습니다. 이 예제에서는 합계가 목표치를 넘는 순간 break 문을 통해 while 문을 빠져나가고 있습니다.

BreakPractice.java

BreakPractice.java

// 1부터 10까지 출력할 때 사용자로부터 입력받은 수까지만 출력하는 프로그램
import java.util.Scanner; 

public class BreakPractice {
    public static void main(String[] args) {
        System.out.print("1부터 10까지 하나만 입력하세요: ");
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();

        for (int i = 1; i <= 10; i++) {
            System.out.println(i);
            if (i == number) {
                break; // 반복문 탈출
            }
        }
    }
}
1부터 10까지 하나만 입력하세요: 3
1
2
3

continue 문으로 코드 건너뛰기

이번에는 continue 문을 사용하여 반복문 안에서 특정 코드를 건너뛰는 방법을 살펴보겠습니다. 이 예제에서는 1부터 5까지 숫자 중 홀수만 출력합니다. 작성한 코드를 실행한 뒤, 부록의 디버거 사용하기 내용을 참고하여 F10F11 키를 활용해 한 줄씩 실행해 보면 동작 원리를 이해하는 데 도움이 됩니다.

코드: ForIfContinue.cs

// [?] continue 문을 사용하여 반복문(for, while, do)에서 다음 반복으로 이동하기
using System;

class ForIfContinue
{
    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            if (i % 2 == 0)
            {
                // 짝수인 경우, 아래 코드 건너뛰고 다음 반복으로 이동
                continue;
            }

            Console.WriteLine(i); // 1, 3, 5
        }
    }
}
1  
3  
5

이 프로그램은 for 문을 이용해 1부터 5까지 반복하면서, if 문으로 짝수를 판별해 continue 문을 실행합니다. continue 문을 만나면 그 아래에 있는 Console.WriteLine(i) 문은 실행되지 않고, 반복문의 다음 순서로 바로 넘어갑니다. for 문의 경우, continue 이후에는 곧바로 증감식(i++)으로 이동하게 됩니다.

이러한 continue 문은 for 문뿐만 아니라 while 문, do-while 문에서도 동일하게 동작합니다.


continue 문으로 배수 제외한 수의 합 구하기

이번에는 continue 문을 사용하여 3의 배수를 제외한 수의 합을 구해보겠습니다.

코드: ContinueDemo.cs

> // continue문: 반복문에서 아래 실행문을 실행하지 않고 다음 구문으로 이동
> //[!] 1~100까지 정수 중 3의 배수를 제외한 수의 합
> int sum = 0;
> for (int i = 1; i <= 100; i++)
. {
.     if (i % 3 == 0)
.     {
.         continue; // 3의 배수이면 [i++] 코드 영역으로 이동하기
.     }
.     sum += i;
. }
> Console.WriteLine("SUM: {0}", sum); // 3367
SUM: 3367

if (i % 3 == 0) { continue; } 코드에 의해서 3의 배수일 때 continue 문을 만나서 이후의 실행문을 실행하지 않고 다음 반복으로 넘어갑니다. 그래서 3의 배수를 제외한 수의 합만 sum 변수에 저장됩니다.

goto로 프로그램의 흐름을 원하는 대로 바꾸기

프로그래밍할 때 직접 원하는 위치로 이동해야 하는 경우가 발생합니다. 이 때 goto 문을 사용합니다.

goto 문은 특정 레이블로 이동하는 기능을 합니다. 레이블은 다른 말로 책갈피로 부릅니다. C 언어에서 레이블은 콜론(:) 기호를 레이블 이름 뒤에 붙여 만듭니다. 이렇게 만들어진 레이블 코드는 평상시에는 주석처럼 아무런 의미없는 코드로 사용되지만 goto 문 뒤에 레이블을 지정하면 해당 레이블로 이동하는 기능이 실행됩니다.

레이블:
goto 레이블;

goto 문 사용하기

이번에는 goto 문을 사용해보겠습니다.

코드: GoToDemo.cs

// goto문: 지정한 레이블(책갈피)로 이동하는 구문
using System;

class GoToDemo
{
    static void Main()
    {
        Console.WriteLine("시작");
        Start:
        Console.WriteLine("0, 1, 2 중 하나 입력: _\b");
        int chapter = Convert.ToInt32(Console.ReadLine());

        if (chapter == 1)
        {
            goto Chapter1; // [1]번 코드 영역으로 이동
        }
        else if (chapter == 2)
        {
            goto Chapter2; // [2]번 코드 영역으로 이동
        }
        else
        {
            goto End; // [3]번 코드 영역으로 이동
        }

        Chapter1: // [1] 
        Console.WriteLine("1장입니다.");

        Chapter2: // [2]
        Console.WriteLine("2장입니다.");

        goto Start;

        End: // [3]
        Console.WriteLine("종료");
    }
}
시작
0, 1, 2 중 하나 입력: _
1
1장입니다.
2장입니다.
0, 1, 2 중 하나 입력: _
2
2장입니다.
0, 1, 2 중 하나 입력: _
1
1장입니다.
2장입니다.
0, 1, 2 중 하나 입력: _
2
2장입니다.
0, 1, 2 중 하나 입력: _
0
종료

사용자로부터 0, 1, 2 중 하나를 입력받은 후 1이면 Chapter1 이름으로 설정된 레이블로 이동하고, 2면 Chapter2 레이블로 이동하고 나머지 값이 입력되면 End 레이블로 이동하여 프로그램을 종료합니다.

NOTE

goto 문은 코드를 읽고 수정하기 어렵게 만들 수 있습니다. goto 문 대신에 if 문과 같은 다른 제어문 사용을 권장합니다.

return 문 미리보기

C#에서 return; 키워드는 특정 조건에서 메서드 실행을 즉시 중단하고, 호출한 코드로 제어를 반환하는 데 사용됩니다. 특히 반환 타입이 void인 메서드에서 유용하며, 조건에 따라 메서드를 조기에 종료할 때 활용됩니다.
메서드(함수) 개념이 아직 익숙하지 않다면, return;이 메서드 실행을 조기에 종료하는 역할을 한다는 점만 기억해도 좋습니다.

코드: return 문으로 조기 종료하기(ReturnPreview.cs)

using System;

class ReturnPreview
{
    static void Main()
    {
        Console.WriteLine("프로그램 시작");

        // 특정 조건을 검사하는 코드 (예제에서는 true로 설정)
        bool exitProgram = true;

        if (exitProgram)
        {
            Console.WriteLine("조건을 만족하여 프로그램을 종료합니다.");
            return; // 조건이 충족되면 Main 메서드를 즉시 종료
        }

        // return 문 이후의 코드는 실행되지 않음
        Console.WriteLine("조건이 충족되지 않아 프로그램이 계속 실행됩니다.");
    }
}
프로그램 시작
조건을 만족하여 프로그램을 종료합니다.

이 예제에서는 exitProgram 변수의 값에 따라 실행 흐름을 제어합니다. 변수가 true라면 "조건을 만족하여 프로그램을 종료합니다."를 출력한 뒤, Main 메서드가 즉시 종료됩니다. 따라서 return; 이후에 위치한 코드는 실행되지 않습니다.

12 장 요약

C#에서 제공하는 문(statements)에서 점프 문을 사용해보았습니다. 점프 문은 for, do, while 문과 함께 사용하여 실행 시점을 다른 곳으로 이동(점프)시키는 역할을 합니다. 참고로 goto 문은 최근에는 거의 사용되지 않는 구문입니다. 제어문에 대한 내용은 여기까지 다루고 여러 데이터를 다루는 배열을 학습해나가도록 하겠습니다.


기타 반복문 퀴즈 및 연습문제

퀴즈

(1) 다음 중 breakcontinue에 대한 설명으로 올바르지 않은 것은 무엇인가요?

a. breakswitch 문을 종료한다.
b. breakfor, while, do 문을 종료한다.
c. continue는 반복문 내에서 나머지 코드를 건너뛰고 다음 반복으로 이동한다.
d. continue는 반복문 내의 나머지 코드를 실행한 후 루프를 종료한다.

정답: d

continue는 반복문에서 이후의 코드를 실행하지 않고 다음 반복으로 이동합니다.


연습문제: 반복문 빠져나오기

다음 소스 코드를 완성하여 1부터 10까지 출력할 때, 사용자가 입력한 숫자까지만 출력하는 프로그램을 작성하세요.

코드

// 1부터 10까지 출력할 때 사용자로부터 입력받은 수까지만 출력하는 프로그램
using System;

class BreakPractice
{
    static void Main()
    {
        Console.Write("1부터 10까지 중 하나를 입력하세요: ");
        int number = Convert.ToInt32(Console.ReadLine());

        for (int i = 1; i <= 10; i++)
        {
            Console.WriteLine(i);
            if (i == number)
            {
                break;
            }
        }
    }
}

실행 결과 예시

1부터 10까지 중 하나를 입력하세요: 3
1
2
3

정답

break;

해설

사용자로부터 입력받은 값을 number 변수에 저장합니다. 이후, for 문을 이용해 1부터 10까지 반복하며 숫자를 출력합니다. 만약 i가 입력된 값과 같아지면 break를 사용하여 반복문을 종료하고, 입력된 숫자까지만 출력되도록 합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com