Rust - 함수(fn)의 기본적인 사용법

Rust를 공부하면서 함수의 기본적인 사용법을 정리했습니다. Rust의 함수는 fn 키워드로 시작합니다. 실행 가능한 코드들은 일반적으로 main 함수 내에 있어야 하며, JS의 console.log처럼 사용할 수 있는 println! 매크로가 있습니다.

Rust - 함수(fn)의 기본적인 사용법
Photo by Pawel Czerwinski / Unsplash

언어에 대한 경험

먼저 개인적인 언어에 대한 경험 이렇습니다.

  • 타입스크립트(찍먹)
  • PHP(찍먹)
  • 파이썬(찍먹)
  • 자바스크립트

이 글은 언어에 대한 경험이 많지 않은 사람이 Rust를 공부하는 과정에서 정리하고 있으니 참고하시기 바랍니다.


함수의 기본형태

러스트 ~Rust~ 의 함수는 낯설기도하고 타입스크립트와 유사해 보이는 부분도 있습니다.
간단하게 두 숫자를 매개변수로 받아서 더하는 함수는 아래와 같습니다.

// main.rs
fn add(x: i32, y: i32) -> i32 {
    x + y
}

구체적으로 타입을 지정해줍니다.

함수는 fn으로 시작합니다.
매개변수와 리턴값에 각각 i32라고 타입을 명시해줍니다.
동적 언어인 자바스크립트만 쓰던 사람으로서는 꽤 낯선 형태입니다.

단순하게 number라고 지정해주는 타입스크립트와 달리, 러스트는 구체적인 사이즈를 지정해줍니다.

여기서 i32는 32비트 정수를 의미합니다.
rust에서 일반적으로 많이 쓰는 사이즈[1]라고 합니다.

다른 타입에 대해서 더 내용을 확인하고 싶다면 Rust - 데이터유형과 변수 포스팅을 참고하시기 바랍니다


함수의 실행

rust에서는 기본적으로 main 함수에서 시작해야합니다. 자바스크립트처럼 생각하고 console.log처럼 결과를 확인하고 싶었습니다.

그래서 println!매크로를 이용해서 아래와 같이 실행해봤습니다.

// main.rs
fn add(x: i32, y: i32) -> i32 {
    x + y
}
println!("{:?}", add(2,3));

이제 실행을 해봅니다.

cargo run main.rs // 실행 

오류메세지

오류메세지가 엄청나게 쏟아집니다.
자바스크립트로 계속 개발을 해오다보니 이렇게 상세한 오류메세지는 참 감동적입니다.

error: macro expansion ignores token `{` and any following
 --> /rustc/cc66ad468955717ab92600c770da8c1601a4ff33\library\std\src\macros.rs:136:23
  |
 ::: src\main.rs:4:1
  |
4 | println!("{:?}",add(2,3));
  | ------------------------- caused by the macro expansion here
  |
  = note: the usage of `println!` is likely invalid in item context

error[E0601]: `main` function not found in crate `func`
 --> src\main.rs:4:27
  |
4 | println!("{:?}",add(2,3));
  |                           ^ consider adding a `main` function to `src\main.rs`

For more information about this error, try `rustc --explain E0601`.
error: could not compile `func` (bin "func") due to 2 previous errors

매크로는 함수 안에서 사용

println! 매크로는 함수바깥 - global scope에서 독립적으로 사용될 수 없습니다.
일반적으로 실행 가능한 코드들은 함수 안에서 실행되야합니다.
그 중에서도 일반적으로 main 함수에서 사용됩니다.

이런 오류메세지의 내용을 반영해서 아래와 같이 다시 바꿔줬습니다.

// main.rs
fn add(x: i32, y: i32) -> i32 {
    x + y
}

fn main(){
    println!("{:?}", add(2,3));
}

cargo run 명령으로 main.rs 파일을 실행해보면 5라는 답을 얻을 수 있습니다. 정상적으로 작동하는 것을 확인할 수 있습니다.

// main.rs
fn add(x: i32, y: i32) -> i32 {
    x + y
}

fn main(){
    let x = add(2,3)
    println!("{:?}", x);
}

이런 식으로 add함수를 변수에 담아서 실행시키는 것도 가능합니다.
간단한 더하기 연산을 수행하는 함수라서 크게 설명할 것은 많지 않습니다.

자바스크립트와 달리 "{:?}[2]" 라는 방식으로 값을 받아 처리하는 부분이 있는데, 이 부분은 C언어나 파이썬이나 php에서도 유사하게 사용되는 방식입니다.

일반적으로 익숙해보이는 방식이 많이 사용되고 있어서 크게 낯선 인상은 아닙니다.


  1. "유데미 Rust Programming 핵심강의" ↩︎

  2. "{}과 {:?} 형태로 값을 받아 처리할 수 있다. 전자는 display용, 후자는 debug용" ↩︎