---
title: "조건을 쓰는 순서가 곧 우선순위다"
description: "else if 는 위에서부터 처음 맞는 하나만 고르고 나머지는 검사조차 하지 않습니다. 그래서 쓰는 순서가 결과를 바꿉니다."
author: "유니얼"
pubDate: 2026-09-08
category: "programming/csharp/basics"
tags: ["C#", "기초"]
canonical: https://blog.unialgames.com/posts/csharp-else-if/
---
앞 글은 갈래가 둘일 때였습니다. 이번에는 셋 이상입니다.

점수로 등급을 매겨 보겠습니다. 90점 이상 A, 80점 이상 B, 70점 이상 C.
`if` 를 세 번 쓰면 될 것 같습니다.

```csharp
int score = 95;
string grade = "없음";

if (score >= 90)
{
    grade = "A";
}
if (score >= 80)
{
    grade = "B";
}
if (score >= 70)
{
    grade = "C";
}

Console.WriteLine(grade);
```

95점입니다. 출력은 `C` 입니다.

## if 를 나란히 쓰면 전부 검사한다

무슨 일이 일어났는지 한 줄씩 따라가 보겠습니다.

<x-flow>
<script type="application/json">
{
  "label": "if 를 세 번 따로 쓴 경우",
  "lines": [
    "string grade = \"없음\";",
    "if (score >= 90)",
    "{",
    "    grade = \"A\";",
    "}",
    "if (score >= 80)",
    "{",
    "    grade = \"B\";",
    "}",
    "if (score >= 70)",
    "{",
    "    grade = \"C\";",
    "}",
    "Console.WriteLine(grade);"
  ],
  "cases": [
    {
      "label": "score = 95",
      "state": "score = 95 · grade = \"없음\"",
      "path": [
        { "line": 0, "why": "먼저 기본값을 넣어 둡니다." },
        { "line": 1, "why": "95 는 90 이상입니다.", "verdict": "true" },
        { "line": 3, "why": "A 가 들어갔습니다.", "state": "score = 95 · grade = \"A\"" },
        { "line": 5, "why": "다음 if 는 앞에서 무슨 일이 있었는지 모릅니다. 그냥 자기 조건을 봅니다.", "verdict": "true" },
        { "line": 7, "why": "A 를 덮어씁니다.", "state": "score = 95 · grade = \"B\"" },
        { "line": 9, "why": "95 는 70 이상이기도 합니다.", "verdict": "true" },
        { "line": 11, "why": "또 덮어씁니다.", "state": "score = 95 · grade = \"C\"" },
        { "line": 13, "why": "마지막에 남은 값이 나옵니다.", "out": "C" }
      ],
      "note": "세 조건이 전부 참이라 세 번 다 들어갔습니다."
    }
  ]
}
</script>
</x-flow>

`if` 세 개는 서로 남남입니다. 각각 자기 조건만 보고, 앞의 `if` 가 무엇을 했는지 모릅니다.
95는 90 이상이면서 80 이상이고 70 이상이기도 하니 세 번 다 참입니다.
그래서 `grade` 가 세 번 바뀌고, 마지막에 쓴 값만 남습니다.

**등급을 하나 고르고 싶었는데 세 번 고른 것**이 문제입니다.

## else if 는 처음 맞는 하나에서 멈춘다

`else` 를 붙여서 하나로 묶습니다.

<x-flow>
<script type="application/json">
{
  "label": "else if 로 묶은 경우",
  "lines": [
    "string grade = \"없음\";",
    "if (score >= 90)",
    "{",
    "    grade = \"A\";",
    "}",
    "else if (score >= 80)",
    "{",
    "    grade = \"B\";",
    "}",
    "else if (score >= 70)",
    "{",
    "    grade = \"C\";",
    "}",
    "Console.WriteLine(grade);"
  ],
  "cases": [
    {
      "label": "score = 95",
      "state": "score = 95 · grade = \"없음\"",
      "path": [
        { "line": 0, "why": "여기까지는 같습니다." },
        { "line": 1, "why": "95 는 90 이상입니다.", "verdict": "true" },
        { "line": 3, "why": "A 가 들어갔습니다.", "state": "score = 95 · grade = \"A\"" },
        { "line": 13, "why": "아래 조건들은 검사조차 하지 않고 사슬 전체를 빠져나옵니다.", "out": "A" }
      ],
      "skip": [5, 6, 7, 8, 9, 10, 11, 12],
      "note": "흐린 줄은 80 이상인지 70 이상인지 물어보지도 않은 줄입니다."
    },
    {
      "label": "score = 72",
      "state": "score = 72 · grade = \"없음\"",
      "path": [
        { "line": 0, "why": "같은 코드에 값만 바꿨습니다." },
        { "line": 1, "why": "72 는 90 이상이 아닙니다.", "verdict": "false" },
        { "line": 5, "why": "거짓이면 다음 조건으로 넘어갑니다.", "verdict": "false" },
        { "line": 9, "why": "여기서 처음으로 참이 됩니다.", "verdict": "true" },
        { "line": 11, "why": "C 가 들어갑니다.", "state": "score = 72 · grade = \"C\"" },
        { "line": 13, "why": "여기서도 사슬은 한 번만 걸립니다.", "out": "C" }
      ],
      "skip": [2, 3, 6, 7],
      "note": "거짓인 동안만 아래로 내려갑니다. 참이 나오는 순간 멈춥니다."
    }
  ]
}
</script>
</x-flow>

