C# 1.5 · 1부. 기초

조건문

if 와 switch 로 조건에 따라 다른 코드를 실행합니다. switch 식도 함께 봅니다.

예상 학습 시간 14분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 입문
개념 설명

상황에 따라 다른 길로

지금까지의 코드는 위에서 아래로 한 줄씩 그대로 실행됐습니다. 조건문은 여기에 분기를 만듭니다. 조건이 참이면 이쪽, 거짓이면 저쪽으로 가게 해서, 같은 프로그램이 값에 따라 다르게 움직이도록 만듭니다.

C#에서 분기를 만드는 방법은 크게 둘입니다.

  • if — 조건이 참인지 거짓인지로 나눕니다. 조건을 여러 개 이어 붙일 수 있어 범위를 다룰 때 알맞습니다.
  • switch — 하나의 값이 무엇인지로 나눕니다. 경우가 여럿이고 각각 정해진 값일 때 if 를 줄줄이 잇는 것보다 읽기 쉽습니다.

여기서 조건 자리에는 반드시 참·거짓이 와야 합니다. 다른 언어에서는 0이 아닌 숫자를 참으로 치기도 하지만, C#은 그것을 허용하지 않습니다. 덕분에 === 로 잘못 적는 흔한 실수가 실행 전에 컴파일 오류로 걸립니다.

최소 예제 · 편집 가능

점수로 등급 나누기

아래 코드는 브라우저 안에서 실제로 실행됩니다. 고쳐서 눌러 보셔도 됩니다.

Program.cs
int score = 87;

if (score >= 90) {
    Console.WriteLine("A");
} else if (score >= 80) {
    Console.WriteLine("B");
} else {
    Console.WriteLine("C");
}
출력
B

코드는 고쳐서 실행해 볼 수 있습니다. 처음 누를 때만 실행기를 내려받느라 잠시 걸립니다. 적은 코드는 서버로 나가지 않습니다.

위에서부터 차례로 견주다가 처음 맞는 것 하나만 실행하고 끝납니다. 87은 >= 80 도 참이지만 >= 90 을 먼저 보고 지나갔기 때문에 B에서 멈춥니다. 그래서 순서가 중요합니다 — 만약 80 조건을 위에 두었다면 90점짜리도 B가 됩니다.

상세 사용법

if 를 적을 때 알아둘 것

  • 중괄호는 생략할 수 있지만 두는 편이 안전합니다. 없으면 바로 다음 한 줄만 조건에 딸리는데, 나중에 줄을 하나 더 넣으면서 그것이 조건 밖으로 빠져나가는 일이 자주 생깁니다.
  • else 는 없어도 됩니다. 참일 때만 무언가 하고 아니면 그냥 지나가면 되는 경우가 많습니다.
  • 조건을 여럿 묶을 때는 &&(그리고)와 ||(또는)를 사용합니다. age >= 20 && hasTicket 처럼 적습니다.

참·거짓에 따라 값 하나만 선택하면 되는 자리라면 if 대신 물음표를 사용할 수 있습니다. 조건 뒤에 ? 를 적고 참일 때와 거짓일 때의 값을 : 로 구분합니다.

int age = 17;
string label = age >= 20 ? "성인" : "미성년";
// label 은 "미성년"

값이 무엇인지로 나눌 때는 switch

같은 값을 여러 번 견주는 if 가 이어진다면 switch 가 더 어울립니다. C#에서는 각 case 가 끝나면 break 로 빠져나와야 하며, 아래로 흘러내리지 않습니다. 다만 아무것도 적지 않은 case 는 다음 것과 묶입니다.

C# 8.0부터는 같은 것을 식(expression)으로도 적을 수 있습니다. 경우마다 break 를 적지 않고, 선택한 값을 그대로 변수에 담습니다. _ 는 "그 밖의 모든 것"을 뜻합니다.

switch 문
string msg;

switch (grade) {
    case "A":
        msg = "훌륭합니다";
        break;
    case "B":
    case "C":
        msg = "좋습니다";
        break;
    default:
        msg = "다시 해봅시다";
        break;
}
switch 식 (C# 8.0+)
string msg = grade switch {
    "A" => "훌륭합니다",
    "B" or "C" => "좋습니다",
    _ => "다시 해봅시다"
};

switch 식은 값이 무엇인지뿐 아니라 어느 범위에 드는지로도 나눌 수 있습니다. 앞의 등급 예제를 이렇게 적으면 if 를 여러 번 이어 붙이는 것보다 짧아집니다.

string grade = score switch {
    >= 90 => "A",
    >= 80 => "B",
    _ => "C"
};

switch 식은 모든 경우를 덮어야 합니다. 어느 경우에도 걸리지 않는 값이 들어오면 실행 중에 예외가 납니다. 마지막에 _ 를 두는 것은 그래서입니다.

버전 배지

이 문법, 몇 버전부터 사용할 수 있나요

1.0
2.0
3.0
5.0
6.0
7.0
8.0
9.0
14.0
  • 1.0if · else · switch 문 · 삼항 연산자
  • 7.0패턴 매칭 — case 에 타입을 적기
  • 8.0switch 식
  • 9.0관계 패턴(>= 90) · 논리 패턴(and · or · not)
C# 8.0+

ifswitch 문 자체는 C# 1.0부터 있었습니다. 이 단원에서 새것은 switch 식(C# 8.0)과 그 안에 적은 패턴들입니다 — "B" or "C" 같은 논리 패턴과 >= 90 같은 관계 패턴은 C# 9.0부터입니다. 오래된 코드에서 break 가 줄줄이 달린 switch 를 만나더라도 잘못된 것이 아니라 그때의 방식입니다.

실습 문제

직접 해보기

1. 나이로 요금 정하기 난이도 하

int age = 15; 를 두고, 8살 미만이면 무료, 19살 미만이면 청소년 요금, 그 밖에는 성인 요금을 출력해보세요.

작은 쪽부터 견주면 8살 미만 다음에는 8살 이상이 보장되므로, 19살 미만만 적으면 됩니다. 범위를 두 번 적을 필요가 없습니다.
int age = 15; if (age < 8) { Console.WriteLine("무료"); } else if (age < 19) { Console.WriteLine("청소년 요금"); } else { Console.WriteLine("성인 요금"); }
2. 요일 번호를 이름으로 바꾸기 난이도 중

int day = 6; 을 두고 1은 월요일, 2부터 5까지는 각각 화·수·목·금, 6과 7은 주말로 바꿔 출력해보세요. switch 식을 사용하고, 그 밖의 숫자에는 알 수 없음을 내면 됩니다.

여러 값을 하나로 묶을 때는 6 or 7 처럼 적습니다. 어디에도 걸리지 않는 값을 받을 _ 를 마지막에 꼭 두세요.
int day = 6; string name = day switch { 1 => "월요일", 2 => "화요일", 3 => "수요일", 4 => "목요일", 5 => "금요일", 6 or 7 => "주말", _ => "알 수 없음" }; Console.WriteLine(name);
요약
  • 조건 자리에는 반드시 참·거짓이 와야 합니다. 숫자는 조건이 되지 못합니다.
  • else if 를 이어 붙이면 위에서부터 처음 맞는 하나만 실행합니다. 순서가 결과를 바꿉니다.
  • 값이 무엇인지로 나눌 때는 switch, 값 하나만 선택할 때는 switch 식이 짧습니다.
  • switch 식에는 _ 를 두어 빠지는 경우가 없게 합니다.

C# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.