오늘은 Rust의 함수(function)에 대해 알아보고자 합니다.
함수
rust에서는 함수를 fn 키워드를 통해서 선언할 수 있습니다.
지금까지 사용했던 main도 마찬가지 입니다.
rust는 함수나 변수 이름을 스네이크 케이스(snake case) 방식을 주로 이용하는데, 이는 모든 글자를 소문자로 쓰고 밑줄(underscore)로 단어를 구분하는 방식을 이야기합니다.
fn main() {
println!("Hello, world!");
another_function();
}
fn another_function() {
println!("Another function.");
}
rust는 c언어와는 다르게 함수를 호출하는 위치를 고려하지 않으며, 호출하는 쪽에서 볼 수 있는 스코프 어딘가에 정의만 되어 있으면 됩니다.
매개변수
함수는 매개변수(parameter)를 갖도록 정의될 수 있고, 이는 함수 시그니처(function signiture)의 일부인 특별한 변수 입니다.
fn main() {
another_function(5);
}
fn another_function(x: i32) {
println!("The value of x is: {x}");
}
another_function은 x라는 이름의 i32 타입의 매개변수를 가지고 있습니다.
함수 시그니처에서는 각 매개변수의 타입을 반드시 선언해야합니다.
함수의 정의에 타입을 명시해두면, 이 함수를 다른 코드에서 사용할 때, 여러분이 의도한 타입을 컴파일러가 추측하지 않아도 됩니다.
구문과 표현식
함수 본문은 필요에 따라 표현식(expression)으로 끝나는 구문(statement)의 나열로 구성됩니다.
- 구문 : 어떤 동작을 수행하고 값을 반환하지 않는 명령
- 표현식 : 결과값을 평가
구문
let 키워드로 변수를 만들고 값을 할당하는 것은 구문입니다.
fn main() {
let y = 6;
}
구문은 값을 반환하지 않아, 다음과 같이 let 구문을 다른 변수에 할당하려고 하면 에러가 발생합니다.
fn main() {
let x = (let y = 6);
}
let y = 6 구문은 값을 반환하지 않으므로 x에 바인딩시킬 것이 없습니다.
다른 언어들에서는 x = y = 6과 같이 작성하여 x와 y에 값을 모두 대입할 수 있지만, rust는 그렇지 않습니다.
표현식
rust에서는 다음과 같이도 표현 가능합니다.
fn main() {
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {y}");
}
{
let x = 3;
x + 1
}
여기서 x + 1에는 세미콜론이 붙어있지 않습니다.
표현식의 종결을 나타내는 경우 세미콜론을 쓰지 않습니다. 만약 표현식의 끝에 세미콜론을 추가하면, 표현식은 구문이 되고 값을 반환하지 않게 됩니다.
반환 값을 갖는 함수
함수는 다른 언어들과 마찬가지로 반환값을 가질 수 있습니다.
반환 값을 가진 경우 화살표(->) 뒤에 선언하여 표현할 수 있습니다.
fn five() -> i32 {
5
}
fn main() {
let x = five();
println!("The value of x is: {x}");
}
five 함수에는 다른 함수 호출, 매크로, 심지어 변수를 선언하는 let 구분조차 없이 5라는 숫자만 하나 있습니다.
rust에서는 다음과 같이 작성된 함수도 유효한 함수가 됩니다.
여기서 5는 five 함수의 반환값입니다.
여기서 five함수에 5가 세미콜론 없이 외롭게 있는데, 그 이유는 이 값이 반환하려는 값에 대한 표현식이기 때문입니다.
fn main() {
let x = plus_one(5);
println!("The value of x is: {x}");
}
fn plus_one(x: i32) -> i32 {
x + 1
}
plus_one 함수는 x라는 값을 받고 x + 1에 대한 값을 반환하는 함수입니다. 여기서 x + 1에 세미콜론을 추가하게 되면 이는 표현식이 아닌 구문이 되어 에러가 발생합니다.
정리
- rust의 함수에서는 fn plus_one(x: i32) -> i32 다음과 같이 함수를 선언할 수 있고, 값을 받거나 반환하는 경우 타입을 선언해줘야 한다.
- 구문과 표현식
- 구문 : 어떤 동작을 수행하고 값을 반환하지 않는 명령 (ex : let x = 1)
- 표현식 : 결과값을 평가 (ex : let x = 1 + 5)
'Rust' 카테고리의 다른 글
Rust 설치부터 실행까지 (소유권) - 8 (0) | 2025.01.02 |
---|---|
Rust 설치부터 실행까지 (주석, 조건 반복문) - 7 (0) | 2024.12.30 |
Rust 설치부터 실행까지 (데이터 타입, 튜플, 어레이) - 5 (0) | 2024.12.28 |
Rust 설치부터 실행까지 (섀도어) - 4 (0) | 2024.12.26 |
Rust 설치부터 실행까지 (형변환 및 에러 처리) - 3 (0) | 2024.12.20 |
댓글