Quick Syntax
여러 조건을 순서대로 고를 때는 if / else if / else, 값 하나를 고를 때는 ?:, 실패를 먼저 끝낼 때는 guard clause를 씁니다. &&/||만 오른쪽 평가를 건너뛰며, 조건에는 bool 값이 필요합니다.
if (score >= 90)
grade = "A";
else if (score >= 80)
grade = "B";
else
grade = "C";
// 단순 이진 선택은 삼항 연산자가 더 짧다
string label = isActive ? "활성" : "비활성";
// 실패를 먼저 끝내고, &&로 오른쪽 호출을 안전하게 묶음
if (order is null) return;
bool canStart = isReady && TryStart();문법
어떤 분기 형태가 있나
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)
{
// ...
}부작용이 있는 메서드(로그 출력, 상태 변경 등)를 조건식 오른쪽에 두면 예상치 못한 시점에 실행되지 않을 수 있으므로 주의가 필요합니다.
&와 |는 bool 피연산자에도 쓸 수 있지만 양쪽을 모두 평가합니다. bitwise 연산 또는 양쪽 검사가 반드시 필요한 경우가 아니라면 null guard와 조건 조합에는 &&/||를 사용합니다.
bool Check(string label)
{
Console.WriteLine(label);
return false;
}
_ = Check("left") && Check("right"); // left만 출력
_ = Check("left") & Check("right"); // left, right 모두 출력대입과 null 비교의 경계
대입식도 값을 반환하므로 if (enabled = true)는 컴파일되고 항상 true가 됩니다. 비교가 의도였다면 ==를 쓰되, reference null 확인에는 user-defined == overload를 피하는 is null/is not null이 더 직접적입니다.
bool enabled = false;
if (enabled = true) { } // ❌ 대입: enabled가 true가 됨
if (user is null) return; // null pattern: == overload를 호출하지 않음
if (user.IsAdmin) GrantAccess();가드 클로즈로 중첩 줄이기
조건이 중첩될수록 "실제 로직"이 점점 오른쪽으로 밀립니다. 실패 조건을 먼저 검사하고 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 |
| 중첩이 깊어질 때 | 조건을 메서드로 분리 |
주의할 점
=(대입)과 ==(비교)를 혼동하면 조건식이 의도와 다르게 true가 될 수 있습니다. else가 어느 if에 붙는지 애매한 중첩은 중괄호를 써서 고정합니다.
조건문이 5단계 이상 중첩된다면 설계를 다시 검토할 신호입니다. 가드 클로즈, 별도 메서드 추출, 또는 switch expression으로 평탄화하는 방법을 먼저 시도해 보세요.
참고 링크
1 sources