갈림길을 정하는 것은 bool 하나다
여기까지 쓴 코드는 전부 위에서 아래로 한 줄씩 실행됐습니다.
Console.WriteLine("첫 번째");
Console.WriteLine("두 번째");
Console.WriteLine("세 번째");
적힌 순서 그대로 세 줄이 나옵니다. 아무 문법도 쓰지 않으면 프로그램은 직선 한 줄입니다.
흐름을 바꾸는 방법은 두 가지뿐입니다. 갈라지거나, 되돌아가거나.
흐름을 바꾸는 방법은 두 가지뿐이다
왼쪽이 조건문(if, switch), 오른쪽이 반복문(while, for)입니다.
이 글은 왼쪽만 다룹니다.
if 는 이렇게 생겼다
갈라지기를 맡는 문법이 if 입니다. 생김새는 세 부분입니다.
실제로 값을 넣어 보면 이렇습니다.
int hp = 30;
if (hp <= 50)
{
Console.WriteLine("체력이 낮습니다");
}
hp 가 30이니 조건이 참이고, 블록 안이 실행됩니다.
hp 가 80이었다면 블록은 건너뛰고 아래로 지나갑니다.
거짓일 때 할 일이 따로 있으면 else 를 붙입니다.
if (hp <= 50)
{
Console.WriteLine("체력이 낮습니다");
}
else
{
Console.WriteLine("아직 괜찮습니다");
}
else 에는 괄호가 없습니다. 물어볼 것이 없기 때문입니다.
위의 if 가 거짓이었다는 사실이 이미 조건입니다.
여기서 자주 나오는 실수가 하나 있습니다. 괄호 뒤에 세미콜론을 찍는 것입니다.
if (hp <= 50); // 여기 세미콜론
{
Console.WriteLine("체력이 낮습니다");
}
세미콜론 하나로 if 는 그 자리에서 끝나 버립니다.
아래 중괄호는 if 와 아무 상관 없는 블록이 되어 항상 실행됩니다.
컴파일은 됩니다. 경고 한 줄만 나오고 넘어갑니다.
괄호 안은 결국 값 하나로 줄어든다
그럼 괄호 안에는 무엇을 넣을 수 있을까요.
앞 글에서 식은 값 하나만 남을 때까지 줄어든다고 했습니다.
if 의 괄호 안도 똑같은 식입니다. 다만 남는 값의 타입이 정해져 있습니다.
그 값의 타입이 bool 입니다. true 아니면 false, 둘뿐입니다.
C# 은 조건 자리에 bool 말고 다른 것을 허용하지 않습니다.
int n = 1;
if (n) // 컴파일 에러: int 를 bool 로 바꿀 수 없습니다
{
}
C 계열의 오래된 언어들은 0 을 거짓, 나머지를 참으로 봤습니다.
그래서 if (n == 1) 을 쓰려다 = 를 하나 빠뜨려 if (n = 1) 이라고 적어도
그대로 컴파일됐습니다. 대입한 값 1 이 참으로 읽혀서 조건은 늘 참이 되고,
n 은 조용히 바뀝니다.
C# 은 조건 자리를 bool 로 막아서 이 실수를 컴파일 단계에서 잡습니다.
둘 중 하나만 실행된다
이제 실제로 갈라지는 코드입니다.
두 가지가 보입니다.
한쪽은 아예 실행되지 않습니다. 건너뛴 줄은 느려지는 것이 아니라 지나가지도 않습니다. 둘 다 조금씩 실행되는 일은 없습니다.
갈라진 길은 아래에서 다시 합쳐집니다. if 는 흐름을 영원히 나누는 것이 아니라
잠깐 갈랐다가 되돌려 놓습니다. 블록이 끝나면 다시 한 줄입니다.
else 를 안 쓰면 거짓일 때 아무 일도 없다
else 는 필수가 아닙니다.
if (score >= 60)
{
Console.WriteLine("합격");
}
Console.WriteLine("확인 끝");
score 가 40이면 출력은 확인 끝 한 줄뿐입니다.
불합격이라고 알려주는 코드가 어디에도 없으니까요.
else 는 조건의 반대편이 아니라 남은 전부입니다.
위에서 걸리지 않은 모든 경우가 여기로 옵니다.
중괄호는 생략할 수 있지만 쓰는 편이 낫다
블록이 한 줄이면 중괄호를 뺄 수 있습니다.
if (isReady)
Start();
문제는 나중입니다. 한 줄을 더 붙이는 순간 이렇게 됩니다.
if (isReady)
Start();
Log("시작함"); // if 와 상관없이 항상 실행됩니다
들여쓰기는 사람이 보라고 있는 것이고, 컴파일러는 들여쓰기를 보지 않습니다.
중괄호가 없으면 if 에 딸린 것은 바로 다음 문장 하나뿐입니다.
처음부터 중괄호를 쓰면 이 실수가 생길 자리가 없습니다.
조건이 길어지면 이름을 붙인다
조건은 그냥 bool 값입니다. 변수에 담을 수 있다는 뜻입니다.
if (age >= 19 && !isStudent && hasTicket && !isBanned)
{
Enter();
}
bool canEnter = age >= 19 && !isStudent && hasTicket && !isBanned;
if (canEnter)
{
Enter();
}
두 코드는 하는 일이 같습니다. 아래쪽은 읽는 사람이 if 한 줄만 보고
“들어갈 수 있으면 들어간다”를 알 수 있습니다.
조건이 왜 그런지가 궁금할 때만 위를 봅니다.
정리
- 아무 문법도 안 쓰면 코드는 위에서 아래로 한 줄씩입니다.
if (조건) { ... }가 기본형입니다. 괄호는 못 빼고, 괄호 뒤에 세미콜론을 찍으면 거기서 끝납니다.- 흐름을 바꾸는 방법은 갈라지기와 되돌아가기, 두 가지뿐입니다.
if의 괄호 안도 식입니다. 줄어들어서bool값 하나가 남습니다.- C# 은 조건 자리에
bool만 받습니다.if (n)은 컴파일 에러입니다. - 갈라진 두 길 중 한쪽만 실행되고, 블록이 끝나면 다시 한 줄로 합쳐집니다.
else를 안 쓰면 거짓일 때 아무 일도 일어나지 않습니다.- 중괄호를 빼면
if에 딸리는 것은 다음 문장 하나뿐입니다.