if문
조건을 지정하고 지정한 조건에 맞는 경우 코드를 실행한다. 여러가지 경우를 따로 지정할 수 있고, 조건에 맞는 경우와 그렇지 않은 경우, 이렇게 하나의 집합과 여집합으로 나누어 실행한다. 조건은 위에서 아래로 순차적으로 확인하기 때문에 다음 조건이 부분집합인 경우는 무시될 수도 있다. 여러 분기를 나누어야할 때는 조건의 순서를 잘 생각해서 구성해주어야한다. if문으로 조건을 나누다 보면 난잡하고 읽기 어려운 코드가 되기도 한다. 코드를 짜기 전에 조건을 먼저 잘 나누면 복잡한 if문을 간단하게 줄일 수도 있다.
using System;
public class Product
{
public string name;
public int price;
public Product(string Name, int Price)
{
name = Name;
price = Price;
}
}
class program
{
static void Main()
{
Product toy = new Product("toy", 2000);
Product game = new Product("game", 1500);
int dragonmoney = 2400; // 용돈이 2400원 있다.
if (dragonmoney >= 3500) Console.WriteLine($"Buy {toy.name} and {game.name}.");
else if (dragonmoney >= 1500) Console.WriteLine($"Buy {game.name}.");
// 장난감을 살 수 있지만 1500 이상인 경우를 먼저 확인하기 때문에 게임을 먼저 산다.
else if (dragonmoney >= 2000) Console.WriteLine($"Buy {toy.name}.");
// 게임을 먼저 사버렸기 때문에 이 코드에는 진입하지 않는다.
else Console.WriteLine("Buy nothing.");
}
}
// 결과
// Buy game.
버그의 원인이 될 수도 있지만 이걸 잘 이용하면 예외에 접근하지 않도록 하거나 효율적인 코드를 만드는데에 도움이 되기도 한다.
while문
주어진 조건이 맞지 않을 때 까지 계속 반복한다. 조건을 먼저 확인하고 코드를 실행한다. 코드를 먼저 실행하고 조건을 확인하도록 하려면 do{ } while( ) 문을 사용한다. 반복 중에 코드를 멈추고 빠져나와야한다면 중간에 if문을 통한 진입부를 만들어서 break 키워드를 사용해 빠져나올 수 있다.
using System;
class program
{
static void Main()
{
int birth = 1985;
int year = 2022;
int age = 0;
while (birth <= year) // birth 값이 year 값 이하라면 아래의 코드를 반복한다.
{
birth++; // birth 1 증가
age++; // age 1 증가
}
if (age > 1) Console.WriteLine($"You are {age} years old.");
else Console.WriteLine($"You are {age} year old.");
}
}
// 결과
// You are 38 years old.
1985부터 1씩 증가하기 때문에 다음 표와 같이 값이 변화한다.
birth | 1986 | 1987 | 1988 | ... | 2018 | 2019 | 2020 | 2021 | 2022 |
age | 1 | 2 | 3 | ... | 33 | 34 | 35 | 36 | 37 |
출력된 age 값이 38인 이유는 2022가 된 순간 다시 조건을 확인하는데 여전히 조건에 맞기 때문에 한번 더 코드를 실행하게 되기 때문이다. 이 때 birth 값은 1 증가한 2023, age 값은 1 증가한 38이 되고, 다음 루프에 birth > year 이 되면서 조건에 맞지 않게 되기 때문에 루프를 탈출한다. 따라서 age 값은 37이 아닌 38로 출력된다. 항상 마지막 반복이 언제인지 잘 생각하며 조건을 부여해야한다. 만약 이 코드에서 while 문의 조건이 birth < year 이었다면 37 이 출력된다.
while 문은 진입하면서 조건을 확인하고 실시 여부를 결정한다. 만약 조건없이 최소 한번은 실행해야하는 코드를 작성한다면 do 키워드를 사용한다. 이 경우는 일단 코드에 진입하고 조건을 확인해 반복 여부를 결정한다.
for문
while문에서 데이터가 연속적으로 바뀌며 조건을 확인하는 경우, for문을 사용하면 불필요한 데이터 변경을 따로 작성할 필요가 없다. 조건을 부여하면서 동시에 특정 값의 변화를 지정할 수 있다. for문에는 기본적으로 3가지 요소가 함께 지정된다. 변수, 조건, 데이터의 변화다. 간단한 수식으로 반복 횟수를 지정하는 것 부터 복잡한 연산을 반복하는 것도 가능하다. for문 역시 도중에 반복을 중단하려면 진입 조건을 만들고 break 키워드를 사용하면 된다.
using System;
class program
{
static void Main()
{
int power = 1;
Console.Write("Base is ");
int N = int.Parse(Console.ReadLine());
Console.Write("Power is ");
int X = int.Parse(Console.ReadLine());
for(int i = 0; i < X; i++)
// 새로운 변수 i는 0이다.
// i가 X보다 작다면 다음 코드를 실행한다.
// 매 반복마다 i를 1씩 증가시킨다.
{
power *= N;
}
Console.WriteLine($"{N}^{X} = {power}");
}
}
변수와 조건, 변화를 더 정교하게 설정하면 단순한 '몇 회 반복'이 아니라 복잡한 규칙의 반복도 가능하다.
추가
for문의 변수, 조건, 변화 부분은 생략할 수 있다. for( ; ; ) { 이하 코드 } 이런 형태로 만들어진 코드는 무한 반복문이다. 일부만 생략할 수도 있으며 동시에 여러 변수를 선언할 수도 있다.
if, while, for문 안에서 선언된 인스턴스들은 반복을 마칠 때 사라진다. (정확히는 메모리 상에는 남아있지만 접근할 수 없다.) 따라서 반복문을 마치고 어떤 값을 유지하려면 해당 구문보다 더 높은 차원에서 인스턴스를 생성해야한다.
if문은 ? : 연산자를 사용해 간소화할 수 있다. (조건) ? (참) : (거짓) 형식을 취한다. 예를 들어 A와 B의 시험점수를 비교 했을 때 결과를 출력하려면 A > B 인 경우, A < B 인 경우, A = B 인 경우로 나눌 수 있다.
using System;
class program
{
static void Main()
{
int A = 80;
int B = 90;
Console.WriteLine(A > B ? "A win" : A < B ? "B win" : "Draw");
// 이중 ? 조건문이다. A > B 를 먼저 확인하고 참인 경우 "A win"을 출력,
// 거짓인 경우 A < B 를 확인하고 참인경우 " B win", 거짓인 경우 "Draw"를 출력한다.
}
}
// 결과
// B win
적절하게 사용하면 코드를 간소화할 수 있지만 잘못하면 가독성을 크게 떨어트릴 수 있다.