break, continue, goto로 반복문 제어하기
이번에는 제어문의 나머지 항목을 살펴보겠습니다. 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 문
반복문(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이상을 달성했습니다.
합계를 계속 구해나가는 과정에서 22 이상이 되면 더 이상의 합계를 구하지 않고 반복문을 빠져나올 때 break
키워드를 사용할 수 있습니다.
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까지 숫자 중 홀수만 출력합니다. 코드 작성 후 부록의 디버거 사용하기를 참고하여 F10
과 F11
키를 사용하여 한 줄 씩 실행해보면 좋습니다.
코드: 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
문을 만나면 continue
문 아래의 코드는 실행하지 않고 반복문의 다음 반복으로 이동합니다. for
문에서는 증감식(i++
)으로 이동합니다. 이러한 continue
문의 동작은 for
, while
, do
문에서도 동일합니다.
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
변수에 저장됩니다.
C 언어로 1부터 입력 받은 숫자까지 3의 배수만 출력하기
C 언어로 숫자 1부터 사용자로부터 콘솔로부터 입력 받은 숫자까지 3의 배수만 출력하는 프로그램을 작성하세요.
코드: only_multiples.c
#define _CRT_SECURE_NO_WARNINGS // scanf() 보안 경고 에러 방지
#include <stdio.h>
int main(void)
{
int goal = 0; // 목표치 값 받을 변수
int r = 0;
printf("10부터 100 사이의 정수 입력: ");
r = scanf("%d", &goal);
for (int i = 1; i <= goal; i++)
{
if (i % 3 != 0) // 3의 배수가 아니라면 건너뛰기
{
continue;
}
printf("%d\n", i); // 3의 배수일 때에만 printf() 실행
}
return 0;
}
프로그램을 실행한 후 10을 입력한 후 엔터 키를 입력합니다.
10부터 100 사이의 정수 입력: 10
3
6
9
방법은 많이 있지만, 이번에는 3의 배수가 아니면 continue
문을 만나서 다음 반복으로 이동하도록 코드를 작성했습니다. 그리고, 3의 배수일 때에만 printf
함수를 만나 값을 출력해서 1부터 10까지의 숫자 중에서 3의 배수인 3, 6, 9만 출력됩니다.
C언어로 while 문과 break 문 함께 사용하기
1부터 10까지 정수의 합을 구해나갈 때 합이 22 이상이 되면 멈추는 프로그램을 while
문을 사용해서 만들어 봅니다.
코드: while_break.c
// 1부터 10까지 정수의 합을 구해나갈 때 합이 22 이상이 되면 멈추는 프로그램
#include <stdio.h>
int main(void)
{
int goal = 22;
int sum = 0;
int i = 1;
while (i <= 10)
{
sum += i;
if (sum >= goal)
{
break; // 반복문 탈출
}
i++;
}
printf("1부터 %d까지의 합은 %d이고, ", i, sum);
printf("목표치 %d이상을 달성했습니다.\n", goal);
return 0;
}
1부터 7까지의 합은 28이고, 목표치 22이상을 달성했습니다.
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;
이 메서드 실행을 조기에 종료하는 역할을 한다는 점만 기억해도 좋습니다.
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) 다음 중 break
와 continue
에 대한 설명으로 올바르지 않은 것은 무엇인가요?
a. break
는 switch
문을 종료한다.
b. break
는 for
, 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
를 사용하여 반복문을 종료하고, 입력된 숫자까지만 출력되도록 합니다.