
주어진 조건의 결과를 통해 실행할 동작을 나누는 것을 의미합니다.
조건문에는 조건을 판별할 대상, 그리고 판별하기 위한 식이 필요합니다.

위와 같이 고속도로에서 차량의 높이에 따라 통행할 수 있는 도로를 구분하는 "높이제한"이 이와같은 구성이 잘 되어있다고 볼 수 있습니다.
차량의 높이인 Height가 판별할 대상이 되며, Go Gate "Under 4.5m" 과 같이 어느 게이트로 갈 지 정해주어서 가도록(Go) 지시하는
것이 실행할 동작이 됩니다.

C#에서는 조건문을 사용하기 위한 구문으로 크게 if-else, switch-case의 2가지 형태로 제공하고 있습니다.
가장 기본적인 형태의 조건문입니다. 사용법은 아래와 같습니다.
if(조건)
{
//조건이 참일때 실행할 동작
}
else
{
//조건이 거짓일때 실행할 동작
}
기본적으로 if문의 괄호 안에는 조건이 나오는데, 조건은 그 결과가 true 또는 false로 나오는 것만 가능합니다. 예를들어 자동차의 높이를 H라 가정하고, 자동차 객체를 car 이라고 하면, 자동차의 높이는 car.Height가 됩니다. 그런데 이 값 만으로는 조건이 될 수 없고, 이 값이 무엇과 같은지, 혹은 무엇보다 크거나 작은지를 묻는 문장이 되어야 합니다.
따라서 car.H만 쓰지않고, car.Height == 5 혹은 car.Height < 5 와 같이 ==, <과 같은 연산자와 맨뒤의 비교값 까지 포함하여 '조건' 이라 합니다. 여기서 ==, < 과 같은 것을 '비교연산자' 라고 합니다.

이때 아래와 같은 비교연산자들이 있습니다.

각 연산자들의 의미는 아래와 같습니다.
== : 왼쪽이 오른쪽과 같은 경우
!= : 왼쪽이 오른쪽과 다른 경우
<= : 왼쪽이 오른쪽보다 작거나 같은 경우
< : 왼쪽이 오른쪽보다 작은 경우
>= : 왼쪽이 오른쪽보다 크거나 같은 경우
> : 왼쪽이 오른쪽보다 큰 경우
한편, 결과가 true 또는 false가 나온다 라는 말에 집중해보면
Car.Height == 4 자체가 값을 반환한다고 생각할 수 있습니다. 맞습니다. C#에서는 아래와같이 작성하면
bool isCarHeight = car.H == 4;
// 오른쪽의 조건이 참이면 isCarHeight 은 true가 됨.
// 오른쪽의 조건이 참이면 isCarHeight 은 false가 됨.
이렇게 true나 false가 변수에 저장됩니다. 그래서
isCarHeight = car.H == 4;
if(isCarHeight)
으로 써도 됩니다.
그리고 if문은 조건의 결과에 따라 분기를 2개로만 나누지않고, 첫 번째 분기가 거짓인경우 다음 분기에서 또 조건을 걸어서 분기를 나눌 수 있습니다.

