홈강좌Rust 입문·중급 47편 중 10편째
Rust 함수 — fn 으로 만들고 매개변수에는 타입을 적는다
Rust 함수는 fn 이름(매개변수: 타입) { … } 으로 만든다. 매개변수에는 타입을 반드시 적고, 부를 때는 그 개수와 타입대로 값을 넘긴다. 개수가 모자라면 E0061 로 컴파일이 멈추고, 빠진 자리를 컴파일러가 짚어 준다.
01 fn 으로 만들고 이름으로 부른다
인사하는 함수 셋을 만들어 main 에서 불러 보자.
fn main() {
say_hello();
greet("Ferris");
greet("Rust");
print_sum(3, 4);
}
fn say_hello() {
println!("Hello!");
}
fn greet(name: &str) {
println!("Hello, {name}!");
}
fn print_sum(a: i32, b: i32) {
println!("{a} + {b} = {}", a + b);
} Compiling greet v0.1.0 (~/projects/greet)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.16s
Running `target/debug/greet`
Hello!
Hello, Ferris!
Hello, Rust!
3 + 4 = 7fn say_hello() { … }는 매개변수가 없는 함수다.say_hello();로 부른다.fn greet(name: &str)은 값을 하나 받는다. 괄호 안의name이 매개변수이고, 부를 때 넘긴"Ferris"가 그 자리에 들어간다.&str은 문자열을 받을 때 쓰는 타입이다(20편에서 자세히).fn print_sum(a: i32, b: i32)처럼 여럿이면 쉼표로 늘어놓는다. 매개변수마다 타입을 적는다.
함수 이름은 say_hello 처럼 소문자와 밑줄로 쓴다. 정의한 위치는 상관없다. main 아래에 만든 함수를 main 에서 불러도 된다.
02 매개변수에는 타입을 꼭 적는다
변수는 타입을 안 적어도 컴파일러가 값을 보고 정했다(5편). 매개변수는 다르다. 반드시 적는다. 함수 첫 줄만 보고도 무엇을 넘겨야 하는지 알 수 있게 하려는 규칙이다. 덕분에 함수 안에서는 타입을 거의 적지 않아도 된다.
03 개수가 틀리면 E0061
print_sum 은 값을 둘 받는데 하나만 넘겨 보자.
fn main() {
print_sum(3);
}
fn print_sum(a: i32, b: i32) {
println!("{a} + {b} = {}", a + b);
}error[E0061]: this function takes 2 arguments but 1 argument was supplied
--> src/main.rs:2:5
|
2 | print_sum(3);
| ^^^^^^^^^--- argument #2 of type `i32` is missing
|
note: function defined here
--> src/main.rs:5:4
|
5 | fn print_sum(a: i32, b: i32) {
| ^^^^^^^^^ ------
help: provide the argument
|
2 | print_sum(3, /* i32 */);
| +++++++++++- 무엇 — 이 함수는 인자(argument) 2개를 받는데 1개만 넘겼다. 부를 때 넘기는 값을 인자라 한다.
- 어디 — 2번째 줄
print_sum(3).---밑의 설명대로i32타입의 두 번째 인자가 빠졌다. - 고치는 법 —
note:가 함수가 정의된 5번째 줄을 보여 주고,help:가print_sum(3, /* i32 */)처럼 빈자리를 채우라고 한다./* i32 */는 "여기에 i32 값을 넣어라" 는 자리 표시다.
이번 오류는 두 곳(부른 곳과 정의한 곳)을 함께 보여 줬다. 오류가 여러 파일·여러 줄에 걸치면 --> 줄이 여러 번 나온다. 하나씩 따라가면 된다.
04 실습 — 내 함수 만들기
fn-basic 에 함수 하나를 더 만들어 보자. 예를 들어 이름과 나이를 받아 "Ferris is 9 years old" 처럼 찍는 introduce(name: &str, age: u8) 이다. main 에서 두세 번 불러 다른 사람을 소개해 본다.
다 되면 일부러 인자 순서를 바꿔 introduce(9, "Ferris") 로 불러 보자. 이번에는 개수는 맞고 타입이 틀렸으니 E0061 이 아니라 다른 오류가 난다. 세 군데로 읽어 보면 무엇이 틀렸는지 바로 보인다. 지금까지의 함수는 무언가를 찍기만 했다. 다음 편에서는 함수가 계산한 값을 돌려주는 법을 다룬다.