1. 목표


반복문(while, do while, for, foreach)의 이해 및 사용

제어문(break, continue, goto, return, throw) 이해 및 사용


2. 반복문 종류


프로그램에서 반복문이란 어떠한 조건을 걸어 이를 만족할 때 까지 코드 또는 코드 블록을 계속 반복 수행하도록

하는 문법입니다. c#에서는 for, while, do while, foreach 까지 총 4개의 반복문이 있습니다.


3. 실습


while문

사용법은 간단합니다. 조건이 참일때 코드를 반복 실행합니다. 주의해야 될점은 조건식에 사용되는 

변수나 또는 코드블록 내에서 반복문을 제어해 빠져나올수 있도록 작성해야 된다는 것입니다.

프로그램에서 무한루프 빠져 나올수 없는 경우도 종종 발생해 확실한 제어가 필요합니다.

while(조건식)
{
    //반복할 코드
}

1. while문 조건식에서 제어하기

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int nNum = 0;

            while(nNum < 5)
            {
                Console.WriteLine("nNum : {0}", nNum++);
            }
        }
    }
}

2. while문 코드 블럭 내에서 제어하기

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int nNum = 0;

            while(true)
            {
                Console.WriteLine("nNum : {0}", nNum++);

                if (nNum >= 5)
                    break;
            }
        }
    }
}


결과

nNum : 0
nNum : 1
nNum : 2

nNum : 3

nNum : 4


경우에 따라서 제어하는 방법은 달라질수 있습니다.

1번 소스코드의 경우 일반적으로 사용하는 while문 제어 방법입니다. 조건식에 맞춰 반복되다 코드블럭을 빠져나옵니다.

2번 소스코드의 경우 위험한 방법일수도 있지만 경우에 따라 코드블럭 내에서 특정 조건이 되었을때 break문을 사용하여

제어 할수 있는 방법입니다.


※무한루프

 - 반복문이 제어가 되지 않아 무한대로 반복이 이루어지는 현상입니다.

 - 혹여 아래 코드를 디버그 모드로 실행 하신다면 콘솔창의 x 버튼 또는 

    Shift+F5를 눌러 실행중인 프로그램을 강제 종료 할수 있습니다.


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int nNum = 0;

            while(true)
            {
                Console.WriteLine("nNum : {0}", nNum++);
            }
        }
    }
}

결과

nNum : 0

nNum : 1

...

nNum : 102

...


while문의 조건식이 언제나 true이기 때문에 항상 코드블럭을 실행 시키고

코드블럭 내에서도 제어를 하는 코드가 없어 nNum의 값만 증가되고 무한루프에 빠지게 됩니다.


do while문

while문과는 다르게 특이한점이 무조건 한번은 먼저 실행되고 반복문의 조건식을 확인합니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int nNum = 5;

            do
            {
                Console.WriteLine("nNum : {0}", nNum--);
            }
            while (nNum > 0);
        }
    }
}

결과

nNum : 5
nNum : 4
nNum : 3

nNum : 2

nNum : 1




for문

복잡해 보일수 있는 반복문이지만 사용하기 편한 반복문입니다.


for문의 구성

 - 초기화 : 반복문을 시작하기전 처음 한번만 실행되는 코드입니다. 때문에 반복문에서 사용할 변수를

              선언하고 값을 할당 합니다.

 - 조건식 : 조건식이 true일때 반복 실행 합니다.

 - 반복식 : 매번 코드블럭이 실행이 끝나고 마지막에 실행 됩니다.


[초기화]->[조건식] --ture-->[코드 실행] -->[반복식]-->[조건식]--false-->[종료]

for(초기화; 조건식; 반복식;)
{
    //반복할 코드
}

for문에서 초기화를 할때 변수 이름은 많은 프로그래머들이 암묵적으로 i, j, k... 순서로 이름을 사용합니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            for(int i = 0; i < 5; i++)
            {
                Console.WriteLine("Num : {0}", i);
            }
        }
    }
}

결과

Num : 0

Num : 1

Num : 2

Num : 3

Num : 4


※ 다중 for문 - 코드를 작성하다보면 수학적 논리(2차원 배열)를 구현하거나 필요에 의해서 반복문을 겹쳐서 사용

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1; i < 2; i++)
            {
                for (int j = 1; j < 5; j++)
                {
                    Console.WriteLine("{0} * {1} = {2}", i, j, i * j);
                }
            }
        }
    }
}

