함수는 코드의 재사용과 구조화를 위한 기본 단위로서 매개변수와 반환값이 있을 수 있습니다. 또한 if와 match는 중요한 제어 흐름 도구로서, let과 결합하여 변수에 값을 대입하는 표현식도 됩니다. match의 경우 모든 경우를 망라하기 위해 _를 사용하는 것이 특이합니다.
🔧 함수 정의
fn main() {
greet("Rust");
}
fn greet(name: &str) {
println!("Hello, {}!", name);
}
- fn 키워드로 함수를 정의합니다.
- 함수는 매개변수와 반환 타입을 명시할 수 있습니다. 그러나, 매개변수나 반환 값이 있다면 반드시 형식(타입)을 지정해야 합니다. 위에서 main 함수에는 매개변수가 없고, greet에는 매개변수 name이 있으므로 형식을 &str로 지정했습니다.
- &str은 문자열 슬라이스(문자열 참조)입니다.
- main함수에서 greet 함수를 호출하고, greet 함수의 name 매개변수로 Rust를 전달하고 있으므로, 위 코드를 실행하면 아래 화면과 같이 Hello, Rust!라고 화면에 표시됩니다.

위 화면은 D:\rust-practice 폴더에서 cargo new day3를 실행한 다음 위 코드로 대체하고 실행한 화면입니다.
name 다음의 형식을 제거하고 실행(Run) 하면 아래와 같이 복잡한 에러 메시지가 표시되는데, name에 대한 형식을 지정하라는 의미입니다.

위 화면에서 name 다음에 :을 입력하면 &str이 제시되므로 tab키를 눌러 제안을 수용하면 쉽게 코드를 완성할 수 있습니다.

🔁 반환값이 있는 함수
fn add(a: i32, b: i32) -> i32 {
a + b // 세미콜론 없음 → 반환값
}
- 함수의 마지막 표현식(Expression)이 반환값입니다. 여기서는 a + b 입니다.
- -> 다음의 i32가 반환 값의 형식을 지정하는 것입니다.
- 세미콜론(;)이 붙으면 실행문(Statement)으로 값이 반환되지 않습니다.
- return키워드를 사용할 수도 있지만, 마지막 줄에 return 없이 값을 놓는 것이 일반적입니다.
fn add(a: i32, b: i32) -> i32{
return a + b
}
- 위 함수는 출력문이 없으므로 화면에 어떠한 값도 출력하지 않습니다.
값을 출력하려면 println! 매크로를 사용해야 합니다.
fn main() {
let sum = add(5, 10);
println!("5와 10의 합은: {sum}"); // 15
}
fn add(a: i32, b: i32) -> i32{
a + b
}
위 코드는 main함수에서 add 함수에 5와 10을 전달하고 a + b의 값을 반환받아 값 15를 sum 변수에 대입한 후 println!를 이용해 “5와 10의 합은: 15″라고 화면에 출력하는 것입니다.

🔸 if 표현식
Rust에서 if는 표현식이며, 값으로 사용할 수 있습니다. 다시 말해 let 예약어를 이용해 변수에 if 표현식으로 결정되는 값을 변수에 대입할 수 있습니다.
fn main() {
let score = 85;
let grade = if score >= 90 {
"A"
} else if score >= 80 {
"B"
} else {
"C"
};
println!("성적: {grade}");
}
- if는 블록의 결과를 반환합니다.
- 각 분기의 결과는 같은 타입이어야 합니다.
- 위 코드를 실행하면 score가 90보다 작고, 80보다 크므로 “성적: B”가 화면에 출력됩니다.
🔶 match 표현식
match는 패턴 매칭을 제공하는 강력한 제어문입니다.
fn main() {
let number = 3;
match number {
1 => println!("하나"),
2 => println!("둘"),
3 => println!("셋"),
_ => println!("기타"),
}
}
- _는 위에 해당하지 않는 모든 경우를 의미하는 와일드카드입니다. ‘아무거나(any value)’라고 이해하면 편합니다.
- 각 분기(arm)에는 =>로 실행 코드를 지정합니다(The => operator that separates the pattern and the code to run).
- println!를 사용했는데도 ;을 붙이지 않는 점을 주의해야 합니다.
- 위 코드를 실행하면 “셋”이라고 화면에 표시됩니다.
- match는 반드시 모든 경우를 처리해야 합니다.
다시 말해 _가 없으면 “i32 형식에 해당하는 수 중 1,2,3만 처리해서 i32의 최소값부터 0까지와 4부터 i32의 최대값은 커버하지 못했다”고 하는 non-exaustive patterns(총망라 하지 않은 패턴) 에러가 표시됩니다.

또한 아래와 같이 _를 맨 위에 놓으면 ‘모든 경우’가 되므로, number의 값이 1이거나 2 또는 3이더라도 “기타”를 출력하게 됩니다. 1,2,3이 아닌 4인 경우 “기타”를 출력하는 것은 너무나 당연합니다.
fn main() {
let number = 3;
match number {
_ => println!("기타"),
1 => println!("하나"),
2 => println!("둘"),
3 => println!("셋"),
}
}
📌 match를 값으로 사용하기
fn main() {
let day = 3;
let weekday = match day {
1 => "월요일",
2 => "화요일",
3 => "수요일",
_ => "기타",
};
println!("요일: {}", weekday);
}
- match는 if와 마찬가지로 표현식이므로 변수에 바로 match 표현식의 결과 값을 할당할 수 있습니다.
- 이전 예에서는 => 다음에 println!를 사용했는데, 여기서는 “화요일” 등의 반환값을 지정한 점이 다릅니다.
- 위 코드를 실행하면 “요일: 수요일”이 출력됩니다.
🧠 요약
- 함수는 fn으로 정의하며, 매개변수와 반환 타입 지정 가능
- if와 match는 모두 표현식으로, 값을 반환할 수 있음
- match는 매우 강력한 패턴 매칭 도구이며, 모든 경우를 반드시 다뤄야 함