조건문이란?
조건에 따라 실행이 달라지게 할 때 사용하는 문장
조건문의 기본 틀은 아래와 같다
if(조건문) //조건문의 내용은 true/false로만 반환한다
{
(실행내용)
}
조건문의 내용이 참일 때 조건문 안의 실행내용이 실행되며, 거짓일 시 실행되지 않는다.
int exp = 150
int level = 1
if (exp>=100) // 경험치 통을 100으로 가정
{
level++;
Console.WriteLine("레벨업!!!");
exp -= 100;
}
아래와 같이 조건문을 추가할 수 있다.
if(조건문1) //조건문1이 참일 시 실행내용1을 실행하고 조건문이 종료된다.
{
(실행내용1)
}
else if(조건문2) //조건문1이 거짓이고, 조건문2가 참이면 실행내용2를 실행하고 조건문이 종료된다.
{
(실행내용2)
}
else //위 조건문들이 전부 거짓이면 실행내용3을 실행하고 조건문이 종료된다.
{
(실행내용3)
}
// 컴퓨터 : 가위를 낸다고 가정
Console.Write("가위! 바위! 보!!!! : ");
string playerChoise = Console.ReadLine();
if (playerChoise == "바위") // 플레이어가 바위를 냈을 경우
{
Console.ForegroundColor = ConsoleColor.Green; //글자색 변경
Console.WriteLine("이겼습니다!");
Console.ResetColor(); //글자색 초기화
}
else if (playerChoise == "가위") // 플레이어가 가위를 냈을 경우
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("비겼습니다!");
Console.ResetColor();
}
else if (playerChoise == "보") // 플레이어가 보를 냈을 경우
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("졌습니다!");
Console.ResetColor();
}
else // 가위바위보 외의 값이 입력되었을 경우
{
Console.WriteLine("잘못 입력했습니다.");
}
Console.WriteLine("게임 종료!");
*참고사항 : if 문에서 if 만 있어도 되고, else if와 else가 필수적으로 필요하지는 않다.
게임 프로그래밍을 할 때 if 문 안에 if 문을 넣는 방식을 권장하지는 않는다. (아도겐 코드)
다만 연산자와 조건문에 관한 퀴즈에서 아래와 같이 코드를 작성하였다.
<퀴즈>
1. 유저로부터 수를 하나 입력받습니다.
2. 만약 입력된 수가 2의 배수라면 '2의 배수입니다' 출력
3. 그렇지 않고, 3의 배수라면 '3의 배수입니다' 출력
4. 이것도 저것도 아니면 '2의 배수도, 3의 배수도 아닙니다' 출력
여기에서 조건을 좀 더 명확하게 분류하여,
와 같은 내용을 추가하여 코드를 작성하였다.
<오류가 발생하지 않는 최종 버전>
int inputNumber;
Console.WriteLine("정수를 입력해주세요");
bool isParsed = int.TryParse(Console.ReadLine(), out inputNumber);
if (isParsed) // 입력된 값이 정수일 시 안의 내용이 실행
{
if (inputNumber % 2 == 0 && inputNumber % 3 == 0)
{
Console.WriteLine("2의 배수이며 3의 배수입니다.");
}
else if (inputNumber % 2 == 0)
{
Console.WriteLine("2의 배수입니다.");
}
else if (inputNumber % 3 == 0)
{
Console.WriteLine("3의 배수입니다.");
}
else
{
Console.WriteLine("2의 배수도, 3의 배수도 아닙니다.");
}
}
else
{
Console.WriteLine("잘못 입력하였습니다.");
}
해당 코드를 완성하기 이전 발생한 오류를 고치는 과정에 관해 추가로 서술하고자 한다.
처음에 코드를 작성하였을 때 아래와 같이 작성하였다.
int inputNumber;
Console.WriteLine("정수를 입력해주세요");
bool isParsed = int.TryParse(Console.ReadLine(), out inputNumber);
if (inputNumber % 2 == 0 && inputNumber % 3 == 0)
{
Console.WriteLine("2의 배수이며 3의 배수입니다.");
}
else if (inputNumber % 2 == 0)
{
Console.WriteLine("2의 배수입니다.");
}
else if (inputNumber % 3 == 0)
{
Console.WriteLine("3의 배수입니다.");
}
// 2의 배수도, 3의 배수도 아닌 정수를 구별하는 부분을 원래 else if로 작성함
else if (isParsed == true)
{
Console.WriteLine("2의 배수도, 3의 배수도 아닙니다.");
}
else
{
Console.WriteLine("잘못 입력하였습니다.");
}
최종 버전과의 차이는 입력값이 정수이면서 2의 배수도, 3의 배수도 아닌 입력값을 판별하는 조건을
else if로 정리하였다는 것이다.
다만 위와 같이 코드를 작성하여 실행했을 때, 조건문의 내용은 문제 없이 실행되었으나 else로 입력된 부분이 정상출력되지 않았다.
정수가 아닌 다른 문자가 입력되었을 때 '잘못 입력하였습니다'가 출력되어야 하는데 제일 위의 조건 부분이 출력되는 것이었다.
이와 같은 문제가 왜 발생하는 지에 관해 곰곰이 생각해 보다가, TryParse가 false일 시 0을 출력한다는 사실을 떠올렸다.
만약 if (inputNumber % 2 == 0 && inputNumber % 3 == 0) 에서 inputNumber 자체가 처음부터 0으로 입력되었다면, 두 조건을 모두 부합하게 되므로 해당 조건문 부분이 실행되어 버리는 것이다.
그래서 TryParse 가 false일 시 변수에 어떤 숫자가 나오는지 확인해 보았다.
int number;
int.TryParse(Console.ReadLine(), out number);
Console.WriteLine(number);
해당 코드를 작성하여 실행하고, 문자열을 입력시 나오는 결과를 확인하였다.
false(0)으로 출력되었기 때문에, 0 % 2 == 0, 0 % 3 == 0 둘 다 만족해 버려서 문제가 발생했다는 것을 알게 되었다. 이에 따라 애초에 정수를 판별하는 조건이 isParsed가 true일 때만 실행되어야 한다는 내용이 필요하다는 걸 알게 되었다. 이는 2의 배수와 3의 배수 및 정수 판별 각각에도 적용해야 하므로, 결론적으로 isParsed가 true 일때만 정수에 대한 판별을 진행하도록 (if 문 - 입력 성공 여부) 안에 (if 문 - 정수 판별)을 넣는 방식으로 수정하였다.
if 문은 코드가 작성된 순서대로 조건을 확인하고 실행되도록 하기 때문에, 조건 순서에 유의하도록 한다.
<잘못된 조건 순서의 예시>
int score = 92;
if (score >= 0)
{
Console.WriteLine("브론즈입니다!");
}
else if (score >= 80)
{
Console.WriteLine("실버입니다!");
}
else
{
Console.WriteLine("골드입니다!");
}
위와 같이 코드를 작성하였을 때 양수인 어떤 숫자가 들어가도 맨 위의 score>=0의 조건이 제일 먼저 실행되기 때문에, 모든 점수가 브론즈로 출력된다.
그러므로 아래와 같이 if -> else if -> else 순으로 조건 범위가 커지게 되도록 작성한다
<조건 순서 수정 버전>
int score = 92;
if (score < 80)
{
Console.WriteLine("브론즈입니다!");
}
else if (score < 90)
{
Console.WriteLine("실버입니다!");
}
else
{
Console.WriteLine("골드입니다!");
}
조건문의 기본 틀은 아래와 같다.
Switch (변수)
{
case (조건1)
(실행내용1)
break;
case (조건2)
(실행내용2)
break;
default
(실행내용3)
break;
}
switch 조건문의 특징 및 사용 시 유의사항은 다음과 같다.
char key = 'a'
switch(key)
{
case 'w':
case 'W':
case 'ㅈ':
case 'ㅉ': // 이 넷 중 하나를 만족 시 실행됨
Console.WriteLine("위쪽으로 이동");
break;
}
switch를 썼었을 때 좀 더 편한 상황이 있기 때문에, if 말고도 사용을 한다.
다음과 같은 상황을 가정해보자
방향키 위쪽을 이동한다 했을 때, 동일한 키를 눌러도 w 일 수도 있고 W 일 수도 있고 ㅈ일 수도 있고 ㅉ 일 수도 있다
<if 문을 사용했을 시>
char key = 'a';
if (key == 'w')
{
Console.WriteLine("위쪽으로 이동");
}
else if (key == 'W')
{
Console.WriteLine("위쪽으로 이동");
}
else if (key == 'ㅈ')
{
Console.WriteLine("위쪽으로 이동");
}
else if (key == 'ㅉ')
{
Console.WriteLine("위쪽으로 이동");
}
<switch문을 사용했을 시>
switch(key)
{
case 'w':
case 'W':
case 'ㅈ':
case 'ㅉ':
Console.WriteLine("위쪽으로 이동");
break;
}
Switch문을 사용함으로서 코드를 보다 간단하게 표현할 수 있었다.
다만 if 와 Switch 상의 우열관계가 있는 것은 아니며, 상황에 따라 적절하게 사용하는 것이 중요하다.