결과

1 * 1 = 1

1 * 2 = 2

1 * 3 = 3

1 * 4 = 4


다중 for문을 사용하여 1단~9단까지 구구단을 완성해보세요.



foreach문
foreach문을 사용하기 앞서 배열에 대해 알고 넘어 가도록 하겠습니다.
우리가 특정 타입의 변수를 선언하고 값을 할당 하는 방법은 이제 자주 접하여 알수 있습니다.
배열의 경우는 똑같은 타입의 변수를 순서대로 가지고 있는 데이터 덩어리 입니다.

int[] nArr = {1,3,5,7,9,2,4,6,8};
이렇게 같은 타입에 복수의 값을 선언하게 되면 각각의 변수를 선언 하지않고 대신 nArr[인덱스]의 형태로
값에 접근할수 있는 구조를 가지게 됩니다. 여기서 인덱스는 0부터 시작합니다.


이렇게 규칙적인 데이터 구조를 가진 배열을 이용하여 사용할수 있는 반복문이 foreach문 입니다.

foreach(변수 in 데이터 배열)
{
    //실행할 코드
    //데이터 배열의 각 인덱스를 변수가 참조하여 값을 확인 할수 있습니다.
}


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nArr = {1, 3, 5, 7, 9, 2, 4, 6, 8 };

            Console.WriteLine("nArr[{0}] = {1}", 0, nArr[0]);
            Console.WriteLine("nArr[{0}] = {1}", 3, nArr[3]);
            Console.WriteLine();


            int nIndex = 0;

            foreach(int i in nArr)
            {
                Console.WriteLine("nArr[{0}] = {1}", nIndex++, i);
            }
        }
    }
}

결과

nArr[0] = 1
nArr[3] = 7


nArr[0] = 1

nArr[1] = 3

nArr[2] = 5

nArr[3] = 7

nArr[4] = 9

nArr[5] = 2

nArr[6] = 4

nArr[7] = 6

nArr[8] = 8


이렇게 foreach문은 정규화된 데이터 배열들을 반복적으로 처리해야 되는경우 손쉽게 데이터 배열에 접근하여

값을 사용할수 있습니다. 또한 배열 데이터들을 처리할때 for문이나 while문 보다 foreach문이 반복 처리 속도가 더 좋습니다.


4. 제어문 종류


제어문에는 break, continue, goto, return, throw 이렇게 c#에서는 5가지의 제어문을 제공합니다.

우리는 이중에서 break, continue, goto문만 우선적으로 다루어 보도록 하겠습니다.



5. 실습


break문

while문과 switch문에서 사용한것 처럼 해당 코드블럭를 중지하고자 할때 쓰는 문법입니다.

강좌 4와 while문 실습 참조


continue문

continue는 break와 달리 코드블럭을 중지하지 않고 다음 반복을 계속 수행하도록 하는 문법입니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                if (i == 3)
                    continue;

                Console.WriteLine("Num : {0}", i);
            }
        }
    }
}

결과

Num : 0

Num : 1

Num : 2

Num : 4






goto문

goto문은 점프문 이라부르는데 위치와 상관없이 원할때 원하는 위치로 이동하여 코드를 실행하는 무지막지한

녀석입니다. 과도한 goto문을 사용시 가독성도 떨어지고 코드의 흐름을 꼬이게 만드는 주범입니다.

항상 주의하며 사용해야되고 꼭 필요한 상황이 아니면 사용하지 않는 것이 좋습니다.

goto 레이블A;
...
...
레이블A:
    //이어지는 코드

소스코드와 같이 반복문 처럼 사용할수도 있고 필요없는 연산이나 인위적으로 코드를 점프하여 이동  할 수 있습니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;

            AAA:
            Console.WriteLine("AAA : {0}", i);
            i++;

            if (i == 5)
                goto BBB;

            goto AAA;
            BBB:

            Console.WriteLine();
            Console.WriteLine("BBB : {0}", i);
        }
    }
}

결과

AAA : 0
AAA : 1

AAA : 2

AAA : 3

AAA : 4


BBB : 5


다음 강좌에서는 메서드(함수)에 대해 알아보도록 하겠습니다.


수고하셨습니다.




+ Recent posts