NGMsoftware

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

    학습


    C# 13. C# 흐름 제어의 선택문. (Flow Control, Selection Statement)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 연속해서 흐름 제어에 대해서 알아보고 있는데요. 프로그래밍에 있어서 가장 중요하다고 할 수 있는 선택문에 대해서 알아보도록 하겠습니다. 인생도 어떤 선택의 연속이듯이 현실 세계를 가상의 공간에서 구현하는 프로그램 또는 소프트웨어도 선택에 의해 처리가 분기되며 이런 연속적인 선택에 의해 결과를 만들어 냅니다.

     

    C#에서의 선택문은 특정 조건이 true인지 여부에 따라 프로그램 제어를 특정 위치로 옮기는 행위를 말하며, 이러한 행위를 조작할 수 있는 키워드들은 다음과 같습니다.

     

    1. if~else

    if문은 Boolean식의 값을 기준으로 실행할 문을 선택합니다. 다음 예제에서는 사용자가 입력한 조건에 따라 분기를 따라가며 각 분기마다 정해진 메시지를 사용자에게 출력하고 있습니다.

    using System;
     
    namespace IfElse
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                Console.Write("숫자를 입력하세요. : ");
                string input = Console.ReadLine();
                int number = Int32.Parse(input);
     
                if (number < 0)
                    Console.WriteLine("음수");
                else if (number > 0)
                    Console.WriteLine("양수");
                else
                    Console.WriteLine("0");
     
                if (number % 2 == 0)
                    Console.WriteLine("짝수");
                else
                    Console.WriteLine("홀수");
            }
        }
    }

     

     

    괄호안의 식이 true가 되면 else는 실행하지 않고 구문을 벗어납니다. 여러개의 조건에 따라 분기하려면 else if와 같이 사용할 수도 있습니다. 경우에 따라서는 { }를 사용하여 블록에 문을 포함시켜 여러 문을 중첩해서 조건부로 실행할 수 있습니다.

     

    if와 else if를 사용하면 문의 확장이라 부르며, if { if }문 안에 중첩해서 조건문을 사용하면 중첩문이라고 합니다. 용어의 정의를 알아야 상호 대화에 있어서 상대의 의도를 정확하게 이해하고 받아들어야 나중에 문제가 발생하지 않게 됩니다.

     

     

    2. switch~case~default

    switch문은 제어를 본문 내의 case문 중 하나로 전달하여 다중 선택 및 열거형을 처리하는 제어문입니다. 사실 if~else만 알아도 모든 선택문을 처리할 수 있습니다. 다만, 효율 및 가독성이라는 측면에서 switch는 좋은 성능을 냅니다. 아래의 예제를 통해 자세하게 알아보도록 하겠습니다.

    using System;
     
    namespace Switch
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                Console.Write("요일을 입력하세요.(일,월,화,수,목,금,토) : ");
                string day = Console.ReadLine();
     
                switch (day)
                {
                    case "일":
                        Console.WriteLine("Sunday");
                        break;
                    case "월":
                        Console.WriteLine("Monday");
                        break;
                    case "화":
                        Console.WriteLine("Tuesday");
                        break;
                    case "수":
                        Console.WriteLine("Wednesday");
                        break;
                    case "목":
                        Console.WriteLine("Thursday");
                        break;
                    case "금":
                        Console.WriteLine("Friday");
                        break;
                    case "토":
                        Console.WriteLine("Saturday");
                        break;
                    default:
                        Console.WriteLine("{0}는(은) 요일이 아닙니다.", day);
                        break;
                }
            }
        }
    }

     

     

    제어는 스위치의 값과 일치하는 case문으로 전달됩니다. 스위치문에 포함할 수 있는 case인스턴스의 수에는 제한이 없지만 두개의 case문이 같은 값을 가질 수는 없습니다. 본문은 선택한 문에서 시작하여 break문이 제어를 case문 밖으로 전달할 때까지 계속 실행됩니다. 추가로, 스위치 값과 일치하는 case식이 없으면 선택적 요소인 default레이블이 제어를 넘겨받게 됩니다. 만약, default가 없다면 스위치문은 종료됩니다. 또한, 이 case에서 메서드를 종료하려면 break대신 return을 사용할수도 있습니다.

     

    아래 코드는 Java에서는 사용할 수 없고 C#에서만 허용되는 문법입니다. goto와 break를 생략하므로써 제어를 그룹화 할 수 있습니다. 이 방식은 독특한데 비슷한 의미를 전달하고자 할 때 유용하게 사용할 수 있습니다.

    using System;
     
    namespace Switch
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                switch (args[0])
                {
                    case "copy":            //...            
                        break;
                    case "move":            //...            
                        goto case "delete";
                    case "del":
                    case "remove":
                    case "delete":      //...            
                        break;
                    default:            //...            
                        break;
                }
            }
        }
    }

     

     

    Java에서 goto는 구현되지 않은 예약어입니다. 그러나, break 또는 continue와 함께 레이블을 사용하면 goto와 유사한 결과를 얻을 수 있습니다. 하지만, C#처럼 자유롭지는 않습니다. 제약이 많죠. 그리고 엄밀히 말하면 goto와 break label, continue label은 다르게 동작합니다.

     

    C#에서는 goto를 사용하여 레이블이 있는 문으로 이동할 수 있습니다. 그러나 특정 레이블로 이동하기 위해서는 goto문이 레이블의 범위 내에 있어야 합니다. 즉, try~catch문에서 finally블록을 종료하거나 클래스 바깥으로 이동하거나 블록 바깥으로 이동할 수는 있지만, 문 블록으로 건너뛰는 데는 goto를 사용할 수 없습니다. goto는 OOP(개체 지향 프로그래밍) 방식에 부합하지 않으므로 대부분의 경우 사용하지 않는 것이 좋습니다.

     

    다음 시간에~

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

    댓글목록

    등록된 댓글이 없습니다.