[Rust] 함수(Functions) 이해하기: 선언부터 반환값까지
Rust 프로그래밍의 핵심 구성 요소인 함수에 대해 알아볼게. Rust에서 함수는 어디에나 있고, 우리가 이미 사용해 본 main 함수도 그중 하나야.
함수 선언과 호출
Rust에서 함수를 새로 만들 때는 fn이라는 키워드를 사용해.
명명 규칙: 스네이크 케이스(snake case)
Rust는 함수와 변수 이름을 지을 때 관례적으로 스네이크 케이스를 사용해. 모든 글자를 소문자로 쓰고, 단어 사이를 밑줄(_)로 연결하는 방식이지.
예:
my_function_name,another_function
코드 구조
함수는 fn 키워드 뒤에 함수 이름과 괄호()를 붙여서 정의해. 실제 동작하는 코드는 중괄호{} 안에 작성하면 돼.
fn main() {
println!("Hello, world!");
another_function(); // 함수 호출!
}
fn another_function() {
println!("Another function.");
}
재미있는 점: another_function이 main 함수보다 뒤에 정의되어 있어도 상관없어. Rust는 호출하는 쪽에서 볼 수 있는 범위(scope) 안에만 함수가 정의되어 있다면, 그 위치가 앞이든 뒤든 신경 쓰지 않거든.
매개변수(Parameters)
함수에 특정 데이터를 전달하고 싶을 때 매개변수를 사용해. 매개변수는 함수의 시그니처(Signature), 즉 함수의 '명함'과 같은 부분에 선언돼.
fn main() {
print_labeled_measurement(5, 'h');
}
fn print_labeled_measurement(value: i32, unit_label: char) {
println!("The measurement is: {value}{unit_label}");
}
타입 선언은 필수!
함수를 정의할 때 각 매개변수의 타입은 반드시 명시해야 해. (예: value: i32). 이건 Rust 설계자들의 의도적인 결정이야. 덕분에 컴파일러는 함수 외부의 코드를 일일이 뒤지지 않아도 이 함수가 무엇을 원하는지 바로 알 수 있고, 에러 메시지도 훨씬 친절하게 띄워줄 수 있어.
구문(Statements)과 표현식(Expressions)
이 부분이 Rust를 처음 접할 때 가장 헷갈릴 수 있는 부분이야. Rust는 표현식 기반 언어이기 때문에 이 둘의 차이를 아는 게 중요해.
| 구분 | 설명 | 예시 |
|---|---|---|
| 구문(Statement) | 어떤 동작을 수행하지만, 값을 반환하지 않음 | let y = 6; |
| 표현식(Expression) | 계산을 통해 결과값을 만들어냄 | 5 + 6, x + 1 |
주의할 점
Rust에서는 let x = (let y = 6); 같은 코드가 작동하지 않아. let y = 6은 구문이라서 돌려줄 값이 없기 때문이지. 반면, 중괄호로 묶인 블록은 그 자체로 표현식이 될 수 있어.
let y = {
let x = 3;
x + 1 // 세미콜론이 없음에 주목!
};
// y에는 4가 저장됨
위 예시에서 x + 1 뒤에 세미콜론을 붙이지 않았지? 세미콜론이 없어야 이 값이 블록의 최종 결과값(표현식)이 되어 밖으로 전달돼.
반환값을 가지는 함수
함수가 작업 결과를 호출한 곳으로 돌려줄 때 사용해. 반환할 값의 타입은 화살표(->) 뒤에 적어줘.
fn plus_one(x: i32) -> i32 {
x + 1 // 세미콜론 없음 = 이 값을 반환하겠다는 뜻
}
fn main() {
let x = plus_one(5);
println!("The value of x is: {x}"); // 6 출력
}
암시적 반환 vs 명시적 반환
- 암시적 반환: 함수 본문의 마지막 줄에 세미콜론 없이 표현식을 적으면 그 값이 자동으로 반환돼. Rust에서는 이 방식을 주로 써.
- 명시적 반환:
return키워드를 사용하면 함수 중간에라도 값을 즉시 반환하고 종료할 수 있어.
만약 x + 1; 처럼 세미콜론을 붙이면?
그건 표현식이 아니라 구문이 되어버려. 값을 반환하지 않는다는 뜻의 빈 괄호 () (유닛 타입)를 반환하게 되고, 컴파일러는 "i32를 기대했는데 왜 아무것도 안 줘?"라며 에러를 낼 거야.
요약
- 함수는
fn키워드와 스네이크 케이스를 사용해 정의한다. - 매개변수 선언 시 타입 명시는 필수다.
- 구문(Statement)은 값을 반환하지 않고, 표현식(Expression)은 값을 반환한다.
- 함수의 마지막 줄에 세미콜론 없이 표현식을 적으면 그게 곧 반환값이 된다.