숏컷 코드
if (score >= 90)
grade = "A";
else if (score >= 80)
grade = "B";
else
grade = "C";
// 단순 이진 선택은 삼항 연산자가 더 짧다
string label = isActive ? "활성" : "비활성";문법
어떤 분기 형태가 있나
C#에서는 보통 아래 세 가지를 먼저 씁니다.
if (score >= 90) grade = "A";
if (isReady)
Start();
else
Wait();
string label = isActive ? "활성" : "비활성";- 순차 분기:
if / else if / else - 두 값 중 하나 선택: 삼항 연산자
?: - 실패 조건을 먼저 끊기: 가드 클로즈
조건식은 반드시 bool이어야 한다
C#은 C/C++과 달리 if (count) 같은 정수 조건을 허용하지 않습니다. 0이 거짓, 비-0이 참으로 동작하는 암묵적 변환이 없으므로, 항상 명시적 비교를 써야 합니다.
// ❌ 컴파일 오류 (C#은 int를 bool로 암묵 변환하지 않음)
if (count) { }
// ✅
if (count > 0) { }
if (items.Any()) { }단락 평가 (short-circuit evaluation)
&& 는 왼쪽이 false이면 오른쪽을 평가하지 않습니다. || 는 왼쪽이 true이면 오른쪽을 평가하지 않습니다. 이 특성을 활용해 null 안전 검사를 자연스럽게 이어 쓸 수 있습니다.
// user가 null이면 오른쪽 IsAdmin은 평가되지 않아 NullReferenceException 방지
if (user != null && user.IsAdmin)
{
// ...
}부작용이 있는 메서드(로그 출력, 상태 변경 등)를 조건식 오른쪽에 두면 예상치 못한 시점에 실행되지 않을 수 있으므로 주의가 필요합니다.
가드 클로즈로 중첩 줄이기
조건이 중첩될수록 "실제 로직"이 점점 오른쪽으로 밀립니다. 실패 조건을 먼저 검사하고 early return하는 가드 클로즈(guard clause) 패턴이 더 읽기 쉬운 경우가 많습니다.
// ❌ 중첩이 깊어지는 구조
void Process(Order order)
{
if (order != null)
{
if (order.IsValid)
{
if (order.Items.Count > 0)
{
// 실제 로직
}
}
}
}
// ✅ 가드 클로즈: 실패 조건을 먼저 처리
void Process(Order order)
{
if (order is null) return;
if (!order.IsValid) return;
if (order.Items.Count == 0) return;
// 실제 로직이 들여쓰기 없이 바로 온다
}삼항 연산자 (?:)
두 값 중 하나를 선택해 대입할 때 if/else보다 간결합니다. 단, 중첩 삼항은 빠르게 읽기 어려워지므로 피하는 편이 좋습니다.
// ✅ 단순 선택
string status = isOnline ? "온라인" : "오프라인";
// ❌ 중첩 삼항 — if/else if/else가 더 명확
string grade = score >= 90 ? "A" : score >= 80 ? "B" : "C";체크포인트
| 상황 | 권장 구조 |
|---|---|
| 조건이 2개 이상인 순차 분기 | if / else if / else |
| 두 값 중 하나를 선택 | 삼항 연산자 ?: |
| 값 기반 다중 분기 | switch expression |
| 실패 조건 먼저 처리 | 가드 클로즈 + early return |
| 중첩이 깊어질 때 | 조건을 메서드로 분리 |
주의할 점
=(대입)과 ==(비교)를 혼동하면 조건식 자체가 컴파일되지 않거나, 의도와 다른 결과가 나옵니다. 특히 nullable 타입이나 상수 비교에서 자주 실수합니다.
조건문이 5단계 이상 중첩된다면 설계를 다시 검토할 신호입니다. 가드 클로즈, 별도 메서드 추출, 또는 switch expression으로 평탄화하는 방법을 먼저 시도해 보세요.
참고 링크
1 sources