hyunsu blog

홈강좌Rust 입문·중급 47편 중 10편째

Rust 함수 — fn 으로 만들고 매개변수에는 타입을 적는다

목차 · 4
  1. 01fn 으로 만들고 이름으로 부른다
  2. 02매개변수에는 타입을 꼭 적는다
  3. 03개수가 틀리면 E0061
  4. 04실습 — 내 함수 만들기

Rust 함수는 fn 이름(매개변수: 타입) { … } 으로 만든다. 매개변수에는 타입을 반드시 적고, 부를 때는 그 개수와 타입대로 값을 넘긴다. 개수가 모자라면 E0061 로 컴파일이 멈추고, 빠진 자리를 컴파일러가 짚어 준다.

01 fn 으로 만들고 이름으로 부른다

인사하는 함수 셋을 만들어 main 에서 불러 보자.

rust
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);
}
text
   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 = 7
  • fn 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 은 값을 둘 받는데 하나만 넘겨 보자.

rust
fn main() {
    print_sum(3);
}

fn print_sum(a: i32, b: i32) {
    println!("{a} + {b} = {}", a + b);
}
text
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 */);
  |                +++++++++++
  1. 무엇 — 이 함수는 인자(argument) 2개를 받는데 1개만 넘겼다. 부를 때 넘기는 값을 인자라 한다.
  2. 어디 — 2번째 줄 print_sum(3). --- 밑의 설명대로 i32 타입의 두 번째 인자가 빠졌다.
  3. 고치는 법 — 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 이 아니라 다른 오류가 난다. 세 군데로 읽어 보면 무엇이 틀렸는지 바로 보인다. 지금까지의 함수는 무언가를 찍기만 했다. 다음 편에서는 함수가 계산한 값을 돌려주는 법을 다룬다.