러스트에서 함수는 코드의 재사용성과 구조를 높이는 중요한 개념입니다. 함수는 특정 작업을 수행하거나 값을 계산하는 코드 블록을 정의하고, 필요할 때마다 호출하여 실행할 수 있습니다. 러스트의 함수는 매우 정형화된 구조를 가지고 있으며, 함수 정의, 매개변수, 반환 타입 등에 대한 명시적인 선언이 필요합니다.
1. 함수 정의
러스트에서 함수는 fn
키워드를 사용하여 정의합니다. 함수 이름은 일반적으로 소문자와 언더스코어(_
)를 사용하여 작성하며, 함수의 매개변수와 반환 타입을 명시할 수 있습니다.
fn main() {
say_hello(); // 함수 호출
}
// 간단한 함수 정의
fn say_hello() {
println!("Hello, world!");
}
2. 매개변수와 반환 타입이 있는 함수
러스트의 함수는 매개변수를 받아서 처리할 수 있으며, 함수의 반환 타입을 명시할 수 있습니다. 반환 타입은 ->
뒤에 적습니다.
fn main() {
let sum = add(5, 3);
println!("Sum: {}", sum);
}
// 매개변수와 반환 타입이 있는 함수
fn add(x: i32, y: i32) -> i32 {
x + y // 세미콜론이 없으면 이 값이 반환됩니다.
}
3. 함수의 특징
- 매개변수: 함수의 매개변수는 타입을 명시해야 합니다. 예를 들어,
fn add(x: i32, y: i32) -> i32
에서x
와y
는i32
타입입니다. - 반환 타입: 함수의 반환 타입은
->
기호를 사용하여 지정합니다. 반환값이 있는 경우, 마지막 표현식에 세미콜론을 사용하지 않으며, 그 표현식의 결과가 반환됩니다. - 반환값이 없는 함수: 반환 타입이 없으면
()
(유닛 타입)입니다. 이때는 반환 타입을 명시하지 않아도 됩니다.
4. 반환값이 없는 함수 (유닛 타입)
fn main() {
print_message("Rust is awesome!");
}
// 반환값이 없는 함수
fn print_message(message: &str) {
println!("{}", message);
}
print_message
함수는 문자열 슬라이스(&str
)를 매개변수로 받고, 값을 반환하지 않습니다. 이때 반환 타입은 생략될 수 있으며, 러스트는 자동으로 유닛 타입 ()
을 반환합니다.
5. 여러 값을 반환하는 함수 (튜플 사용)
러스트는 여러 개의 값을 한꺼번에 반환할 때 튜플을 사용할 수 있습니다.
fn main() {
let (quotient, remainder) = divide(10, 3);
println!("Quotient: {}, Remainder: {}", quotient, remainder);
}
// 튜플을 사용하여 여러 값을 반환하는 함수
fn divide(x: i32, y: i32) -> (i32, i32) {
(x / y, x % y)
}
divide
함수는 나눗셈의 몫과 나머지를 튜플 형태로 반환합니다. 이를 통해 여러 값을 한 번에 처리할 수 있습니다.
6. 함수의 반환값을 명시적으로 지정하기 (return
키워드)
일반적으로 러스트에서는 마지막 표현식의 결과가 반환되지만, return
키워드를 사용하여 명시적으로 값을 반환할 수도 있습니다.
fn main() {
let result = multiply(4, 5);
println!("Result: {}", result);
}
// return 키워드를 사용하여 명시적으로 반환하는 함수
fn multiply(x: i32, y: i32) -> i32 {
return x * y;
}
multiply
함수에서 return
키워드를 사용해 x * y
의 결과를 명시적으로 반환합니다. 이 방법은 가독성을 높이거나, 특정 조건에서 조기 반환을 할 때 유용합니다.
7. 함수 내에서 조건문 사용하기
함수는 내부에서 조건문을 사용해 로직을 더 유연하게 구성할 수 있습니다.
fn main() {
let result = max(10, 20);
println!("Max value: {}", result);
}
// 조건문을 사용하는 함수
fn max(a: i32, b: i32) -> i32 {
if a > b {
a
} else {
b
}
}
max
함수는 두 값을 비교하여 큰 값을 반환합니다. 이때 if
블록의 결과가 반환됩니다.
8. 재귀 함수
러스트에서는 함수가 자신을 호출할 수 있는 재귀 함수도 사용할 수 있습니다.
fn main() {
let result = factorial(5);
println!("Factorial: {}", result);
}
// 재귀 함수를 사용한 팩토리얼 계산
fn factorial(n: u32) -> u32 {
if n == 0 {
1
} else {
n * factorial(n - 1)
}
}
factorial
함수는 재귀적으로 자신을 호출하여 팩토리얼 값을 계산합니다. 이때, 종료 조건을 정확히 지정하지 않으면 스택 오버플로우가 발생할 수 있으므로 주의해야 합니다.
9. 클로저와 함수의 차이점
러스트에서는 클로저도 함수를 대체할 수 있는 유연한 표현식입니다. 클로저는 함수와 달리 주변의 변수 값을 캡처할 수 있으며, 함수와 비슷한 방식으로 호출할 수 있습니다. 클로저는 주로 일회성 작업이나 짧은 코드 블록을 함수처럼 처리할 때 사용됩니다.
fn main() {
let add = |x, y| x + y; // 클로저 정의
println!("Sum: {}", add(3, 4)); // 클로저 호출
}
10. 정리
- 러스트에서 함수는
fn
키워드를 사용해 정의하며, 매개변수와 반환 타입을 명시적으로 지정합니다. - 함수는 기본적으로 마지막 표현식의 결과를 반환하며,
return
키워드를 통해 명시적으로 반환할 수도 있습니다. - 여러 값을 반환할 때는 튜플을 사용할 수 있으며, 함수 내부에서 조건문과 재귀 등을 활용할 수 있습니다.
- 클로저는 함수처럼 동작하면서도 주변 변수에 접근할 수 있는 유연한 기능을 제공합니다.
'언어 > Rust' 카테고리의 다른 글
[ Rust ] cargo --doc - 주석으로 프로젝트 문서 작성하기 (0) | 2024.10.23 |
---|---|
[ Rust ] //, /**/, ///, //! - 주석 달기 (0) | 2024.10.23 |
[ Rust ] arrays - 동일한 데이터 타입을 묶어서 사용하기 (0) | 2024.10.23 |
[ Rust ] tuples - 다른 데이터 타입을 하나로 묶음으로 결학하기 (1) | 2024.10.23 |
[ Rust ] 유리수, 복소수, 없는 값 (null) 타입 (0) | 2024.09.08 |