분기문이란 프로그램의 흐름을 조건에 따라 여러 갈래로 나누는 흐름 제어 구문이다.
C#에서는 if 문과 switch 문, 이렇게 두 가지 분기문을 제공한다.
if, else, else ififif 문은 조건식이 true 면 if 문 뒤에 따라오는 코드가 실행되고, 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("홀수");
}
}
}
짝수
elseif 문과 함께 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 ifif 문과 함께 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 식을 이용하면 더 간단하게 바꿀 수 있다.
switch 문에서 조건식을 switch 키워드 앞으로 옮긴다.case : 를 => 로 바꾼다.break; 문은 불필요하다., 로 구분한다.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+