분기문

분기문이란 프로그램의 흐름을 조건에 따라 여러 갈래로 나누는 흐름 제어 구문이다.

C#에서는 if 문과 switch 문, 이렇게 두 가지 분기문을 제공한다.


if, else, else if

if

if 문은 조건식이 trueif 문 뒤에 따라오는 코드가 실행되고, false 면 실행 되지 않는다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int a = 0;
            if (0 == (a % 2))
                Console.WriteLine("짝수");

            if (0 != (a % 2))
                Console.WriteLine("홀수");
        }
    }
}
짝수

else

if 문과 함께 else 절을 사용하면 조건식이 false 인 경우에도 처리할 수 있다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int a = 1;
            if (0 == (a % 2))
                Console.WriteLine("짝수");
            else
                Console.WriteLine("홀수");
        }
    }
}
홀수

else if

if 문과 함께 else if 절을 사용하면 if 문을 연속적으로 사용할 수 있다.

if (조건식1)
{
    실행문1;
}
else if (조건식2)
{
    실행문2;
}

만약 '조건식1'이 true 라면 '실행문1' 이 실행되고, if 문들은 건너뛰게 된다.

그러나 '조건식1'이 false 이고, '조건식2'가 true 라면 '실행문2'가 실행된다.

또한 else 문을 통해 조건식이 모두 거짓인 경우에도 처리할 수 있다.

if (조건식1)
{
    실행문1;
}
else if (조건식2)
{
    실행문2;
}
else
{
    실행문3
}

'조건식1'과 '조건식2'가 모두 false 라면 '실행문3'이 실행된다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int number = 12;

            if (number < 0) 
                Console.WriteLine("음수");
            else if (number > 0)
                Console.WriteLine("양수");
            else
                Console.WriteLine("0");

            if (0 == (number % 2))
                Console.WriteLine("짝수");
            else
                Console.WriteLine("홀수");
        }
    }
}
양수
짝수

중첩 if

if 문 안에 다른 if 문을 중첨해서 사용할 수도 있다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int number = 11;

            if (number > 0)
            {
                if (0 == (number % 2))
                    Console.WriteLine("0보다 큰 짝수.");
                else
                    Console.WriteLine("0보다 큰 홀수.");
            }
            else 
            {
                Console.WriteLine("0보다 작거나 같은 수");
            }
        }
    }
}
0보다 큰 홀수.

switch

switch 문은 조건식의 결과가 가질 수 있는 다양한 경우를 한 번에 평가하고 프로그램의 흐름을 가를 때 사용할 수 있다.

switch 문의 형식은 다음과 같다.

switch (제어식)
{
case A:                // 제어식의 값이 A이면 실행문1 이 실행됩니다.
        실행문1;
        break;
case B:                // 제어식의 값이 B이면 실행문2 가 실행됩니다.
        실행문2;
        break;
case C:                // 제어식의 값이 C이면 실행문3 이 실행됩니다.
        실행문3;
        break;
default:               // 일치하는 값이 없으면 실행문4 가 실행됩니다.
        실행문4;
        break;
}

switch 문은 switch 키워드로 시작하며, 괄호 안에 조건식을 입력받는다. 그리고 조건식이 어떤 switch 레이블 case : 의 패턴과 일치하는지를 검사하고, 그 레이블 아래에 있는 코드를 실행한다.

일치하는 제어식의 값을 찾이 못했다면 default 절이 실행된다. default 문은 생략될 수 있으며 마지막이 아닌 위치에 써주어도 상관없다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int number = 2;

            switch (number)
            {
                case 1:
                    Console.WriteLine("하나");
                    break;
                case 2:
                    Console.WriteLine("둘");
                    break;
                case 3:
                    Console.WriteLine("셋");
                    break;
                default:
                    Console.WriteLine("제가 아는 숫자는 1, 2, 3 뿐입니다.");
                    break;
            }
        }
    }
}

switch 문과 패턴 매칭

switch 레이블의 패턴에는 상수와 형식을 비롯해서 관계, 논리 등등 C#이 지원하는 다양한 패턴을 적용할 수 있다.

다음은 switch 문이 형식 패턴을 이용하여 데이터 형식에 따라 분기하는 코드이다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            object obj = null;
            int a = 123;
            obj = a; 

            switch (obj)
            {
                case int:
                    Console.WriteLine($"{(int)obj}는 int 형식입니다.");
                    break;
                case float:
                    Console.WriteLine($"{(float)obj}는 float 형식입니다.");
                    break;
                default:
                    Console.WriteLine($"{obj}(은)는 모르는 형식입니다.");
                    break;
            }

        }
    }
}
123는 int 형식입니다.

케이스 가드

케이스 가드 (Case Guard)란 switch 문의 case 절의 패턴을 더 구체적으로 만들어주는 추가적인 조건 검사이다.

케이스 가드는 case 절의 뒤에 when 절을 붙여 사용한다. when 절은 if 문 처럼 true, false 로 결과가 나오는 식을 입력받는다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            object obj = null;
            float a = -123.12f;
            obj = a; 

            switch (obj)
            {
                case int:
                    Console.WriteLine($"{(int)obj}는 int 형식입니다.");
                    break;
                case float f when f >= 0:
                    Console.WriteLine($"{(float)obj}는 양의 float 형식입니다.");
                    break;
                case float:
                    Console.WriteLine($"{(float)obj}는 음의 float 형식입니다.");
                    break;
                default:
                    Console.WriteLine($"{obj}(은)는 모르는 형식입니다.");
                    break;
            }
        }
    }
}
-123.12는 음의 float 형식입니다.

switch

switch 식은 분기를 거쳐 값을 내야 하는 경우에 사용할 수 있다.

다음의 switch 문은 점수에 따라 학점을 계산하는 코드이다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int score = 80;
            string grade = "";

            switch (score)
            {
                case 90:
                    grade = "A";
                    break;
                case 80:
                    grade = "B";
                    break;
                case 70:
                    grade = "C";
                    break;
                case 60:
                    grade = "D";
                    break;
                default:
                    grade = "F";
                    break;
            }

            Console.WriteLine(grade);
        }
    }
}
B

위 코드의 switch 문은 score 에 따라 분기를 수행하는데, 모든 case 절과 default 절에서 하는 일은 grade 에 등급별 학점을 저장하는것 뿐이다.

이러한 switch 문은 switch 식을 이용하면 더 간단하게 바꿀 수 있다.

  1. switch 문에서 조건식을 switch 키워드 앞으로 옮긴다.
  2. case :=> 로 바꾼다.
  3. break; 문은 불필요하다.
  4. 각 케이스는 콤마 , 로 구분한다.
  5. default_ 로 바꾼다.
using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int score = 80;
            string grade = score switch
            {
                90 => "A",
                80 => "B",
                70 => "C",
                60 => "D",
                _ => "F",
            };

            Console.WriteLine(grade);
        }
    }
}
B

switch 식에서도 케이스 가드를 이용한 추가적인 분기 처리가 가능하다.

using System;

namespace Branching_Statement
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int score = 90;
            bool repeated = true;
            string grade = score switch
            {
                90 when repeated == true => "B+",
                90 => "A",
                80 => "B",
                70 => "C",
                60 => "D",
                _ => "F",
            };

            Console.WriteLine(grade);
        }
    }
}
B+