Rust 기초: 조건문 if와 match
안녕하세요! 저는 여러분의 코딩 길잡이, 재준봇입니다!
자, 여러분! 드디어 5강에 오셨군요. 지금까지 우리는 변수니 타입이니 하는 아주 기초적인 ‘재료’들을 배웠습니다. 하지만 재료만 있다고 요리가 되나요? 아니죠! 언제 어떤 재료를 넣을지, 불 조절은 언제 할지 결정하는 ‘판단력’이 필요합니다.
코딩에서도 마찬가지입니다. 프로그램이 상황에 따라 “어? 지금은 이 길로 가야겠는데?” 혹은 “이 조건이 맞으면 이걸 실행해!”라고 판단하게 만드는 것이 바로 오늘 배울 ‘조건문’입니다.
오늘 배울 내용은 Rust의 핵심 중의 핵심인 if와 match입니다. 특히 Rust의 match는 다른 언어에서는 맛보기밖에 못 해본 엄청난 녀석이니 기대하셔도 좋습니다. 자, 그럼 재준봇과 함께 조건문의 세계로 딥다이브 해봅시다!
5강: Rust 기초 - 조건문 if와 match
1. 가장 기본 중의 기본, if 문
우리가 일상생활에서 하는 생각의 흐름을 보세요. “배가 고프면 밥을 먹는다”, “비가 오면 우산을 쓴다” 같은 것들이 전부 if 문입니다. 코딩에서도 똑같습니다. 특정 조건이 ‘참(true)’일 때만 코드를 실행하고 싶을 때 사용하죠.
여기서 정말 중요한 포인트 하나 짚고 넘어갈게요. Rust는 타입에 정말 엄격한 언어입니다. 다른 언어(C언어 등)에서는 숫자 0은 거짓, 1은 참으로 치는 경우가 많지만, Rust에서는 절대로 안 됩니다! 오직 불리언(bool) 타입인 true와 false만 사용할 수 있습니다. 이거 헷갈려서 넣었다가는 컴파일러한테 아주 호되게 혼나실 거예요.
예제 1: 간단한 if 문으로 나이 확인하기
먼저 아주 심플한 예제부터 가보겠습니다.
fn main() {
let age = 20;
// 나이가 19세 이상인지 확인합니다.
if age >= 19 {
println!("성인입니다. 이제 당당하게 입장하세요!");
}
}
코드 뜯어보기
let age = 20;: 일단 나이라는 변수에 20을 저장했습니다.if age >= 19 { ... }: 여기서age >= 19부분이 바로 조건식입니다. 결과는 true 아니면 false로 나오겠죠? 지금은 20이니까 true가 됩니다.{ ... }: 조건이 true일 때만 이 중괄호 안의 내용이 실행됩니다. 만약 age가 15였다면, 이 프로그램은 아무런 말도 없이 그냥 끝나버렸을 겁니다.
2. 갈림길에서 선택하기, if-else와 else if
세상 일이 그렇게 단순하게 “맞으면 하고, 아니면 말고”로 끝나지 않죠? “이게 맞으면 A를 하고, 저게 맞으면 B를 하고, 그것도 아니면 C를 해!”라는 복잡한 상황이 훨씬 많습니다. 이때 사용하는 것이 else와 else if입니다.
이건 마치 식당에서 메뉴를 고르는 것과 같습니다. “돈까스가 있으면 돈까스를 먹고, 없으면 제육볶음을 먹고, 그것도 없으면 그냥 굶겠다!”라는 로직인 셈이죠.
예제 2: 성적 등급 매기기 (다중 조건문)
이번에는 조금 더 실무적인 느낌으로 성적을 판별하는 코드를 짜보겠습니다.
fn main() {
let score = 85;
if score >= 90 {
println!("최우수! 당신은 천재인가요?");
} else if score >= 80 {
println!("우수! 아주 훌륭한 성적입니다.");
} else if score >= 70 {
println!("보통! 조금만 더 노력해봅시다.");
} else {
println!("재수강 추천... 재준봇과 함께 공부하세요!");
}
}
코드 뜯어보기
if score >= 90: 첫 번째 관문입니다. 90점 이상이면 여기서 바로 종료되고 아래는 쳐다보지도 않습니다.else if score >= 80: 첫 번째 관문을 통과하지 못한(90점 미만인) 사람들이 오는 곳입니다. 여기서 80점 이상인지 다시 확인합니다. 85점이니까 여기서 걸리겠죠?else if score >= 70: 위 두 조건이 모두 거짓일 때 마지막으로 확인하는 관문입니다.else: “위의 모든 조건이 다 꽝이다!”라는 뜻입니다. 어떤 조건에도 해당하지 않는 모든 경우의 수가 여기로 모입니다.
3. Rust의 꽃, match 문 (패턴 매칭)
자, 이제 드디어 메인 요리가 나왔습니다. 바로 match 문입니다. if-else가 “예/아니오”의 연속적인 질문이라면, match는 “너는 누구니?”라고 물어보고 딱 맞는 정답지를 찾아주는 ‘마법의 분류기’라고 생각하시면 됩니다.
사실 if-else를 너무 많이 쓰면 코드가 오른쪽으로 계속 밀리면서 가독성이 엉망이 됩니다. 이걸 전문 용어로 ‘피라미드 오브 둠(Pyramid of Doom)’이라고 하죠. match는 이 문제를 아주 깔끔하게 해결해 줍니다.
특히 match의 가장 무서운 점이자 장점은 ‘철저함(Exhaustiveness)’입니다. Rust 컴파일러는 match를 쓸 때 “혹시 빠뜨린 경우의 수가 없는지”를 아주 꼼꼼하게 체크합니다. 하나라도 빼먹으면 컴파일 자체가 안 됩니다. 정말 친절하고 무서운 선생님 같죠?
예제 3: match를 이용한 요일별 인사말
이번에는 숫자를 요일로 변환해서 인사하는 코드를 만들어 보겠습니다.
fn main() {
let day_number = 3;
match day_number {
1 => println!("월요일입니다. 출근하기 싫으시죠?"),
2 => println!("화요일입니다. 아직 한참 남았네요."),
3 => println!("수요일입니다. 벌써 일주일의 절반이 갔어요!"),
4 => println!("목요일입니다. 내일이면 금요일이에요!"),
5 => println!("금요일입니다. 오늘만 버티면 주말입니다!"),
6 => println!("토요일입니다. 늦잠 자는 날이죠."),
7 => println!("일요일입니다. 내일이 오는 게 무서운 날입니다."),
_ => println!("잘못된 숫자입니다. 요일은 1부터 7까지입니다."),
}
}
코드 뜯어보기
match day_number { ... }:day_number라는 변수의 값을 가지고 아래 패턴들과 비교를 시작합니다.1 => println!(...): 값이 1이면 이 코드를 실행하라는 뜻입니다.=>화살표가 포인트입니다._ => println!(...): 여기가 핵심입니다!_는 ‘와일드카드’라고 부르는데, “앞에서 언급하지 않은 나머지 모든 경우”를 처리합니다. 만약day_number가 100이라면 이 부분이 실행되겠죠? 만약 이_부분을 삭제한다면, Rust는 “야! 8부터 무한대까지의 숫자는 어떻게 처리할 거야!”라고 소리를 지르며 에러를 낼 것입니다.
4. [심화] 조건문은 사실 ‘식(Expression)’이다!
여기서 정말 신기한 사실 하나 알려드릴게요. Rust에서 if와 match는 단순한 문장이 아니라 ‘값’을 반환하는 ‘식(Expression)’입니다.
이게 무슨 말이냐고요? 조건문의 결과값을 변수에 바로 집어넣을 수 있다는 뜻입니다. 다른 언어에서는 let result = (condition) ? a : b 같은 삼항 연산자를 쓰는데, Rust는 그냥 if 문 자체가 그 역할을 합니다.
예제 4: 조건문으로 변수에 값 할당하기
fn main() {
let condition = true;
// if 문 자체가 값을 반환해서 number에 저장됩니다.
let number = if condition { 5 } else { 6 };
println!("선택된 숫자는 {}입니다.", number);
}
코드 뜯어보기
let number = if condition { 5 } else { 6 };: 이 문장을 잘 보세요.if앞에let number =가 붙어 있죠?- 조건이 true면
5라는 값이 반환되어number에 저장되고, false면6이 저장됩니다. - 주의할 점: if와 else 양쪽에서 반환하는 값의 ‘타입’이 반드시 같아야 합니다. 한쪽은 숫자인데 다른 쪽은 문자열이면 컴파일러가 다시 한번 화를 낼 겁니다.
💡 초보자 폭풍 질문!
질문: 재준봇님! 저는 다른 언어를 배우다 와서 그런데, if (1) { … } 이렇게 숫자를 넣으면 안 되나요? 보통 0이 아니면 참이라고 생각하거든요!
재준봇의 답변:
안 됩니다! 절대 안 됩니다! Rust는 타입 안전성을 극도로 중요하게 생각하는 언어입니다. 숫자 1은 정수(Integer)이지, 불리언(Boolean)이 아니에요. Rust에게 “1이면 참이지?”라고 묻는 것은, 마치 한국인에게 “사과가 맞니?”라고 물었는데 “빨간색이야!”라고 대답하는 것과 같습니다. 질문과 대답의 형식이 맞지 않는 거죠. 무조건 true나 false가 나오는 비교 연산자(==, >, <, != 등)를 사용하세요!
⚠️ 실무 주의보
주의: match 문을 쓸 때 패턴이 너무 많아지면 코드가 읽기 힘들어집니다!
실무에서 match 문 안에 수십 개의 조건과 수십 줄의 코드를 때려 넣는 분들이 계십니다. 이렇게 되면 나중에 본인도 못 읽는 ‘외계어’가 됩니다.
해결책: match의 각 팔(arm) 내부 로직이 길어진다면, 그 로직을 별도의 함수로 빼세요. match 문은 오직 ‘어떤 길로 갈 것인가’를 결정하는 이정표 역할만 수행하게 하고, 실제 구체적인 작업은 함수가 처리하게 만드는 것이 깔끔한 코딩의 정석입니다.
요약 및 마무리
오늘 우리는 Rust의 조건문 3형제에 대해 배웠습니다.
- if 문: 단일 조건 확인. (꼭 bool 타입만 사용하자!)
- if-else / else if: 여러 갈래 길에서 선택. (피라미드가 깊어지면 위험하다!)
- match 문: 완벽한 패턴 매칭. (모든 경우의 수를 다 적어야 하는 철저함이 특징!)
- 식(Expression)으로서의 조건문: 조건문의 결과를 변수에 바로 담을 수 있다!
어떠신가요? 생각보다 어렵지 않죠? Rust의 조건문은 처음엔 좀 까다롭게 느껴질 수 있지만, 한 번 익숙해지면 컴파일러가 미리 에러를 잡아주기 때문에 나중에 런타임에서 프로그램이 터지는 일이 현저히 줄어듭니다. 이게 바로 Rust를 쓰는 이유죠!
자, 이제 직접 코드를 짜보세요. 나만의 계산기나 간단한 텍스트 어드벤처 게임의 선택지를 만들어보는 것을 추천합니다. 그럼 다음 강의에서 더 재미있고 찰떡같은 비유로 돌아오겠습니다!
지금까지 재준봇이었습니다! 열공하세요!
<hr>