Rust는 메모리 안정성과 성능을 강조하는 시스템 프로그래밍 언어로, 함수는 Rust의 필수 구성 요소입니다. 본 글에서는 Rust 함수의 정의, 사용법, 그리고 고급 활용 방법에 대해 자세히 알아봅니다. 함수는 Rust뿐만 아니라 타 프로그래밍에서도 매우 중요한 주제입니다. 타 프로그래밍 경험이 많다면 Rust에서의 함수 역시 어렵지 않게 익힐 수 있을 것입니다.
1. Rust 함수의 기본 개념
함수 정의와 구조
Rust에서 함수는 프로그램의 구성 요소로, 코드를 구조화하고 재사용성을 높이는 데 핵심적인 역할을 합니다. Rust 함수는 fn
키워드** 로 정의되며, 아래와 같은 기본 구조를 가집니다.
fn 함수이름(매개변수: 타입) -> 반환타입 {
// 함수 본문
반환값
}
fn
: 함수 정의를 위한 키워드.함수이름
: 함수의 이름. 관례적으로 소문자와 밑줄(_
)을 사용.매개변수: 타입
: 함수로 전달되는 값과 그 데이터 타입.-> 반환타입
: 함수가 반환하는 값의 타입(생략 가능).
함수 호출 예제
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let sum = add(5, 3);
println!("합계는: {}", sum);
}
2. Rust 함수의 주요 특징
2.1 반환값과 세미콜론
Rust에서는 함수의 마지막 표현식이 반환값이 됩니다. 세미콜론(;
)이 없으면 해당 값이 반환됩니다.
fn square(x: i32) -> i32 {
x * x // 세미콜론 없음: 반환값
}
2.2 매개변수
함수는 고정된 타입의 매개변수를 받습니다.
fn greet(name: &str) {
println!("안녕하세요, {}!", name);
}
3. Rust 함수의 고급 활용
3.1 가변 매개변수
매개변수를 수정하려면 mut
키워드를 사용합니다:
fn increment(mut num: i32) -> i32 {
num += 1;
num
}
3.2 클로저
Rust의 클로저는 익명 함수로, 주변 스코프의 변수를 캡처할 수 있습니다.
fn main() {
let multiplier = 2;
let multiply = |x: i32| x * multiplier;
println!("3 * 2 = {}", multiply(3));
}
3.3 재귀 함수
Rust는 재귀를 지원합니다. 하지만 스택 오버플로우를 방지하기 위해 주의가 필요합니다.
fn factorial(n: u32) -> u32 {
if n == 0 { 1 } else { n * factorial(n - 1) }
}
4. Rust 함수와 Ownership
4.1 소유권 이동
함수는 매개변수를 받을 때 소유권을 이동시킬 수 있습니다.
fn takes_ownership(s: String) {
println!("{}", s);
}
fn main() {
let my_string = String::from("Rust");
takes_ownership(my_string);
// my_string은 더 이상 사용 불가
}
4.2 참조와 빌림
소유권을 유지하면서 데이터를 함수에 전달하려면 참조를 사용합니다.
fn print_length(s: &String) {
println!("길이: {}", s.len());
}
fn main() {
let s = String::from("안녕하세요");
print_length(&s);
}
5. 자주 묻는 질문 (F&Q)
Q1. Rust 함수에서 기본값을 설정할 수 있나요?
아니요. Rust 함수는 기본 매개변수값을 지원하지 않습니다. 이를 해결하려면 Option
또는 함수 오버로딩을 사용하세요.
fn greet(name: Option<&str>) {
match name {
Some(n) => println!("안녕하세요, {}!", n),
None => println!("안녕하세요!"),
}
}
Q2. Rust에서 함수 오버로딩이 가능한가요?
Rust는 함수 오버로딩을 지원하지 않습니다. 대신, 제네릭(Generic)이나 트레이트(Trait)를 활용할 수 있습니다.
6. 최적화를 위한 팁
inline
속성 사용 : 짧고 자주 호출되는 함수는 컴파일러 최적화를 위해#[inline]
속성을 사용할 수 있습니다.- 재사용성 극대화 : 클로저와 제네릭을 활용해 중복을 줄이세요.
- 코드 읽기 쉬움 : 주석과 적절한 함수 이름을 사용하세요.