조건문
if 와 switch 로 조건에 따라 다른 코드를 실행합니다. switch 식도 함께 봅니다.
상황에 따라 다른 길로
지금까지의 코드는 위에서 아래로 한 줄씩 그대로 실행됐습니다. 조건문은 여기에 분기를 만듭니다. 조건이 참이면 이쪽, 거짓이면 저쪽으로 가게 해서, 같은 프로그램이 값에 따라 다르게 움직이도록 만듭니다.
C#에서 분기를 만드는 방법은 크게 둘입니다.
-
if— 조건이 참인지 거짓인지로 나눕니다. 조건을 여러 개 이어 붙일 수 있어 범위를 다룰 때 알맞습니다. -
switch— 하나의 값이 무엇인지로 나눕니다. 경우가 여럿이고 각각 정해진 값일 때if를 줄줄이 잇는 것보다 읽기 쉽습니다.
여기서 조건 자리에는 반드시 참·거짓이 와야 합니다. 다른 언어에서는
0이 아닌 숫자를 참으로 치기도 하지만, C#은 그것을 허용하지 않습니다. 덕분에
== 를 = 로 잘못 적는 흔한
실수가 실행 전에 컴파일 오류로 걸립니다.
점수로 등급 나누기
아래 코드는 브라우저 안에서 실제로 실행됩니다. 고쳐서 눌러 보셔도 됩니다.
int score = 87; if (score >= 90) { Console.WriteLine("A"); } else if (score >= 80) { Console.WriteLine("B"); } else { Console.WriteLine("C"); }
코드는 고쳐서 실행해 볼 수 있습니다. 처음 누를 때만 실행기를 내려받느라 잠시 걸립니다. 적은 코드는 서버로 나가지 않습니다.
위에서부터 차례로 견주다가 처음 맞는 것 하나만 실행하고 끝납니다.
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 를 적지 않고, 선택한 값을 그대로 변수에
담습니다. _ 는 "그 밖의 모든 것"을 뜻합니다.
string msg; switch (grade) { case "A": msg = "훌륭합니다"; break; case "B": case "C": msg = "좋습니다"; break; default: msg = "다시 해봅시다"; break; }
string msg = grade switch { "A" => "훌륭합니다", "B" or "C" => "좋습니다", _ => "다시 해봅시다" };
switch 식은 값이 무엇인지뿐 아니라
어느 범위에 드는지로도 나눌 수 있습니다. 앞의 등급 예제를 이렇게
적으면 if 를 여러 번 이어 붙이는 것보다 짧아집니다.
string grade = score switch { >= 90 => "A", >= 80 => "B", _ => "C" };
switch 식은 모든 경우를 덮어야 합니다.
어느 경우에도 걸리지 않는 값이 들어오면 실행 중에 예외가 납니다. 마지막에
_ 를 두는 것은 그래서입니다.
이 문법, 몇 버전부터 사용할 수 있나요
- 1.0if · else · switch 문 · 삼항 연산자
- 7.0패턴 매칭 — case 에 타입을 적기
- 8.0switch 식
- 9.0관계 패턴(>= 90) · 논리 패턴(and · or · not)
if 와 switch 문 자체는
C# 1.0부터 있었습니다. 이 단원에서 새것은 switch
식(C# 8.0)과 그 안에 적은 패턴들입니다 — "B" or "C"
같은 논리 패턴과 >= 90 같은 관계 패턴은
C# 9.0부터입니다. 오래된 코드에서 break 가 줄줄이
달린 switch 를 만나더라도 잘못된 것이 아니라
그때의 방식입니다.
직접 해보기
int age = 15; 를 두고, 8살 미만이면
무료, 19살 미만이면 청소년 요금,
그 밖에는 성인 요금을 출력해보세요.
int day = 6; 을 두고 1은 월요일, 2부터 5까지는 각각
화·수·목·금, 6과 7은 주말로 바꿔 출력해보세요.
switch 식을 사용하고, 그 밖의 숫자에는
알 수 없음을 내면 됩니다.
- 조건 자리에는 반드시 참·거짓이 와야 합니다. 숫자는 조건이 되지 못합니다.
else if를 이어 붙이면 위에서부터 처음 맞는 하나만 실행합니다. 순서가 결과를 바꿉니다.- 값이 무엇인지로 나눌 때는
switch, 값 하나만 선택할 때는switch식이 짧습니다. switch식에는_를 두어 빠지는 경우가 없게 합니다.
C# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.