C#의 삼항 연산자와 조건식
Source: Dev.to
번역하려는 전체 텍스트를 제공해 주시겠어요? 코드 블록과 URL은 그대로 두고, 본문만 한국어로 번역해 드리겠습니다.
1. Conditional (Ternary) Operator ?:
Σύνταξη
condition ? expressionIfTrue : expressionIfFalse;
Παράδειγμα
var status = isActive ? "Enabled" : "Disabled";
Ισοδύναμο με
string status;
if (isActive)
status = "Enabled";
else
status = "Disabled";
Πότε να το χρησιμοποιούμε
- ✔ 두 개의 간단한 선택이 있을 때
- ✔ 결과가 간단한 식일 때
- ✔ 가독성을 향상시킬 때
Πότε να το αποφεύσουμε
- ❌ 식이 복잡할 때
- ❌ 비즈니스 로직을 포함할 때
- ❌ 디버깅을 어렵게 만들 때
📚 Microsoft Documentation
2. Nested Ternary
var grade =
score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 70 ? "C" :
"Fail";
분석
하나의 표현식에서 여러 조건을 허용하지만, 가독성을 크게 감소시킵니다.
권장 사항
중첩 삼항 연산자 대신 switch 표현식을 선택하세요.
3. Null‑Conditional 연산자 ?.
NullReferenceException을 방지합니다.
var name = user?.Name;
의미: user가 null이 아니면 Name을 가져오고, 그렇지 않으면 null을 반환합니다.
동등한 코드
var name = user != null ? user.Name : null;
언제 사용하나요
- ✔ 중첩된 속성을 읽을 때
- ✔ null‑안전 접근이 필요할 때
📚 Microsoft 문서
Member access operators (?., ?[])
4. Null‑Coalescing Operator ??
var name = input ?? "Default";
input이 null이면 → "Default"를 반환합니다.
동등한 코드
var name = input != null ? input : "Default";
또는
string name;
if (input == null)
name = "Default";
else
name = input;
📚 Microsoft Documentation
5. Null‑Coalescing Assignment ??=
user.Name ??= "Guest";
변수가 null인 경우에만 값을 할당합니다.
a ?? b→a가null이 아니면a를 반환하고, 그렇지 않으면b를 반환합니다.a ??= b→a가null인 경우에만a에b를 할당합니다.
동등한 코드
if (user.Name == null)
{
user.Name = "Guest";
}
유용한 경우
- 지연 초기화
- 기본값 지정
- DTO 정규화
6. Throw Expressions (C# 7+)
우리는 throw를 expression 안에서 사용할 수 있습니다.
var user = dto.User
?? throw new ArgumentNullException(nameof(dto.User));
또는
var result = isValid
? value
: throw new InvalidOperationException();
생성자나 핸들러에서 가드 절에 이상적입니다.
📚 Microsoft Documentation
7. 패턴 매칭과 삼항 연산자
var name = obj is User u ? u.Name : "Unknown";
동등한 예시
User u;
if (obj is User)
{
u = (User)obj; // cast
name = u.Name;
}
else
{
name = "Unknown";
}
또는
if (obj is User u)
return u.Name;
return "Unknown";
타입 검사와 할당을 결합합니다.
- ✔ 핸들러와 매핑 로직에서 매우 유용합니다.
📚 Microsoft 문서
8. Switch Expressions (Modern Replacement)
var role = userType switch
{
"Admin" => 10,
"User" => 5,
_ => 0
};
설명:
userType가"Admin"이면 →role = 10userType가"User"이면 →role = 5- 다른 모든 값(
_)에 대해 →role = 0
장점
- ✔ 중첩 삼항 연산자보다 가독성이 좋음
- ✔ multiple conditions에 더 적합
- ✔ pattern matching을 지원
📚 Microsoft Documentation
9 Advanced Pattern Matching (Property Patterns)
var message = user switch
{
null => "No user",
{ IsActive: false } => "Inactive user",
{ Role: "Admin" } => "Welcome admin",
_ => "Welcome"
};
user에 대한 switch expression으로, 상태에 따라 메시지를 선택합니다:
user == null이면 →"No user"- 그렇지 않고
IsActive == false이면 →"Inactive user"- 그렇지 않고
Role == "Admin"이면 →"Welcome admin"- 그 외 →
"Welcome"business‑rules classification에 이상적입니다.
Πότε να χρησιμοποιούμε Conditional Expressions
- 짧고 명확한 할당을 원할 때
- 간단한 이진 선택이 있을 때
- 보일러플레이트 코드를 줄이고 싶을 때
- 가독성을 향상시킬 때
언제 피해야 할까
- 로직에 여러 비즈니스 규칙이 포함될 때
- 브레이크포인트를 사용한 디버깅이 필요할 때
- 중첩된 삼항 연산자가 생성될 때
- 가독성이 떨어질 때
모범 사례 가이드라인
- ✅ 1 조건 → ternary
- ✅ 여러 개별 값 → switch expression
- ✅ Null 대체 →
?? - ✅ 가드 절 →
??throw - ❌ 복잡한 로직 → if/else block
기억하라…
C#의 조건식은 표현력 있고 간결한 코드를 만들기 위한 강력한 도구입니다.
- 올바르게 사용하면 가독성을 높이고 코드 양을 줄여줍니다.
- 과도하게 사용하면 “clear code” 대신 “clever code”가 됩니다.
원칙: 먼저 사람을 위한 코드를 쓰고, 컴파일러는 그 다음에 생각한다.
- 삼항 연산자가 코드를 더 깔끔하게 만든다면 — 사용하라.
- 코드를 더 똑똑하게 만들지만 이해하기 어려워진다면 — 피하라.