if와 else
int hp = 100;
bool isDead = (hp <= 0);
if (isDead)
{
Console.WriteLine("You ard Dead!");
}
if는 만약이라는 뜻으로 소괄호 안에 조건(isDead)을 넣어주는 형태로 사용된다. 만약 플레이어가 죽은 상태라면 if (isDead)가 실행되어 해당 영역의 중괄호 { }영역의 내용이 모두 수행된다. 그렇지만 살아있다는 코드를 만든다면 어떻게 해야할까? 지금까지 배운 방법을 사용한다면 아래와 같을 것이다.
int hp = 100;
bool isDead = (hp <= 0);
if (isDead)
{
Console.WriteLine("You ard Dead!");
}
else
{
Console.WriteLine("You ard Alive!");
}
/*
if (isDead == false)
{
Console.WriteLine("You ard Alive!");
}
사용되지 않음.
*/
그렇지만 이렇게 본다면 딱 보아도 무엇인가 깔끔해보이지 않은다. 따라서 위와 같은 코드를 사용하지 않고 if 문과 짝을 지어서 사용하는 else를 사용한다. 만약 if 문 안의 내용이 부합한다면 if문 안의 내용을 사용하고, 그렇지 않으면 else 부분을 실행하는 문법이다.
만약 가위/바위/보 게임을 만든다고 하자. 그러면 우리가 학습한 방식으로는 아래와 같이 코드를 짤 수 있다.
int choice = 0; // 0 : 가위, 1 : 바위, 2 : 보
if (choice == 0)
{
Console.WriteLine("가위입니다.");
}
if (choice == 1)
{
Console.WriteLine("바위입니다.");
}
if (choice == 2)
{
Console.WriteLine("보입니다.");
}
그러나 이러한 코드는 비효율적이다. 왜냐하면 우리가 낸 가위바위보는 3개중의 하나일 테인데, 가위를 내었다고 가정을 한다면 if (choice == 0) 코드 덕분에 이미 가위인 것을 알 수 있다. 따라서 뒤의 모든 코드들은 확인할 필요가 논리적으로 없다. 그러나 위와같이 if를 반복적으로 사용한다면 이미 choice가 0인 것을 알고있음에도 불구하고 choice 가 1인지, 2인지 계속 확인하게 된다. 따라서 아래와 같이 코드를 작성한다.
int choice = 0; // 0 : 가위, 1 : 바위, 2 : 보
if (choice == 0)
{
Console.WriteLine("가위입니다.");
}
else if (choice == 1)
{
Console.WriteLine("바위입니다.");
}
else
{
Console.WriteLine("보입니다.");
}
위와 같은 코드를 사용한다면 if (choice == 0) 코드 덕분에 choice가 가위인 것을 알기 떄문에 나머지 로직을 실행하지 않아 비용 절감을 할 수 있다. 또한 else if는 하나만 사용할 수 있는 것이 아니라 여러개 사용할 수 있다.
Switch
그렇지만 if 문을 보면 choice == 1와 같이 비교 연산을 계속해서 이용하는 문제가 있다. 따라서 이러한 문제를 해결하기 위한 switch문이 있다. switch(n)의 인자값으로는 정수와 문자를 넣을 수 있다.
int choice = 0;
switch (choice)
{
case 0:
Console.WriteLine("가위");
break;
case 1:
Console.WriteLine("바위");
break;
case 2:
Console.WriteLine("보");
break;
default:
Console.WriteLine("다 실패");
break;
}
break; 문법을 사용하지 않으면 사용하는 case 문 부터 아래로 모두 실행된다. 따라서 해당 case만 실행 시킬것이라면 break를 반드시 명시해야 한다. 또한 switch 문으로 표현한 형식은if - else 문으로도 표혈할 수 있지만, 이 반대는 항상 성립되는 것이 아니다. 생각해보면 당연하다. switch는 값에 따른 분기에만 한정되기 떄문이다. 따라서 값이 적고, 간단한 경우 swich를 사용하고 그렇지 않은 복잡한 경우 if-else문을 사용한다.
상수와 열거형
가위 바위 보를 만들다 보니 0, 1, 2를 이용해서 사용하기 때문에 헷갈릴 수 있다. 또한 나중에 0을 가위가 아닌 바위로 바꾼다면 모든 값을 다 바꿔야 하므로 이러한 방법은 좋지 않은 방법이다. 따라서 이러할 때 사용하는 열거형을 사용한다.
enum Choice
{
Rock, // 0
Paper, // 1
Scissors // 2
// 아무 값도 입력하지 않으면 0부터 시작하여 1씩 증가한다.
}
static void Main(string[] args)
열거형을 사용하면 상수의 값을 가지게 되어 의미를 알기 쉽다. 또한 연관되어 있는 것들을 하나의 열거형(enum)으로 묶기 때문에 그룹화를 할 수 있는 장점이 있다. 마지막으로 상수 및 변수가 많아지면 이름이 중복되는 문제가 생기는데, 서로 다른 열거형에 속하면 이름이 동일해도 서로 다른것으로 간주되어 이름 중복 현상을 방지할 수 있다.
또한 열거형은 내부적으로 정수가 저장되며, 값이 입력되지 않을 경우 0부터 시작하여 0, 1, 2, 3과 같이 저장된다. 하지만 사용자가 원하는 방법으로 직접 값을 명시할 수 있다.
while
while문 반복문이며 ~까지 라는 영문 뜻을 가지고 있다. if문과 마찬가지로 while ()에 소괄호 내의 조건을 만족하면 반복하는 개념이다. 그렇지만 값이 참인 동안에는 무한대로 실행하는 문법이다. 예를 들어 Hello World를 5번 출력하라고 한다고 하면 지금까지 학습한 방법으로는 아래와 같이 사용할 수 있다.
Console.WriteLive("Hello World");
Console.WriteLive("Hello World");
Console.WriteLive("Hello World");
Console.WriteLive("Hello World");
Console.WriteLive("Hello World");
그렇지만 Hello World를 3894번 반복한다고하면 3894번을 다 위와같이 복사할 순 없을 것이다. 그래서 등장한 것이 반복문이다. while 반복문을 이용해 5번 반복한다고 하면 아래와 같이 사용할 수 있다.
int count = 5;
while (count > 0)
{
Console.WriteLive("Hello World");
count--;
}
그렇지만 위와 같이 사용할 경우 카운트의 값이 감소되지 않으므로 무한대로 반복한다. 따라서 count 값을 후위 감소 연산자를 이용하여 값을 감소시켜주어 5번만 반복할 수 있게 설정한다. 이처럼 무한대로 반복하는 현상을 무한 루프라고 하는데에 이 현상이 게임에 적용된다면 크러쉬가 일어나서 게임이 종료된다. 그러므로 조건을 아주 중요하게 설정해야 한다.
이와 유사한 문법으로 do ~ while문이 있지만, 현업에서도 잘 사용되지 않는다. 그렇지만 이러한 문법이 있다는 것을 알아야하고, 이를 통해 다른 사람이 작성한 코드도 확인할 줄 알아야한다.
for
while 문의 단점은 조건을 정상적으로 신경쓰지 않으면 무한루프에 빠지는 문제가 발생할 수 있어서 사용에 유의해야 한다. 그래서 나온 기능이 for문이다.
for (초기식; 조건식; 반복식)
{
}
for문은 초기식, 조건식, 반복식으로 나뉘어져서 사용하는데 어려울 수 있다. 그렇지만 while문에 이미 사용했던 내용을 그대로 사용하면 된다.
int count = 5;
while (count > 0)
{
Console.WriteLive("Hello World");
count--;
}
for (int i = 0; i < 5; i++)
{
}
while 문에서 사용했던 count를 i로 변경해서 0의 값을 주면 그것이 초기식이 되고, 5번 반복을 지정해야 하는 count--는 i가 0에서 5까지 반복하라는 i < 5로 대체될 수 있다. 마지막으로 값을 감소시키는 것이 아닌 증가시키는 연산자인 후위 연산자를 통해 for문을 while문 처럼 사용할 수 있다. for 문을 처음 사용할 때에는 많이 헷갈릴 수 있으므로, 자주 사용해서 익히는 것이 매우 중요하다.
break, continue
for 문을 사용하다보면 우리는 특정 상황에서 해당 반복문을 종료시키고 싶을 때에가 있다. 이럴 때에 사용하는 것이 break 문법이다. 예를 들어 for 문을 1000번 반복하는 상황에서 사용자가 10이라는 값을 입력했을 때 종료시키고 싶다면 사용자는 0번부터 1000번까지 랜덤한 곳에서 10을 입력한다. 하지만 10을 입력했음에도 불구하고 값은 1000번 동안 계속 반복해서 입력 받아야하기 때문에 for문을 종료시킬 수 없다. 따라서 이 때에 break 문을 사용하여 해당 반복문을 멈추고 빠져 나갈 수 있다.
for (int i = 0; i < 1000; i++)
{
Console.Write("숫자를 입력하세요: ");
int input = int.Parse(Console.ReadLine());
Console.WriteLine(input);
if (input != 10) // 10이 아니면 계속 값을 입력받는다.
{
Console.ReadLine();
}
else // 10이면 종료
{
break;
}
}
반면 Continue는 반복문을 멈추고 빠져나가는 것이 아닌 다음으로 넘어가는 문법이다.
for (int i = 0; i < 100; i++)
{
if (i % 3 == 0)
{
continue;
}
Console.WriteLine($"3으로 나뉘는 숫자 발견 {i}");
}
위와 같이 i % 3으로 나눈 나머지의 값이 0이 아니라면 건너뛰는 방식을 통해 3의 배수의 값을 구할 수 있다.
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 1-3-1. TextRPG : 디버깅 기초, 직업, 플레이어/몬스터 생성, 전투 (0) | 2023.08.02 |
---|---|
★ Part 1-2-2. 코드의 흐름 제어 : 함수, ref, out (0) | 2023.08.02 |
Part 1-1-2. 데이터 : 형변환, 스트링 포맷, 산술 연산, 비교 연산, 논리 연산 (0) | 2023.07.27 |
Part 1-1-1. 데이터 : 데이터 형식, 변수, 정수 형식, 2진수, 10진수, 16진수, 정수 범위 (0) | 2023.07.26 |
Part 1. C# 기초 프로그래밍 입문 (0) | 2022.11.13 |