if 문은 조건이 참일 때만 코드 블록을 실행합니다. else if는 검사를 더하고, else는 검사에 걸리지 않은 나머지를 모두 받습니다.
출력:
Order 120: shipping 0
Order 75.50: shipping 4.99
Order 20: shipping 9.99
조건은 위에서 아래로 검사되고 처음으로 참인 조건이 이깁니다. 120짜리 주문은 >= 100에 걸려서 >= 50 검사까지 가지 않으며, 그래서 가장 구체적인 조건을 먼저 둡니다. else if는 별도의 키워드가 아니라 본문이 또 다른 if인 else이므로, C#에는 elseif나 elif가 없습니다.
조건은 bool이어야 합니다
C#은 숫자, 문자열, 객체를 절대 참이나 거짓으로 취급하지 않습니다. 괄호 안의 식은 bool 타입이어야 합니다:
int count = 3;
if (count) // error CS0029: Cannot implicitly convert type 'int' to 'bool'
if (count > 0) // correct
if (name) // error: a string is not a bool either
if (name != null) // correct
이 규칙은 0, "", null이 조용히 거짓으로 취급되는 C와 JavaScript의 버그 무리를 통째로 없애 줍니다. 대가는 매번 비교를 직접 써야 한다는 것인데, 덕분에 다음 사람에게 의도가 보이기도 합니다.
&&, ||, !로 조건 조합하기
&&(and), ||(or), !(not)는 불리언 검사를 조합합니다. &&와 ||는 단락 평가를 합니다. 오른쪽은 왼쪽이 답을 아직 정하지 못했을 때만 실행됩니다.
출력:
maya: welcome
invalid or banned account
invalid or banned account
omar: age 9 rejected
invalid or banned account
null 호출이 안전한 것은 단락 평가 덕분입니다. username != null이 false가 되면 username.Length는 평가되지 않으므로 NullReferenceException이 없습니다. 순서를 username.Length >= 3 && username != null로 바꾸면 같은 호출이 죽습니다.
&&는 ||보다 강하게 결합하므로 a || b && c는 a || (b && c)라는 뜻입니다. 둘을 섞을 때는 항상 괄호를 추가하세요. 컴파일러에게는 필요 없지만 읽는 사람에게는 필요합니다. 한 글자 &와 |도 bool에 쓸 수 있지만 항상 양쪽을 평가합니다. 오른쪽에 반드시 일어나야 하는 부수 효과가 있을 때만 쓰세요.
중괄호와 한 문장 규칙
분기에 문장이 하나뿐이면 중괄호는 선택입니다. 중괄호가 없으면 들여쓰기가 어떻든 다음 한 문장만 if에 속합니다:
출력:
Reorder email sent
Stock: 12
재고가 충분한데도 "Reorder email sent"가 출력됩니다. 들여쓰기와 상관없이 두 번째 WriteLine은 if 밖에 있습니다. if (x == null) return; 같은 한 줄짜리 보호 조건은 중괄호 없이도 괜찮지만, 두 번째 줄이 생길 수 있는 곳에는 중괄호를 붙이세요.
관련된 버그로 조건 바로 뒤의 세미콜론이 있습니다. if (stock < 5);는 빈 문장으로 if를 끝내고, 뒤따르는 블록은 조건 없이 실행됩니다. 컴파일러는 경고 CS0642 Possible mistaken empty statement로 알려 주며, 오류로 취급할 가치가 있습니다.
조건에서의 =와 ==
=는 대입하고, ==는 비교합니다. 대부분의 타입에서는 실수로 =를 쓰면 컴파일되지 않습니다. 대입의 결과는 대입된 값이고 int는 bool이 아니기 때문입니다:
int score = 10;
if (score = 100) { } // error CS0029: Cannot implicitly convert type 'int' to 'bool'
bool 변수라면 대입 자체가 bool이므로 오타가 컴파일됩니다:
출력:
Access granted
isAdmin is now True
조건이 isAdmin을 덮어쓴 뒤 새 값을 검사했습니다. 컴파일러가 경고(CS0665, 조건식 안의 대입은 항상 상수)하지만 빌드는 성공합니다. bool에는 비교를 아예 생략하세요. if (isAdmin)과 if (!isAdmin)이 더 읽기 좋고 이런 식으로 잘못 칠 수 없습니다.
중첩 if와 보호 절
중첩이 한 단계 늘 때마다 읽는 사람이 머릿속에 담아야 할 조건이 하나 늘어납니다. 각 검사가 잘못된 입력을 거부하는 것이라면, 정상 경로를 모든 검사 안에 중첩하지 말고 일찍 반환하세요:
출력:
ordered 2 x keyboard
error: no product
error: quantity must be positive
error: insufficient balance
같은 메서드를 중첩으로 쓰면 if가 세 단계가 되고, 실제 작업은 가장 안쪽 블록에, 세 개의 else 분기는 아래쪽에서 풀려 나갑니다. 보호 절을 쓰면 각 규칙이 오류 메시지 바로 옆에 있고 마지막 줄이 정상 경우입니다. 루프 안에서는 continue로 같은 방식을 쓸 수 있습니다.
조건 안에서 변수 선언하기
조건은 if 안에서 범위를 갖는 변수를 선언할 수 있습니다. 흔한 형태는 TryParse 메서드의 out var와 is 타입 패턴 두 가지입니다:
출력:
42: positive number 42
abc: not a number
-7: number -7, not positive
string of length 5
TryParse는 잘못된 입력에 예외를 던지지 않고 false를 반환하므로 if와 자연스럽게 어울립니다. 파싱 메서드는 형 변환 페이지에서 자세히 다룹니다.
다른 것을 써야 할 때
- 두 값 중 하나 고르기: 조건 연산자
condition ? a : b가 양쪽 분기에서 대입하는if보다 짧습니다. - 한 값에 대한 많은 분기:
switch문은 값을 상수 case와 비교하며, 열 줄의else if보다 훑어보기 쉽습니다. - 값을 결과에 대응시키기: 분기끼리 데이터만 다르다면
Dictionary조회가 긴 체인을 대체합니다.
자주 묻는 질문
C#에서 else if는 어떻게 쓰나요?
else if를 두 단어로 씁니다: if (a) { ... } else if (b) { ... } else { ... }. 조건은 위에서 아래로 검사되고 처음으로 참인 분기만 실행되므로, 가장 구체적인 검사를 먼저 두세요. elif나 elseif 키워드는 없습니다.
C#에서 if (count)라고 쓸 수 없는 이유는 무엇인가요?
C#의 조건은 bool 타입이어야 합니다. C나 JavaScript와 달리 int, 문자열, 객체는 절대 true나 false로 변환되지 않으므로 if (count)는 CS0029 Cannot implicitly convert type 'int' to 'bool'로 실패합니다. 의도한 검사를 쓰세요: if (count > 0)이나 if (name != null).
if 조건에서 &&와 &의 차이는 무엇인가요?
&&는 단락 평가를 합니다. 왼쪽이 false이면 오른쪽은 평가되지 않으며, 그래서 s != null && s.Length > 0이 안전합니다. 두 bool에 쓴 &는 매번 양쪽을 평가합니다. ||와 |도 마찬가지입니다. 오른쪽의 부수 효과가 필요한 경우가 아니라면 조건에는 &&와 ||를 쓰세요.
C#의 if 문에 중괄호가 꼭 필요한가요?
아니요. 중괄호가 없으면 if는 정확히 한 문장만 제어합니다. 두 번째 줄을 들여 써도 분기에 포함되지 않으며, 이는 전형적인 버그의 원인이라서 대부분의 스타일 가이드가 모든 분기에 중괄호를 권장합니다.
C#에서 if else를 한 줄로 쓸 수 있나요?
값을 고를 때는 조건 연산자를 쓰세요: string label = score >= 50 ? "pass" : "fail";. 문장을 실행할 때는 if (x) DoA(); else DoB();를 한 줄에 쓰는 것도 올바른 코드이지만, 중괄호 블록보다 읽기 어렵고 확장하기도 어렵습니다.