NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 14. C# 흐름 제어의 반복문. (Flow Control, Iteration Statement)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 흐름 제어의 마지막인 반복문에 대해 알아보겠습니다. 지금까지 예제에서 사용된 do, for, foreach, while이 이에 해당합니다. 반복문을 이용하여 루프를 만들고, 루프의 종료 기준에 따라 포함문을 여러번 실행할 수 있습니다. 반복문은 점프문이 있는 경우를 제외하고 순서대로 실행됩니다.

     

    1. Do

    do문은 while에 지정된 식이 false가 될 때까지 { }로 묶인 하나의 문 또는 문 블록을 반복하여 실행합니다.

    using System;
     
    namespace While
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                int i = 10;
                do
                {
                    Console.WriteLine("a) i : {0}", i--);
                } while (i > 0);
     
                do
                {
                    Console.WriteLine("b) i : {0}", i--);
                } while (i > 0);
            }
        }
    }

     

     

    do~while 루프는 while문과 달리 조건식이 계산되기 전에 한번 실행됩니다. do~while블록 내의 모든 위치에서 break문을 사용하여 루프를 벗어날 수 있고, continue문을 사용하여 while식 계산 문을 직접 단계별로 실행할 수도 있습니다. 식이 true면 루프의 첫번째 문에서 실행이 계속됩니다. 식이 false면 do~while 루프 다음의 첫번째 문에서 실행이 계속됩니다. 반복문에서 goto, return 또는 throw(예외 처리문)문을 사용하여 종료할 수도 있습니다.

     

    2. While

    while문은 지정된 식이 false가 될 때까지 하나의 문 또는 문 블록을 반복합니다. 각 루프를 실행하기 전에 while식을 테스트하기 때문에 while루프는 0번 이상 실행됩니다. 이는 한번 이상 실행되는 do~while와 다른 부분입니다.

    using System;
     
    namespace While
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                int i = 10;
                while (i > 0)
                {
                    Console.WriteLine("i : {0}", i--);
                }
            }
        }
    }

     

     

    break, goto, return 또는 throw(예외 처리문)문이 제어를 루프 밖으로 전달할 때 while루프를 종료할 수 있습니다. 루프를 종료하지 않고 다음 반복실행으로 제어를 전달하려면 continue문을 사용합니다. 만약, 무한으로 반복하면서 특정 루틴을 처리 하려면 아래 예제처럼 만들수도 있습니다.

    using System;
    namespace InfiniteWhile
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                int i = 0;
                while (true)
                    Console.WriteLine(i++);
            }
        }
    }

     

     

    3. For

    우리가 가장 흔하게 사용하는 반복문입니다. for루프는 지정된 식이 false가 될 때까지 하나의 문 또는 문 블록을 반복하여 실행합니다. for루프를 사용하면 쉽게 배열을 반복하고 순차적으로 처리할 수 있습니다. 아래의 예제를 통해서 for문이 어떻게 동작하는지 순서를 확인할 수 있습니다.

    using System;
    namespace ForSequence
    {
        class MainApp
        {
            public static int Init() { Console.WriteLine("초기자"); return 0; }
            public static int Comp() { Console.WriteLine("비교"); return 5; }
            public static int Inc(int i) { Console.WriteLine("반복"); return ++i; }
            static void Main(string[] args)
            {
                for (int i = Init(); i < Comp(); i = Inc(i))
                    Console.WriteLine("NG");
            }
        }
    }

     

     

    for문은 하나 또는 여러개의 포함된 문을 다음의 순서대로 반복하여 실행합니다.

    1. i 변수의 초기 값이 계산됩니다.

    2. i의 값이 Comp보다 작거나 같으면 true가 되고 Console.WriteLine문이 실행되어 i가 다시 계산됩니다.

    3. i가 Comp보다 크면 조건은 false가 되고 제어가 루프 밖으로 전달되며 for문은 종료됩니다.

     

     

    for문은 루프를 실행하기 전에 조건식을 테스트하므로 0번 이상 실행됩니다. 만약, for문을 이용하여 무한 루프를 작성하려면 아래와 같이 작성할 수 있습니다.

    using System;
    namespace InfiniteFor
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                int i = 0;
                for (; ; )
                    Console.WriteLine(i++);
            }
        }
    }

     

     

    어떤 x, y와 같은 식 또는 위치(좌표)를 계산할 때는 for문을 중첩해서 사용할 수도 있습니다.

    using System;
    namespace ForFor
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                for (int x = 0; x < 5; x++)
                {
                    for (int y = 0; y <= x; y++)
                    {
                        Console.Write("*");
                    }
     
                    Console.WriteLine("");
                }
            }
        }
    }

     

     

    4. Foreach

    foreach문은 배열이나 System.Collections.IEnumerable 또는 System.Collections.Generic.IEnumerable<T> 인터페이스를 구현하는 개체 컬렉션에 있는 각 요소에 대해 포함문 그룹을 반복하여 실행합니다. foreach문은 컬렉션을 반복 실행하여 원하는 정보를 얻는 용도로 사용할 수 있지만 예측할 수 없는 부작용을 방지하면서 소스 컬렉션의 항목을 추가하거나 제거하는 용도로는 사용할 수 없습니다. 소스 컬렉션에서 항목을 추가하거나 제거해야 한다면 for루프를 사용해야 합니다. 만약, foreach에서 요소가 추가되거나 제거되면 System.InvalidOperationException을 발생시킵니다.

    using System;
    namespace ForEach
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                int[] arr = new int[] { 0, 1, 2, 3, 4 };
                foreach (int a in arr)
                {
                    Console.WriteLine(a);
                }
            }
        }
    }

     

     

    배열 또는 컬렉션의 각 요소에 대해 포함문이 계속 실행됩니다. 컬렉션의 모든 요소에 대해 해당문이 계속 실행된 후에 제어가 foreach블록 다음 문으로 전달됩니다. foreach 블록의 모든 위치에서 break를 사용해서 루프를 벗어나거나 continue를 사용하여 루프의 다음 반복으로 제어를 전달할수도 있습니다. 다른 루프와 마찬가지로 foreach도 goto, return 또는 throw문을 사용하여 종료할 수 있습니다.

     

    가독성 및 변수에 할당하는 Index에서 발생할 수 있는 오류들을 감안하면 foreach를 사용하는게 좋습니다. 하지만 속도가 중요하다면 가급적 내부에서 변수를 초기화한 후 for문으로 처리하는게 좋습니다. foreach와 for문의 테스트에서 약 3배정도 속도차이가 있다고 하니 많은 양의 배열 또는 컬렉션이라면 for문을 이용하는게 더 좋을 수 있습니다.

     

    다음 시간에~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.