Rust 함수
함수는 이름이 붙은, 다시 쓸 수 있는 코드 묶음이에요. 같은 작업을 몇 번이고 다시 쓰는 대신, 한 번 함수로 만들어 두고 필요할 때마다 호출하면 돼요. 사실 여러분은 이미 함수를 하나 쓰고 있었어요. 바로 main이에요.
함수 정의하고 호출하기
섹션 제목: “함수 정의하고 호출하기”함수는 fn으로 정의하고, 이름 뒤에 ()를 붙여서 호출해요.
fn greet() { println!("함수에서 보내는 인사예요!");}
fn main() { greet(); // 호출하기 greet(); // 한 번 더 호출하기}실행 결과:
함수에서 보내는 인사예요!함수에서 보내는 인사예요!매개변수: 함수에 입력 넘기기
섹션 제목: “매개변수: 함수에 입력 넘기기”함수는 작업할 데이터를 넘겨받을 때 진짜 쓸모가 생겨요. 이런 입력을 매개변수(parameter)라고 해요. Rust에서는 매개변수마다 타입을 반드시 적어야 해요.
fn greet(name: &str) { println!("안녕하세요, {name}님!");}
fn main() { greet("민수"); greet("지영");}실행 결과:
안녕하세요, 민수님!안녕하세요, 지영님!매개변수는 필요한 만큼 쉼표로 구분해서 여러 개 둘 수 있어요.
fn describe(name: &str, age: u32) { println!("{name}의 나이는 {age}살이에요");}
fn main() { describe("Ferris", 10);}실행 결과:
Ferris의 나이는 10살이에요넘겨준 값은 순서대로 매개변수에 들어가요. 첫 번째 값은 name에, 두 번째 값은 age에 들어가요. describe(10, "Ferris")처럼 순서를 바꿔서 넘기면 타입이 맞지 않아서 컴파일 에러가 나요.
값 반환하기
섹션 제목: “값 반환하기”함수는 자신을 호출한 쪽에 값을 돌려줄 수 있어요. 반환 타입은 화살표 -> 뒤에 적어요.
fn add(a: i32, b: i32) -> i32 { a + b}
fn main() { let sum = add(3, 4); println!("3 + 4 = {sum}");}실행 결과:
3 + 4 = 7세미콜론 규칙 (중요해요!)
섹션 제목: “세미콜론 규칙 (중요해요!)”위 예제의 a + b에는 세미콜론이 없다는 점을 눈여겨보세요. 이게 Rust의 핵심 개념이에요.
- 세미콜론이 없는 표현식은 반환되는 값이에요.
- 세미콜론을 붙이면 아무것도 돌려주지 않는 구문(statement)이 돼요.
그래서 이 코드는 동작하지 않아요.
fn add(a: i32, b: i32) -> i32 { a + b; // ❌ 세미콜론은 "아무것도 반환하지 않음"이라는 뜻이에요. 하지만 i32를 반환하기로 약속했죠}컴파일러는 이 함수가 i32를 반환해야 하는데 반환하지 않는다고 알려 줘요. 마지막 줄의 세미콜론만 지우면 돼요.
모두 합쳐 보기
섹션 제목: “모두 합쳐 보기”fn square(n: i32) -> i32 { n * n}
fn main() { let result = square(5); println!("5의 제곱 = {result}");}실행 결과:
5의 제곱 = 25연습 문제
섹션 제목: “연습 문제”1. 섭씨를 화씨로
섹션 제목: “1. 섭씨를 화씨로”섭씨 온도를 f64로 받아서 화씨로 바꿔 돌려주는 to_fahrenheit 함수를 작성하세요. 공식은 c * 9.0 / 5.0 + 32.0이에요. 0도, 100도, 37도로 호출해 보세요. 힌트: 시그니처는 fn to_fahrenheit(c: f64) -> f64이고, 본문은 세미콜론 없는 표현식 하나예요.
정답 보기
fn to_fahrenheit(c: f64) -> f64 { c * 9.0 / 5.0 + 32.0}
fn main() { println!("섭씨 0도 = 화씨 {}도", to_fahrenheit(0.0)); println!("섭씨 100도 = 화씨 {}도", to_fahrenheit(100.0)); println!("섭씨 37도 = 화씨 {}도", to_fahrenheit(37.0));}실행 결과:
섭씨 0도 = 화씨 32도섭씨 100도 = 화씨 212도섭씨 37도 = 화씨 98.6도0이 아니라 0.0을 넘긴다는 점에 주의하세요. 매개변수가 f64인데, Rust는 정수를 몰래 실수로 바꿔 주지 않아요. 또 f64에 소수 부분이 없으면 {}는 .0 없이 출력해요. 그래서 32.0이 아니라 32가 보이는 거예요.
2. 셋 중 가장 큰 수
섹션 제목: “2. 셋 중 가장 큰 수”세 숫자 중 가장 큰 수를 돌려주는 함수 largest(a: i32, b: i32, c: i32) -> i32를 작성하세요. (3, 9, 4)와 (-2, -8, -5)로 테스트해 보세요. 힌트: Rust에서 if는 표현식이에요(if…else 참고). 그래서 if / else if / else 묶음 전체가 함수의 마지막 줄이 될 수 있어요.
정답 보기
fn largest(a: i32, b: i32, c: i32) -> i32 { if a >= b && a >= c { a } else if b >= c { b } else { c }}
fn main() { println!("{}", largest(3, 9, 4)); println!("{}", largest(-2, -8, -5));}실행 결과:
9-2어느 분기도 세미콜론으로 끝나지 않아요. 각 분기는 표현식이고, if 묶음 전체가 그중 하나를 돌려주며, 그 값이 반환값이 돼요. > 대신 >=를 쓰면 같은 값이 있을 때도 반드시 값을 돌려줄 수 있어요.
- 함수는
fn으로 정의하고이름()으로 호출해요. - 매개변수는 입력이고, 각각 타입이 필요해요:
fn greet(name: &str). - 반환 타입은
-> 타입으로 선언해요. - 세미콜론이 없는 마지막 표현식이 반환값이에요.
return 값;도 동작하지만, 보통은 함수를 일찍 끝낼 때만 써요.
이해도 점검
섹션 제목: “이해도 점검”이해도 점검
1. Rust에서 함수의 매개변수마다 타입을 적어야 할까요?
2. 함수의 반환 타입은 어떻게 선언할까요?
3. 함수 끝에 있는 a + b(세미콜론 없음)가 반환값이 되는 이유는 무엇일까요?
4. 함수를 호출하는 곳보다 위에 정의하든 아래에 정의하든(예: main 위 또는 아래) 상관있을까요?
점수: 0 / 4
더 알아보기
섹션 제목: “더 알아보기”- 함수 — The Rust Programming Language 한국어판: 매개변수, 반환값, 구문과 표현식을 다루는 공식 장이에요.
- 구문과 표현식 — The Rust Programming Language 한국어판: 세미콜론 규칙 뒤에 있는 개념을 더 자세히 살펴봐요.
- Functions — Rust by Example (영어): 일찍
return하는 함수, 아무것도 반환하지 않는 함수 등 실행해 볼 수 있는 예제가 있어요. - Functions — The Rust Reference (영어): 함수를 정의하는 정확한 규칙이에요. 세세한 부분까지 알고 싶을 때 보세요.
fn키워드 — 표준 라이브러리 문서 (영어): 함수 문법을 예제와 함께 짧게 정리해 두었어요.