if(조건1)
{
//조건 1이 참일 때 수행
}
else if (조건2)
{
//조건 1은 거짓인데 2는 참일 때 수행
}
else if (조건3)
{
//조건 1, 2는 거짓인데 3은 참일 때 수행
}
…
else
{
//모든 조건이 거짓일때
}
여기서 조건1을 만족하지 않으면, 다음 분기인 조건2를 판별하게 됩니다. 여기서 통과되면 조건2의 코드를, 그렇지않으면 다음 분기인 조건3을 판별합니다. 이런식으로 판별을 하다가 모든 조건을 만족하지 않으면 맨 아래에 있는 else의 행위를 실행하게 됩니다. 이때, if-else 문의 경우 else if없이 if 한개만으로도 사용할 수 있으며,
else없이 if와 else if 로만 구성해도 사용할 수 있습니다.
답안
using System;
namespace Part1_5_1_ifElse
{
internal class Program
{
static void Main(string[] args)
{
//문자열 입력받기
Console.Write("문자열 1개 입력 : ");
string input = Console.ReadLine();
//조건문
if(input == "기둥")
{
Console.WriteLine("기둥입니다.");
}
else if (input == "계단")
{
Console.WriteLine("계단입니다.");
}
else
{
Console.WriteLine("기둥이나 계단이 아닙니다");
}
//종료 방지용
Console.Write("------\n");
Console.Write("문자열 입력 시 종료 : ");
Console.ReadLine();
}
}
}
그다음으로 볼 것이 다중조건입니다.
조건1 && 조건2 : 조건1과 조건2가 모두 true이면 true
조건1 || 조건2 : 조건1과 조건2 중 하나이상 true이면 true
if(a > 5 && a < 10) : a가 5보다 크고 10보다 작을 때 true
if(str == "기둥" || str == "계단) : str이 "기둥"이거나 "계단일 때" true
이렇게 조건 여러개를 한 조건문 안에 묶을 수 있습니다.
예제2) 문자열 1개를 입력받고, "기둥" 이나 "계단"이면, "구조"를 출력하고 둘다 아니면 "구조가 아님"을 출력하는 코드를 작성하시오. (문자열 입력받기 : string a = Console.ReadLine();)
using System;
namespace Part1_5_2_MultipleCondition
{
internal class Program
{
static void Main(string[] args)
{
//문자열 입력받기
Console.Write("문자열 1개 입력 : ");
string input = Console.ReadLine();
//조건문
if (input == "기둥" || input == "계단")
{
Console.WriteLine("구조");
}
else
{
Console.WriteLine("구조가 아님");
}
//종료 방지용
Console.Write("------\n");
Console.Write("문자열 입력 시 종료 : ");
Console.ReadLine();
}
}
}
예제3) 임의의 정수를 하나 입력받고, 0 이하이거나 1000이상이면 "범위 초과"를 출력하고, 0보다 크고 1000 이하이면 자릿수를 표현하는 코드를 작성하시오. 이때 입력받은 값이 정수가 아니거나 음수이면 "올바르지 않은 값 입력" 입니다를 출력하도록 하시오.
정수인지 검사하는 코드는 아래를 참고하시오.
string input;
int a;
bool result = int.TryParse(input, out a);
//result : 정수로 변환에 성공하면 true를 반환하고 a에 그 값을
// 정수로 저장하고, 그렇지 않으면 false 를 반환함)
Sol.
using System;
namespace Part1_5_3_MultipleBranch
{
internal class Program
{
static void Main(string[] args)
{
//문자열 입력받기
Console.Write("정수 1개 입력 : ");
string input = Console.ReadLine();
//정수인지 검사
int a;
bool isInt = int.TryParse(input, out a);
if(isInt)
{
if (0 < a && a < 10)
{
Console.WriteLine("자릿수 : 1");
}
else if (10 <= a && a < 100)
{
Console.WriteLine("자릿수 : 2");
}
else if (100 <= a && a < 1000)
{
Console.WriteLine("자릿수 : 3");
}
else
{
Console.WriteLine("범위 초과");
}
}
else
{
Console.WriteLine("올바르지 않은 값 입력");
}
//종료 방지용
Console.Write("------\n");
Console.Write("문자열 입력 시 종료 : ");
Console.ReadLine();
}
}
}
2). Switch-case
특정 값 자체를 비교하는 것으로, 조건 대신 값을 인자로 받아 해당 값이 어떤값과 같은지를 기준으로 분기를 나누는 구문입니다.
switch (판단할 값)
{
case 값1:
실행할코드
break;
case 값2:
실행할코드
break;
…
default:
실행할코드
break;
}
이렇게 해당 값이 무엇인지에 따라 실행할 코드를 분기시킬 때 사용합니다. 단, 각 분기에서 각 분기의 실행을 마칠 수 있도록 break;를 명시해야 합니다. default는 생략을 할 수 있습니다.
(타 언어에서는 break;가 없으면 바로 다음분기로 순차적으로 실행하는 경우가 있지만, C#은 break;를 꼭 모든 분기에서 명시해야 합니다.)
조건문은 상황에 따라 if-else보다 switch-case가 더 적합할 때도 있습니다. 앞서 진행했던 예제1번의 경우 사실 switch-case를 사용할 경우 더 코드가 간결하고 가독성이 좋아집니다.
switch(input)
{
case "기둥":
Console.WriteLine("기둥입니다");
Break;
case "계단":
Console.WriteLine("계단입니다");
Break;
default:
Console.WriteLine("기둥이나 계단이 아닙니다.");
}
if-else와 switch-case는 판단하고자 하는 조건에 맞춰 적절한걸로 선택하여 사용하시면 됩니다.
예제4) 문자열 1개를 입력받았을 때 아래의 종이의 크기를 출력하는 코드를 작성하시오. 단 switch-case문을 이용하여 작성하시오. 아래의 문자열 외(A1, A2, A3, A4가 아닌 경우)의 값을 입력받으면 "잘못된 입력값"을 출력하시오
참고 : 종이크기
1) "A4" : "210x297"
2) "A3" : "297x420"
3) "A2" : "420x594"
4) "A1" : "594x841"
Sol
using System;
namespace Part1_5_5_SwitchCasePractice
{
internal class Program
{
static void Main(string[] args)
{
//문자열 입력받기
Console.Write("종이크기 입력 : ");
string input = Console.ReadLine();
//분기설정
switch (input)
{
case "A4":
Console.WriteLine("210x297");
break;
case "A3":
Console.WriteLine("297x420");
break;
case "A2":
Console.WriteLine("420x594");
break;
case "A1":
Console.WriteLine("594x841");
break;
default:
Console.WriteLine("잘못된 입력값");
break;
}
//종료 방지용
Console.Write("------\n");
Console.Write("문자열 입력 시 종료 : ");
Console.ReadLine();
}
}
}