프로그래밍 관련/C#

C# 강좌 6편. 반복문(while, do, for, foreach) [최근 수정 2017.11.10]

LAYER6AI 2018. 1. 12. 14:30


1. while(참일때 동안 반복~)


오늘은 반복문에 대해서 알아보도록 할 텐데, 여기서 반복문이란 말 그대로 반복에서 쓰이는, 특정 조건을 만족할 때 까지 계속 반복하여 실행하는 문장입니다. 우선은 while문부터 알아보도록 하겠습니다. 아래는 while문의 기본 형태입니다.

while (조건식) {
    // 반복 실행될 코드
}

위와 같은 형태에서 조건식은 if문과 마찬가지로 true 또는 false가 반환되어야 합니다. while문의 특징은 조건식이 참일 때 동안 계속해서 반복하여 코드를 실행합니다. 만약에 반복하다 조건식이 거짓이 되면 루프를 빠져나옵니다. (여기서 루프란 프로그램의 실행 흐름이 고리처럼 이어지는 부분을 말합니다. 즉, 반복되는 부분을 말함) 그러나 계속 조건식이 참이라면 루프를 빠져나오지 못하고 계속 반복하게 되는 무한 루프에 빠집니다.


아래는 while문을 사용하여 num이 10보다 커질때까지 반복하는 예제입니다.

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 1;

            while (num <= 10)
                Console.WriteLine("num: {0}", num++);
        }
    }
}
결과:
num: 1
num: 2
num: 3
num: 4
num: 5
num: 6
num: 7
num: 8
num: 9
num: 10
계속하려면 아무 키나 누르십시오 . . .

위의 예제를 설명하자면, 정수형 변수 num을 선언하고 그와 동시에 1이란 값으로 초기화시켰습니다. 그러곤 while문이 등장하여 num이 10보다 커질 때까지 반복을 하죠. num이 11이 된다면 조건식을 만족하지 못하고 그대로 빠져나와 버립니다. 그리고 그다음에 등장하는 12행에서 인수를 보아하니 num++라는게 왔습니다. 이것은 우리가 전에 배운 증감 연산자이며, 자세히 말하자면 후위 증가 연산자입니다. num의 값을 우선 출력하고 그제서야 num의 값이 1만큼 증가하죠.

만약에 num의 값을 증가하는 부분을 빼버린다면 어떤일이 발생할까요?
...
            while (num <= 10)
                Console.WriteLine("num: {0}", num);
...
결과:
num: 1
num: 1
num: 1
num: 1
num: 1
num: 1
...

그대로, num의 값이 1에서 항상 머무르기 때문에 조건식을 항상 만족하고 num의 값을 출력합니다. 이런 무한 루프는 어찌 보면 골칫덩어리지만 또 어찌 보면 유용하게 사용될 수 있는 부분입니다. 무한 루프에 대해서는 나중에 다시 한번 설명해드리겠습니다.

2. do~while(한번은 먼저 실행 후 반복~)

조건식을 먼저 검사하고 코드를 실행하는 while문과는 달리 do~while문은 먼저 한번 코드를 실행시키고 그다음에 조건식을 검사합니다. 다음은 do~while의 기본적인 형태입니다.
do {
// 반복 실행될 코드
} while (조건식); // 여기서 주의하실 것은 마지막에 세미콜론이 붙는다는 겁니다.
꼭 기억하셔야 할 것은, do~while문을 사용하면 조건식을 만족하든 만족하지 않든 반드시 한번은 실행이 된다는 겁니다. 아래는 위의 while문 예제를 do~while문으로 다시 구현 한 것입니다.
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 1;

            do
            {
                Console.WriteLine("num: {0}", num++);
            } while (num <= 10);
        }
    }
}
결과:
num: 1
num: 2
num: 3
num: 4
num: 5
num: 6
num: 7
num: 8
num: 9
num: 10
계속하려면 아무 키나 누르십시오 . . .

결과를 보아선 아까의 while문을 사용했을 때의 결과와 다른 게 없습니다. 그러나 우리가 프로그램을 만들다 보면 우선 검사하고 나중에 실행하는 while문이 아닌 먼저 실행하고 나중에 검사하는 do~while문이 필요할 때가 있습니다. 꼭 한번은 실행시키고 검사를 해야 하는 상황이 발생했을 때 유용하게 쓰이죠.

3. for(참이 될 때까지 반복~)

for문은 while문과 같이 특정 조건을 만족할때까지 반복에 쓰입니다. 비교해보면 for문은 while문보다 쓰기도 쉽고, 초기화 부분과 증감 부분이 따로 놀지도 않습니다. 아래는 while문과 for문을 비교한 것입니다.
for(초기식; 조건식; 증감식) {
    // 반복해서 실행될 코드
}
초기식;