> **`else if` 사슬은 위에서부터 검사하다가 처음 참이 되는 하나만 실행하고 끝납니다.**

`if` 를 나란히 쓴 것과 겉모습은 `else` 네 글자 차이지만, 하는 일이 다릅니다.
나란히 쓴 `if` 는 **각각 독립된 질문 세 개**이고,
`else if` 사슬은 **답이 하나뿐인 질문 하나**입니다.

## 순서를 바꾸면 결과가 바뀐다

사슬은 위에서부터 봅니다. 그러니 **넓은 조건을 위에 두면 아래가 걸릴 일이 없습니다.**

```csharp
if (score >= 70)
{
    grade = "C";
}
else if (score >= 90)   // 여기는 영원히 실행되지 않습니다
{
    grade = "A";
}
```

95점을 넣어도 `C` 입니다. 첫 조건이 이미 참이니 아래는 검사조차 안 합니다.
두 번째 줄에 도달하려면 `score` 가 70 미만이어야 하는데,
그런 값이 90 이상일 수는 없습니다.

컴파일러는 아무 말도 하지 않습니다. 문법은 멀쩡하니까요.
**조건 사슬에서 순서는 취향이 아니라 로직입니다.**

좁은 조건부터, 넓은 조건은 아래로. 이게 등급이나 요금처럼
구간이 겹치는 조건을 쓸 때의 순서입니다.

## 겹쳐도 되는 것이 else if 의 쓸모다

90 이상은 80 이상이기도 합니다. 구간이 겹칩니다.
겹치지 않게 쓰려면 이렇게 됩니다.

```csharp
if (score >= 90)                    { grade = "A"; }
if (score >= 80 && score < 90)      { grade = "B"; }
if (score >= 70 && score < 80)      { grade = "C"; }
```

같은 숫자를 두 번씩 적게 되고, 기준을 85로 바꾸는 순간 고칠 자리가 두 군데씩 생깁니다.

`else if` 는 "위에서 안 걸린 것만 여기로 온다"가 이미 보장되니
`score < 90` 을 적을 필요가 없습니다. **위쪽 조건이 아래쪽 조건의 상한을 대신합니다.**

## else 는 남은 전부다

사슬 끝에 `else` 를 붙이면 위에서 하나도 안 걸린 경우가 전부 여기로 옵니다.

```csharp
if (score >= 90)      { grade = "A"; }
else if (score >= 80) { grade = "B"; }
else if (score >= 70) { grade = "C"; }
else                  { grade = "F"; }
```

`else` 에는 조건이 없습니다. 조건이 필요 없기 때문입니다.
여기까지 내려왔다는 사실 자체가 "위의 조건이 전부 거짓이었다"는 뜻입니다.

`else` 를 안 붙이면 어느 쪽에도 안 걸리는 값이 생깁니다.
위 코드에서 `else` 를 빼면 40점일 때 `grade` 는 처음에 넣어둔 `"없음"` 그대로입니다.
그게 의도라면 괜찮고, 아니라면 화면에 `없음` 이 찍히고 나서야 알게 됩니다.

## 정리

- 나란히 쓴 `if` 는 서로 남남입니다. 조건이 겹치면 전부 실행되고 뒤가 앞을 덮습니다.
- `else if` 사슬은 위에서부터 검사해서 처음 참인 하나만 실행하고 끝냅니다.
- 나머지 조건은 느리게 검사되는 것이 아니라 **검사되지 않습니다.**
- 그래서 쓰는 순서가 곧 우선순위입니다. 넓은 조건을 위에 두면 아래는 죽은 코드가 됩니다.
- 구간이 겹쳐도 되는 것이 `else if` 의 장점입니다. 위쪽 조건이 아래쪽의 상한을 대신합니다.
- `else` 는 조건의 반대편이 아니라 위에서 안 걸린 나머지 전부입니다.