Rust 함수 정의와 호출 방식 (5)
1
함수 정의
함수는 프로그램에서 특정 작업을 수행하는 코드 블록입니다. 함수를 사용하면 코드의 재사용성과 가독성이 높아지므로 Rust 프로그래밍에서 매우 중요합니다. 이번에는 Rust에서 함수를 어떻게 정의하고 호출하는지 자세히 알아보겠습니다.
Rust에서 함수는 fn 키워드를 사용하여 정의합니다. 가장 기본적인 함수 정의 형태는 다음과 같습니다.
fn 함수이름() {
// 함수 본문 (body)
}
예를 들어 "Hello, World!"를 출력하는 간단한 함수는 다음과 같이 정의할 수 있습니다.
fn hello() {
println!("Hello, World!");
}
이렇게 정의된 hello 함수는 다른 곳에서 호출하여 사용할 수 있습니다.
매개변수 (Parameters)
함수는 매개변수(Parameter) 를 받을 수 있습니다. 매개변수는 함수에 입력값을 전달하는 방법입니다.
fn add(x: i32, y: i32) -> i32 {
x + y
}
위 예시에서 add 함수는 두 개의 i32 타입 매개변수 x와 y를 받습니다. 매개변수의 타입은 반드시 명시해야 합니다.
함수 정의에서 -> 기호 다음에 오는 i32는 반환 타입(Return Type) 을 나타냅니다. 이 함수는 두 매개변수의 합을 i32 타입의 값으로 반환합니다.
반환값 (Return Value)
Rust 함수는 반환값(Return Value) 을 가질 수 있습니다. 반환값은 return 키워드를 사용하여 지정할 수 있습니다.
fn factorial(n: u64) -> u64 {
if n == 0 {
return 1; // 0! = 1
}
n * factorial(n - 1)
}
위 코드는 팩토리얼 함수를 정의한 것입니다. n이 0이면 1을 반환하고, 그렇지 않으면 n * (n-1)!을 계산하여 반환합니다.
반환값은 return 키워드 없이 마지막 표현식의 값으로도 지정할 수 있습니다.
fn is_even(x: i32) -> bool {
x % 2 == 0 // 마지막 표현식의 값이 반환됨
}
위 코드에서 is_even 함수는 매개변수 x가 짝수이면 true, 홀수이면 false를 반환합니다.
반환값이 없는 함수는 () 빈 튜플을 반환 타입으로 사용합니다.
fn hello() -> () {
println!("Hello, World!");
}
Rust에서는 반환 타입이 () 빈 튜플인 함수의 반환값을 명시적으로 지정할 필요가 없습니다.
함수 호출
정의된 함수는 호출(Call) 하여 사용할 수 있습니다. 함수를 호출할 때는 함수 이름 뒤에 괄호를 붙이고, 필요한 경우 인수(Arguments)를 전달합니다.
fn main() {
hello(); // "Hello, World!" 출력
let sum = add(3, 5); // sum = 8
let six = factorial(3); // six = 6 (3! = 6)
let is_four_even = is_even(4); // is_four_even = true
}
위 코드에서 hello()는 인수 없이 호출되었고, add(3, 5)는 인수 3과 5를 전달하여 호출되었습니다.
함수 호출 시 인수(Arguments) 와 매개변수(Parameters) 의 개수와 타입이 일치해야 합니다. 일치하지 않으면 컴파일 에러가 발생합니다.
명명 규칙
Rust에서 함수 이름은 snake_case 스타일의 이름 지정 규칙을 따릅니다. 또한 함수 이름은 소문자로 시작해야 합니다.
fn my_function() { /* ... */ }
fn another_function() { /* ... */ }
일반적으로 함수 이름은 해당 함수의 역할을 잘 나타내도록 지어야 합니다. 명확한 이름을 사용하면 코드의 가독성이 높아집니다.
고급 기능
지금까지 살펴본 기본적인 함수 정의와 호출 방식 외에도 Rust에는 함수와 관련된 다양한 고급 기능이 있습니다.
매개변수 패턴 (Parameter Patterns)
Rust에서는 매개변수에 패턴(Pattern) 을 사용할 수 있습니다. 이를 통해 복잡한 데이터 구조를 분해할 수 있습니다.
fn print_coordinates((x, y): (i32, i32)) {
println!("Coordinates: ({}, {})", x, y);
}
위 코드에서 print_coordinates 함수는 (i32, i32) 타입의 튜플을 매개변수로 받습니다. 이때 튜플의 요소를 각각 x와 y라는 이름으로 사용할 수 있습니다.
패턴은 구조체, 열거형 등 다양한 타입에 사용할 수 있습니다.
제네릭 (Generics)
제네릭(Generics) 은 함수나 타입에서 사용할 구체적인 타입을 지연시키는 기능입니다. 이를 통해 하나의 함수 또는 타입 정의로 여러 타입을 다룰 수 있습니다.
fn reverse<T>(list: &mut Vec<T>) -> Vec<T>
where
T: Copy,
{
let mut rev = Vec::new();
for x in list.iter().rev() {
rev.push(*x);
}
rev
}
위 코드에서 reverse 함수는 Vec<T> 타입의 벡터를 뒤집어 새로운 벡터로 반환합니다. 이때 T는 제네릭 타입 매개변수로, 실제 타입은 함수 호출 시점에 결정됩니다.
where 절은 제네릭 타입 매개변수에 대한 제약조건(Trait Bounds) 을 지정합니다. 위 예시에서는 T가 Copy 트레잇을 구현해야 함을 나타냅니다.
제네릭은 Rust의 강력한 기능 중 하나로, 코드 재사용성과 안전성을 높여줍니다.
클로저 (Closures)
클로저(Closure) 는 익명 함수로, 코드 내에서 정의하고 변수에 할당하여 사용할 수 있습니다.
let add_two = |x| x + 2;
let sum = add_two(5); // sum = 7
위 코드에서 add_two는 클로저입니다. |x|는 매개변수 리스트, x + 2는 클로저의 본문(body)입니다.
클로저는 주변 환경의 값을 캡처(capture)할 수 있습니다. 이를 통해 상태를 유지하는 함수를 만들 수 있습니다.
let mut counter = 0;
let increment = || {
counter += 1;
counter
};
println!("{}", increment()); // 1
println!("{}", increment()); // 2
위 예시에서 increment 클로저는 counter 변수를 캡처하여 상태를 유지합니다.
클로저는 고차 함수와 함께 사용되어 함수형 프로그래밍 스타일을 가능하게 합니다.
Rust의 함수 정의와 호출 방식에는 다양한 기능과 유연성이 있습니다. 이번 장에서는 함수 정의 문법, 매개변수와 반환값, 함수 호출 방법 등 기본적인 내용을 살펴보았습니다. 또한 매개변수 패턴, 제네릭, 클로저 등 고급 기능도 소개했습니다. 함수는 프로그래밍의 핵심 요소이므로 이러한 개념과 기능을 잘 이해하고 활용하는 것이 중요합니다.
참고 자료
- 스티브 클래인버그, "The Rust Programming Language", No Starch Press, 2018.
- Rust 공식 문서, "Functions", https://doc.rust-lang.org/book/ch03-03-how-functions-work.html
- Michael Sampson, "Rust in Action", Manning Publications, 2021.
- Jim Blandy, Jason Orendorff, Leonora Tindall, "Programming Rust: Fast, Safe Systems Development", O'Reilly Media, 2021.
- "The Rust Reference", Rust 언어 참조 문서, https://doc.rust-lang.org/reference/
한 고대 문서 이야기
여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오
gospel79.tistory.com
유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법
올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을
stock79.tistory.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."