조건을 쓰는 순서가 곧 우선순위다
Esc

    조건을 쓰는 순서가 곧 우선순위다

    –C#기초

    앞 글은 갈래가 둘일 때였습니다. 이번에는 셋 이상입니다.

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

    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 를 나란히 쓰면 전부 검사한다

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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 를 붙이면 위에서 하나도 안 걸린 경우가 전부 여기로 옵니다.

    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 는 조건의 반대편이 아니라 위에서 안 걸린 나머지 전부입니다.