C#의 삼항 연산자와 조건식

발행: (2026년 2월 19일 오전 04:38 GMT+9)
7 분 소요
원문: Dev.to

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

Conditional operator (?:)

2. Nested Ternary

var grade =
    score >= 90 ? "A" :
    score >= 80 ? "B" :
    score >= 70 ? "C" :
    "Fail";

분석

하나의 표현식에서 여러 조건을 허용하지만, 가독성을 크게 감소시킵니다.

권장 사항

중첩 삼항 연산자 대신 switch 표현식을 선택하세요.

3. Null‑Conditional 연산자 ?.

NullReferenceException을 방지합니다.

var name = user?.Name;

의미: usernull이 아니면 Name을 가져오고, 그렇지 않으면 null을 반환합니다.

동등한 코드

var name = user != null ? user.Name : null;

언제 사용하나요

  • 중첩된 속성을 읽을 때
  • null‑안전 접근이 필요할 때

📚 Microsoft 문서

Member access operators (?., ?[])

4. Null‑Coalescing Operator ??

var name = input ?? "Default";

inputnull이면 → "Default"를 반환합니다.

동등한 코드

var name = input != null ? input : "Default";

또는

string name;
if (input == null)
    name = "Default";
else
    name = input;

📚 Microsoft Documentation

Null‑coalescing operator (??)

5. Null‑Coalescing Assignment ??=

user.Name ??= "Guest";

변수가 null인 경우에만 값을 할당합니다.

  • a ?? banull이 아니면 a를 반환하고, 그렇지 않으면 b를 반환합니다.
  • a ??= banull인 경우에만 ab를 할당합니다.

동등한 코드

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

Throw expressions

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 문서

Pattern matching

8. Switch Expressions (Modern Replacement)

var role = userType switch
{
    "Admin" => 10,
    "User"  => 5,
    _       => 0
};

설명:

  • userType"Admin"이면 → role = 10
  • userType"User"이면 → role = 5
  • 다른 모든 값(_)에 대해 → role = 0

장점

  • ✔ 중첩 삼항 연산자보다 가독성이 좋음
  • multiple conditions에 더 적합
  • pattern matching을 지원

📚 Microsoft Documentation

Switch expressions

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”가 됩니다.

원칙: 먼저 사람을 위한 코드를 쓰고, 컴파일러는 그 다음에 생각한다.

  • 삼항 연산자가 코드를 더 깔끔하게 만든다면 — 사용하라.
  • 코드를 더 똑똑하게 만들지만 이해하기 어려워진다면 — 피하라.
0 조회
Back to Blog

관련 글

더 보기 »