Media Log


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)에 대해 배워보도록 하겠습니다.

  1. 나그네 at 2012.09.13 13:16 신고 [edit/del]

    8강이 빨리 나왔으면 좋겠어요.. 정말 잘 보고 있습니다. 감사합니다.

    Reply
  2. 나그네 at 2012.09.13 13:56 신고 [edit/del]

    혹씨라도 개인지도 해주실수 있으시나요? 설명이 너무 좋아서 개인지도 받고 싶습니다.
    soundpop1@naver.com 으로 메일주세요.. 연락처도 함께 주시면 전화 드리겠습니다.
    감사합니다.

    Reply
  3. 김하섭 at 2012.09.14 13:51 신고 [edit/del]

    잘봤습니다 ^^ 알기쉽게 설명해 놓아서 정말 이해하기 쉬웠습니다

    Reply
  4. 김승현 at 2012.10.20 00:19 신고 [edit/del]

    감사합니다~

    Reply
  5. kes at 2013.04.18 18:48 신고 [edit/del]

    자바를 배우고 c#을 배우는데 강의 잘 보고 있습니다~
    Console.ReadLine이 자바의 Scanner와 같은기능이군요~
    설명이 너무 쉽게 잘되있어서 좋네요~

    Reply
  6. 열! 공! at 2013.07.30 13:48 신고 [edit/del]

    제가 초보라 잘모르는게있어서요....^^
    질문 두가지 부탁드립니다.

    첫 번째
    sum += int.Parse(line);
    위의 코드는 무엇을 의미하는건가요?

    int.Parse(line); -> 이표현을 제가 처음 봐서 잘 모르겠습니다.

    두 번째 입니다.
    Console.WriteLine("입력한 모든 수를 더합니다:", +sum);
    위의 문장이
    Console.WriteLine("입력한 모든 수를 더합니다: {0}", sum);
    다른점은 무엇인가요?

    그리고 전자로 사용하신 이유는 특별히 있나요?

    이상입니다....꼭!! 답변 부탁드립니다~

    Reply
    • BlogIcon EXYNOA at 2013.07.30 17:32 신고 [edit/del]

      sum += int.Parse(line);
      위에 쓰인 int.Parse 메서드는 문자열을 정수 형식으로 바꾸어 줍니다.

      Console.WriteLine("입력한 모든 수를 더합니다: " + sum);
      그리고 위에 쓰인 + 연산자는 문자열과 다른 피연산자를 연결하며,

      Console.WriteLine("입력한 모든 수를 더합니다: {0}", sum);
      위의 문장은 포맷을 통해서 뒤에 따라오는 인수인 sum이 치환자에 의해 {0} 자리에 출력됩니다.

      후자의 방법도 좋지만, 개인적으로 전자가 편해서 전자의 방법을 사용했습니다!

    • 열! 공! at 2013.07.30 18:02 신고 [edit/del]

      아하~ 제가 그위의 입력라인에서 string으로 입력받는 부분을 보지못했네요.....

      문자열로 입력을 받았으니 당연히 합을 구하려면 int로 바꿔줘야 하는 부분이 당연하네요...

      그러면 종료 이벤트가되는 'end'문자열 을 입력받기 위해 string으로 자료를 입력 받도록 작성하신거라 이해 해도 될까요??

  7. 차상협 at 2013.08.23 17:48 신고 [edit/del]

    연락처를 좀 알고 싶어서 문의 남깁니다 ^^

    강의 잘 보고 있습니다

    혹시라도 실례가 안된다면 shmg1000@naver.com으로 연락처 하나 주시면 감사하겠습니다.

    Reply
  8. 임영빈 at 2013.08.26 11:44 신고 [edit/del]

    Console.WriteLine 에서의 + 연산자에 의해 정수가 String 으로 (c에서의 strcat와 비슷하게 ) 바뀌는건가요?

    Reply
    • BlogIcon EXYNOA at 2013.08.26 16:55 신고 [edit/del]

      네 맞습니다. 두 피연산자의 형식이 정수인 경우에는 두 정수의 합을 계산하며, 하나 또는 두 피연산자가 문자열 형식인 경우는 피연산자를 서로 문자열로 연결시킵니다.

  9. ZiNee at 2013.10.13 18:54 신고 [edit/del]

    열공하기에 아주 좋은 노아님의 강의입니다. 감사합니다.

    Reply
  10. BlogIcon hankim at 2014.08.07 23:26 신고 [edit/del]

    2. break 문과 3. goto 에서

    17열에 Console.WriteLine("num" + num);

    에서 '+' 의 의미가 무엇인지 여쭤봐도 될까요?

    감사합니다.

    Reply
  11. BlogIcon 치리시 at 2014.10.16 11:16 신고 [edit/del]

    저같은경우는 레이블만드는게 편한경우도 있더군요. 50줄짜리 코드를 한묶음씩 만들어서 이용하는게 오히려... 움. 어짜피 다른사람한테 코드를 보여주는것도 아니고 이런때는 goto문을 사용하는것도 괜찮지는 않을지 생각되네요.

    Reply
  12. BlogIcon 치리시 at 2014.10.16 11:20 신고 [edit/del]

    추가로 음 제가 생각하는 goto문의 가장 안좋은 예시가 goto를 사용하면서 주석을 안달아놓은경우랄까요. 레이블도 알아보기 쉽구 주석을 달아놓으면 오히려 반복구문보다 알아보기 쉬운경우가 있더라구요... 저같은경우는 50줄짜리 두개 묶으려고 반복구문을 100줄짜리로 만든거 보면 극혐이거든요...ㄷㄷ..

    Reply
  13. 베리드 at 2015.01.04 21:16 신고 [edit/del]

    정말 감사합니다 아무리 책을 봐도 이해가 안되고 그랬는데...
    되게 간단하게 핵심만 있는 강의네요 정말 매강의 마다 이해가 잘되고 있습니다!

    Reply
  14. 초보 at 2016.01.08 23:19 신고 [edit/del]

    온라인강좌에서 없는 내용이 있어 유익하게 잘 보고 있습니다.

    Reply
  15. 고훈 at 2016.09.17 10:05 신고 [edit/del]

    감사합니다.^^
    얻는 게 많고 이해가 쉽습니다..

    Reply
  16. 은밤 at 2017.03.06 11:04 신고 [edit/del]

    머릿속에 속속들어오는 강의 감사합니다~^^

    Reply
  17. dbswo5092 at 2017.05.31 13:46 신고 [edit/del]

    사랑해요

    Reply
  18. GB at 2018.02.05 14:04 신고 [edit/del]

    감사합니다 잘읽고 공부하고 있습니다^^

    Reply

submit

티스토리 툴바