NGMsoftware

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

    학습


    C# 12. C# 흐름 제어의 점프문. (Flow Control, Jump Statement)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 정말 오랫만에 C#기초에 대해서 글을 쓰네요. 오늘은 프로그래밍의 꽃이라 할 수 있는 흐름 제어에 대해서 알아보도록 하겠습니다.

     

    요즘 프로그래머를 구하는 곳이 많지 않죠. 불과 몇년 전만해도 골라서 갈 수 있었는데요. 지금은 불러만주면 "감사합니다."하고 가야 합니다. 또 문제는 급여가 역주행하고 있다는겁니다. 보통 물가 상승율에 따라 월급이 오르자나요? 하지만 지금 프로그래머 프리랜서 단가는 하락하고 있습니다. 뭐 시장 경제의 수요와 공급의 원칙에 따라서 정해지고 있겠지만, 한편으로는 안타까운 마음이 듭니다. (중간 인력 업체들이 많아지긴 했지만...)

     

    Java와 비교하여 이 내용을 보시면 좋을듯 합니다. 아래 링크는 Java의 흐름 제어와 점프문에 대한 설명입니다.

    Java의 흐름 제어와 점프문. ]

     

    1. Break

    콘솔 프로젝트를 하나 추가한 후 다음과 같이 코딩합니다. 이 콘솔 프로그램을 실행하면, 사용자에게 계속 진행할지 물어보고, "Y"를 입력하면 같은 질문을 반복합니다. "N"을 입력하면 이 콘솔 프로그램은 종료하게 됩니다.

    using System;
    
    namespace Break
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                while (true)
                {
                    Console.Write("Do you want to continue?(Y/N) : ");
                    string answer = Console.ReadLine();
                    if (answer.Equals("N"))
                        break;
                }
            }
        }
    }

     

     

    Break는 점프문입니다. 자신이 속한 가장 가까운 바깥쪽 루프(while, for, foreach와 같은 반복문) 또는 switch문을 종료하는 역할을 합니다. 종료된 문 뒤에 다른 문이 있는 경우 제어가 해당 문으로 전달됩니다. 위의 예제에서 사용자의 입력에 따라 문을 종료할지 판단하게 됩니다.

     

    Switch에서 사용하는 방법은 다음과 같습니다.

    using System;
    
    namespace Break
    {
        class Switch
        {
            static void Main(string[] args)
            {
                Console.Write("Enter your selection (1, 2, or 3): ");
                string s = Console.ReadLine();
                int n = Int32.Parse(s);
                switch (n)
                {
                    case 1:
                        Console.WriteLine("Current value is {0}", 1);
                        break;
                    case 2:
                        Console.WriteLine("Current value is {0}", 2);
                        break;
                    case 3:
                        Console.WriteLine("Current value is {0}", 3);
                        break;
                    default:
                        Console.WriteLine("Sorry, invalid selection.");
                        break;
                }
            }
        }
    }

     

     

    2. Continue

    continue문은 해당 문이 포함된 바깥쪽 반복문의 다음 반복으로 제어를 전달합니다. 아래 예제를 보면 쉽게 이해할 수 있습니다. 짝수는 건너뛰고 홀수만 Console창에 찍어주게 됩니다.

    using System;
    
    namespace Break
    {
        using System;
        namespace Continue
        {
            class MainApp
            {
                static void Main(string[] args)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        // Even skips                
                        if (i % 2 == 0)
                            continue;
    
                        Console.WriteLine("{0} : Odd", i);
                    }
                }
            }
        }
    }

     

     

    3. Goto

    goto문은 프로그램의 제어를 레이블이 정의된 위치로 직접 전달합니다. 일반적으로 goto는 switch문에서 특정 case나 기본 레이블로 제어를 전달하는데 사용합니다. goto문은 depth가 많은 루프를 벗어나는 경우 유용하게 사용할 수 있습니다. 다만 OOP의 사상과 맞지 않기 때문에 MS에서는 goto문의 사용을 권장하지는 않습니다.

     

    아래는 특정 조건에 부합할 때 중첩된 루프에서 벗어나기 위한 예제입니다.

    using System;
    namespace Goto
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                Console.Write("종료 조건(숫자)을 입력하세요 :");
                String input = Console.ReadLine();
                int input_number = Convert.ToInt32(input);
                int exit_number = 0;
    
                for (int i = 0; i < 2; i++)
                {
                    for (int j = 0; j < 2; j++)
                    {
                        for (int k = 0; k < 3; k++)
                        {
                            if (exit_number++ == input_number)
                                goto EXIT_FOR;
                            Console.WriteLine(exit_number);
                        }
                    }
                }
    
                goto EXIT_PROGRAM;
            EXIT_FOR:
                Console.WriteLine("\nExit nested for...");
            EXIT_PROGRAM:
                Console.WriteLine("Exit program...");
            }
        }
    }

     

     

    위의 예제에서 중첩된 반복문은 12번을 실행합니다. 만약, 사용자가 12보다 큰 값을 입력한다면 "Exit nested for..."메시지는 볼 수 없습니다.

     

    4. Return

    점프문의 마지막인 return입니다. return문은 자신이 속한 메서드의 실행을 종료하고 호출한 메서드로 제어를 반환합니다. 선택적 값을 반환할 수도 있습니다. void형식(반환값이 없는)의 메서드인 경우 return문을 생략할 수 있습니다.

    using System;
    
    class ReturnTest
    {
        static double CalculateArea(int r)
        {
            double area = r * r * Math.PI;
            return area;
        }
        static void Main(string[] args)
        {
            int radius = 5;
            double result = CalculateArea(radius);
            Console.WriteLine("The area is {0:0.00}", result);
        }
    }

     

     

    위의 결과는 반지름으로 입력받은 값의 원둘레를 구하는 공식입니다. NG Framework의 WaferMap컨트롤 만들기에 보면 원을 가지고 그림을 그리기 위한 몇가지 공식이 있습니다. 추가로, 위의 공식은 원의 둘레를 구하기 위해 파이를 곱해줍니다. 원주율은 원의 지름 길이에 대한 원둘레 길이의 비입니다. 따라서 지름(radius * 2) * 3.14(π)를 통해 실제 원의 둘레를 알 수 있게 됩니다.

     

    꼭 알고 넘어가야 할 내용이 하나 더 있습니다. 우리가 의례 사용하고 있는 try~catch~finally구문에서 점프문은 선택적 finally를 벗어날 수 없다는 것입니다. 여기에서는 간단하게 점프문은 finally를 벗어날 수 없다는 것만 외우고, 실제 try~catch에 대해서 알아볼 때 한번 더 다루도록 하겠습니다.

    w5IkBy0.gif

     

     

    다음 시간에...

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

    댓글목록

    등록된 댓글이 없습니다.