while(조건식) {
    // 반복해서 실행될 코드
    증감식
}
확실히 간편하죠? 여기서 초기식에는 반복을 실행하기 전 반복문에서 사용될 변수를 초기화하는 부분입니다. 조건식은 그대로 반복 여부를 결정하는 부분이고, 증감 식은 반복문을 빠져나오기 위하여 어느 변수의 값을 감소시키거나 증가시키는 부분을 말합니다. 아래는 while문, do~while문에 쓰였던 예제를 for문으로 다시 구현 한 것입니다.
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int num = 1; num <= 10; num++)
                Console.WriteLine("num: {0}", num);
        }
    }
}
결과:
num: 1
num: 2
num: 3
num: 4
num: 5
num: 6
num: 7
num: 8
num: 9
num: 10
계속하려면 아무 키나 누르십시오 . . .

예제를 보시면 바로 for문이 등장하고 있습니다. for문의 실행흐름을 보자면 이렇습니다.

초기식 -> 조건식 -> 코드 실행 -> 증감식 -> 조건식 -> 코드 실행 -> 증감식 -> ...

우선은 초기식에 num이란 변수가 선언되고 1이란 값으로 초기화됩니다. 이 초기식은 단 한 번만 실행되며, 여기서 선언된 num이란 변수는 for문이 끝나면 알아서 소멸합니다. 그다음에 조건식을 거칩니다. num이 10보다 작거나 같으면 조건을 만족하고 코드 실행부로 넘어갑니다. 그다음 코드가 실행되고 증감식으로 넘어가 num의 값이 1만큼 증가한 뒤에 다시 조건식으로 돌아와 검사하고 코드가 실행되고 증감식으로 넘어가는 걸 반복하죠. 그러다 조건을 만족하면 for문을 빠져나오는 것입니다. 이해되셨죠?

4. foreach(순회하며 차례대로 접근~)

아직은 foreach문을 이해하시기에는 문제가 있을 수 있습니다. foreach문을 배우려면 배열과 컬렉션을 알아야 하기 때문이죠. 이 부분을 건너뛰어 배열과 컬렉션을 배우시게 될 때 참고하셔도 좋습니다. 그러나 굳이 지금 이해하고 싶다고 하시는 분들은 말리지 않겠습니다.

우리가 여태까지 배운 변수는 하나의 값만 저장할 수 있었습니다. 하지만 지금 보게 될 배열은 동일한 성격의 변수들이 일렬로 서있다고 생각하시면 됩니다. 간단히 변수 여러 개를 한곳에 가져다가 붙였다고 생각합시다. 여기서 그만, 배열은 나중에 알아보도록 하고 foreach의 설명을 이어가도록 하겠습니다.

기본적인 foreach문의 형태는 아래와 같습니다.
foreach (변수 in 배열 혹은 컬렉션) {
    // 실행될 코드
}
아래는 foreach문의 이해를 돕기위해 작성된 예제입니다.
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 5, 7, 4, 9, 8, 10, 4, 7, 11 };

            foreach (int i in arr)
                Console.WriteLine("i: {0}", i);
        }
    }
}
결과:
i: 1
i: 2
i: 5
i: 7
i: 4
i: 9
i: 8
i: 10
i: 4
i: 7
i: 11
계속하려면 아무 키나 누르십시오 . . .

코드와 결과를 번갈아 보아하니, 14행에 등장하는 foreach문은 배열에 담겨있는 각각의 데이터를 순회하면서 변수 i에 집어넣습니다. 그 전에 9행을 보시면 int에 []가 붙고 괄호 내에 데이터들이 각각 콤마를 기준으로 하여 등장합니다. 여기서 각각의 데이터들을 '요소'라고 부릅니다. 나중에 다차원 배열도 함께 배우는데 이 다차원 배열에서도 foreach문이 사용될 수 있습니다.

5. 반복문의 중첩

우리가 지금까지 배운 while, for, do~while문은 if문 처럼 중첩이 가능합니다. for문 안에 for문이 사용될 수도 있고, for문 내에 while문이 사용될수도 있습니다. 상황에 따라서는 for문이 3번 이상 중첩될 수 있죠. 그중에서 많이 쓰이는 중첩이 for문의 중첩입니다.
for(...; ...; ...) {
    for(...; ...; ...) {
        ...
    }
}
다음은 for문을 두 번 사용하여 구구단을 출력시키는 예제입니다
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int a = 2; a < 10; a++)
            {
                for (int b = 1; b < 10; b++)
                {
                    Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
                }
            }
        }
    }
}
결과:
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
...
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
계속하려면 아무 키나 누르십시오 . . .

단 for문을 두 번만 사용하였을 뿐인데 반복을 72번 수행하여 그 많던 구구단을 단번에 출력시켰습니다. 이렇게, 중첩을 잘 사용하면 더욱더 편하게 프로그램을 제작할 수 있습니다.

이제 그만 반복문에 대한 강좌는 여기서 마치도록 하겠습니다. 수고하셨습니다.

다음 강좌에서는 무한 루프, continue, break, goto에 대해서 알아보도록 하겠습니다.