Rust의 함수
Rust도 역시 다른 함수와 마찬가지로 main
함수가 프로그램의 시작 지점이다.
또한, fn
키워드를 통해 새로운 함수를 선언할 수 있다.
Rust의 코드는 snake case 라는 스타일 규칙으로 변수나 함수 이름을 사용하도록 하고 있다.
snake case는 모든 문자를 소문자로 사용하며, 언더바(_
)로 단어를 구분하는 스타일이다.
함수를 선언하고 실행해보자.
소스코드
fn main() {
my_func();
println!("my_func has been called.");
}
fn my_func() {
let name = "ykjeon";
let age = 22;
println!("Hello, my name is {name}. I'm {age}.");
}
실행 결과
함수 선언은 fn
으로 시작하며 중괄호({}
)를 통해 함수의 시작과 종료 지점을 컴파일러에게 알려주게 된다.
위 코드에서 눈치 챘을 수 있지만, main
함수에서 호출한 my_func
함수가 main
함수 아래에 선언되어 있는 것을 볼 수 있다.
C언어와 같은 언어에서는 에러가 발생했겠지만, Rust는 함수의 위치를 신경쓰지 않아 정상적으로 실행된다.
함수 매개변수
다른 프로그래밍 언어처럼, 매개변수를 갖는 함수를 선언할 수 있다.
참고로, 전달인자는 실제로 함수를 호출할 때 전달하는 값을 이야기하고, 매개변수는 입력으로 받을 값을 지정하는 변수이다.
소스코드
fn main() {
my_func(22);
}
fn my_func(x: i32) {
println!("I'm {x} years old.");
}
실행 결과
매개변수를 선언해줄 때는 반드시 각 매개변수의 타입을 정의해주어야 한다.
여러 매개변수를 사용할 때에는 다음과 같이 쉼표로 구분해 사용할 수 있다.
fn main() {
my_func("ykjeon", 22);
}
fn my_func(x: &str, y: i32) {
println!("My name is {x}. I'm {y} years old.");
}
실행 결과
함수의 구문과 표현식
구문은 값을 반환하지 않고, 어떤 동작을 수행하는 명령들의 집합이다.
즉, 무언가를 실행하지만 결과값을 내놓지 않는다.
표현식은 구문과 반대로 어떤 결과값을 만들어낸다.
예를 들어 구문은 다음이 될 수 있다.
fn main() {
let y = 6;
}
이처럼 변수를 정의하고 값을 할당하는 것, 함수를 정의하는 것은 값을 반환하지 않으므로 구문이라고 할 수 있다.
다음 코드 예제를 살펴보자.
fn main() {
let x = (let y = 6);
}
실행해보면 다음과 같은 에러가 발생한다.
에러 발생 원인은 let y = 6
구문이 반환 값이 없어 x
에 bind 할 것이 없기 때문이다.
함수를 호출하는 것은 표현식이다. 매크로를 호출하는 것도 표현식이다.
아래의 코드처럼 새로운 범위를 생성하는데 사용하는 {}
도 표현식이다.
fn main() {
let x = 5;
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {}", y);
}
실행 결과를 확인해보자.
y의 값이 4
가 된 것을 확인할 수 있다.
위 코드에서 주목해야 할 점은 x+1
줄이 세미콜론으로 끝나지 않았다는 점이다.
표현식은 종결을 나타내는 세미콜론을 사용하지 않는다.
만약 표현식 마지막에 추가하면, 이는 반환 값이 없는 구문이 되게 된다.
반환 값을 갖는 함수
Rust에서 함수를 통해 값을 반환하기 위해서는 먼저 반환 값의 타입을 명시해주어야 한다.
이 때, ->
라는 화살표 뒤에 타입을 선언해주며, 반환 값은 함수 내 마지막 표현식 값과 동일하다.
return
키워드를 통해 일찍 값을 반환할 수 있지만, 대부분 함수들은 암묵적으로 마지막 표현식을 반환한다.
아래 예제 코드를 살펴보자.
fn sub(a: i32) -> i32 {
10 - a
}
fn main() {
let x = sub(3);
println!("The value of x is: {}", x);
}
먼저 number
함수에 10
이라는 인자를 전달해 주었고, 이 값은 i32
타입이다.
number
함수 안에는 a - 3
이라는 코드가 있는데, ;
이 붙어있지 않은 것을 볼 수 있다.
이는 반환하고자 할 때 사용하는 표현식으로, 해당 코드의 결과값이 함수의 반환값이 되는 것이다.
해당 코드의 실행 결과를 살펴보면 예상했던 것과 동일하게 작동하는 것을 확인할 수 있다.
만약, 반환되는 값이 있다고 반환 값의 타입을 명시해 주었지만, 반환값이 없다면 에러가 발생하게 된다.
(아래 코드에서 10 - a
에 ;
을 붙여주면서 구문으로 바꾸어 주었다.)
fn sub(a: i32) -> i32 {
10 - a;
}
fn main() {
let x = sub(3);
println!("The value of x is: {}", x);
}
'Programming Language > RUST' 카테고리의 다른 글
[Rustling] exercises/01_variables/variables6.rs 풀기 (0) | 2024.10.11 |
---|---|
[Rustling] exercises/01_variables/variables5.rs 풀기 (0) | 2024.10.11 |
[Restling] exercises/01_variables/variables4.rs 풀기 (0) | 2024.10.11 |
[Rustling] exercises/01_variables/variables3.rs 풀기 (0) | 2024.10.11 |
[Rustling] exercises/01_variables/variables2.rs 풀기 (0) | 2024.10.11 |