프로그래밍 관련/C#
C# 강좌 7편. 무한 루프, 제어문(continue, break, goto) [최근 수정 2017.11.06]
LAYER6AI
2018. 1. 12. 14:30
1. 무한 루프(infinite loop)
전 강좌에서 말했었듯이, 무한 루프란 종료문을 만나지 못하고 끝없이 동작하는 것을 의미합니다. 개발자의 예상치 못한 실수로 중간에 무한 루프가 발생하면, 반복문 내의 코드가 계속해서 실행되므로 자칫하면 비정상적으로 프로그램이 종료될 수 있습니다. 그런데, 이 무한 루프가 단점만 있는 것이 아니라 장점도 존재합니다. 예를 들어, 사용자에게 계속 입력받으며 루프를 돌다가, 특정 문자가 입력되면 루프를 종료하는 것처럼 계속 반복되다가 특정한 조건을 만족하면 빠져나오게 할 수도 있습니다.
아래는 무한 루프의 예입니다.
.. while (true) { // 항상 참이므로 무한 루프에 빠진다. // 실행될 코드 } ..
위의 예를 보시면, 조건식에 참(true)이 오므로, 항상 참이되어 영역 내의 코드를 무한 반복합니다. 그렇다면, 이 무한 루프는 어떻게 쓰일까요? 아래는 무한 루프가 사용된 예입니다.
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int sum = 0; while (true) { Console.Write("수를 입력하세요: "); string line = Console.ReadLine(); // 값을 입력받는 부분! if (line == "end") break; // end가 입력되면 무한 루프를 빠져나온다. sum += int.Parse(line); // 문자열을 숫자로 변환한다! } Console.WriteLine("지금까지 입력된 수를 모두 더합니다: " + sum); } } }
결과:
수를 입력하세요: 457
수를 입력하세요: 1006
수를 입력하세요: 422
수를 입력하세요: 14
수를 입력하세요: 33
수를 입력하세요: end
지금까지 입력된 수를 모두 더합니다: 1932
계속하려면 아무 키나 누르십시오 . . .
코드를 살펴보자면, 11행부터 while문이 등장합니다. 하지만 조건식에 참(true)이 오기 때문에 항상 참이라는 조건이 성립됩니다. while문 안을 살펴보면 사용자에게 입력받은 값을 line란 변수에 저장하는 부분과 end가 입력되면 루프를 빠져나오는 부분과, 문자열을 숫자로 변환하여 sum에 더하는 부분이 보입니다. 결과를 살펴보면 457+1006+422+14+33의 값 1932가 결과로 출력됩니다.
2. break
먼저 break문부터 소개하도록 하겠습니다. 이 break문은 전에 배웠던 switch문에서 빠져나오기 위한 break나, 방금 무한 루프에서 빠져나오기 위해 사용되었던 break가 있습니다. break는 그대로 '탈출하다'라는 의미를 지니고 있으며, 루프에서나 switch문에서 사용됩니다.
아래는 특정한 조건을 만족하면 break문을 사용하여 빠져나오는 예제입니다.
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int num = 0; while (num < 100) // num보다 100이 크면 계속 반복 { if (num == 40) break; // num이 40이면 break로 인해 반복 탈출 Console.WriteLine("num: " + num); num++; // num의 값 1 증가 } } } }
결과:
num: 0
num: 1
num: 2
num: 3
...
num: 38
num: 39
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면 11행에서 while문이 등장하고, 조건식에 num < 100이 옵니다. 즉, 100이 num보다 크다면 반복 영역 내의 코드를 계속 실행합니다. 그리고 그 다음 15행에서는 num의 값이 40이라면 break문으로 인해 반복 영역을 빠져나옵니다. 40이 아니라면 if문을 무시하고 num의 결과를 출력한 뒤에 num의 값을 1 증가시키죠. 간단하죠?
3. continue
continue문은 조건을 검사하는 부분으로 넘어가 반복을 계속 수행하는 역할을 합니다. continue문을 만나면 바로 조건 검사부분으로 넘어간다는 말이죠. 쉽게 말해서, 한번 쉬고 계속 반복을 진행한다는 말과 같습니다. 예를 들면,
... for (int i = 0; i < 10; i++) { if (i == 7) continue; Console.WriteLine("i: " + i); } ...
for문을 만나 루프를 돌다가 i가 7이되면 continue문을 만납니다. continue문을 만나면 continue문 아래의 문장은 실행시키지 않고 한번 쉬고나서 반복을 계속 수행합니다. 아래는 for문에 continue문을 사용한 예제입니다.
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { for (int i = 1; i <= 50; i++) { if (i % 2 == 1) continue; Console.WriteLine("i: " + i); } } } }
결과:
i: 2
i: 4
...
i: 46
i: 48
i: 50
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면, 9행에서 for문이 등장합니다. for문의 시작과 함께 i의 값은 1로 초기화 되고 그 영역 내의 코드를 실행합니다. 11행에서 i를 2로 나눴을때 나머지가 1이라면, 즉 홀수라면 continue문을 만나 한번 쉬고 계속 반복을 수행합니다. 만약에 짝수라면 if문을 무시하고 i의 값을 출력하게 되겠죠.
만약에, i가 3이라고 가정하고 11행에 있는 if문을 거친다고 해봅시다. 현재 i의 값은 3이므로, 3을 2로 나누고 나머지가 1이므로 i%2==1란 조건이 성립합니다. 조건이 성립하므로, if문 내의 continue문을 만나 i의 값이 1증가되고 다음으로 넘어갑니다. i가 홀수가 아니고 짝수라면 결과처럼 그대로 출력됩니다.
4. goto
goto문은 해당 레이블로 뛰어넘어버리는 기능을 가지고 있습니다. 아래는 goto문의 사용 형식입니다.
... goto 레이블; ... 레이블: // 실행될 코드 ...
(여기서 레이블(Label)이란, 코드 내의 위치를 나타내주는 역할을 합니다.)
아래는 break문 예제에서 break문 대신 goto문이 사용된 예제입니다.
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int num = 0; while (num < 100) // num보다 100이 크면 계속 반복 { if (num == 40) goto EXIT; // num이 40이면 break로 인해 반복 탈출 Console.WriteLine("num: " + num); num++; // num의 값 1 증가 } EXIT: // EXIT 레이블! Console.WriteLine("탈출!"); } } }
결과:
num: 0
num: 1
num: 2
num: 3
...
num: 38
num: 39
탈출!
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면, 13행에서 break문이 goto EXIT;로 대체되었습니다. (goto EXIT를 만나면 EXIT 레이블로 건너뜁니다) goto문을 보면 상당히 편해보일수 있겠지만, 그렇다고 goto문을 많이 사용하면 프로그램의 흐름이 자주 끊어져 코드를 이해하기 어렵게 만들수 있습니다. 적당히 사용하는게 좋습니다.
이번 강좌는 여기서 마치도록 하겠습니다. 수고하셨습니다.
다음 강좌는 메소드(Method)에 대해 배워보도록 하겠습니다.