함수 동작 원리

Rust에서 fn은 함수를 정의하는 키워드이고, (대부분 언어에서)main 함수는 실행 시점이다.

fn main() {
	println!("Hello, world!");

	another_fn();
}

fn another_fn() {
	println!("Another function.");
}

Rust 함수 특징

  • 암묵적으로 스네이크 표기법(Snake case)를 사용
  • 함수 호출부 아래에 호출하려는 함수가 정의되어 있어도 호출 가능 즉, 정의만 되어있으면 됨

함수 매개변수(Parameter)

매개변수는 아래와 같이 타입과 함께 정의한다. 호출 시 매개변수(Parameters)를 상수 형태로써 전달인자(Arguments)로 제공한다.

매개변수 타입 정의를 통해 명확한 함수 사용과 함수에 의도를 추측하지 않게한다.

fn main() {
    another_function(5);
}

fn another_function(x: i32) {
    println!("The value of x is: {}", x);
}

구문과 표현식

지금까지 표현식 없는 함수만 다뤘기에, 표현식이 구문의 일부로 느낄 수 있다. Rust는 표현식 기반 언어로 구문과 표현식에 차이점을 이해하는 것이 중요히다.(다른 언어는 이와 같은 차이점이 없다.)

구문은 명령들의 나열로 값을 반환하지 않는다. 변수와 함수를 정의할 때가 그 예이다.

fn main() {
	// 구문을 통한 변수 y에 6 할당
	let y = 6;
	// 구문은 값을 반환하지 않기 때문에 에러가 발생한다.
	let x = (let x = 6);
}

위와 같이 x변수에 또다른 x를 정의하는 구문은 값을 반환하지 않기 때문에 에러가 발생한다. 이는 JavaScript, C, Ruby와의 차이점이다.(x = y = 6 형태 가능, 이는 Rust에서 허용하지 않는다.)

반면, 6 + 5 같은 연산은 11이란 값을 산출하는 표현식이다. 표현식은 구문의 부분일 수 있다. 예를 들어, let y = 6 이라는 구문은 6이라는 표현식을 갖는다. 6은 6 이란 값을 반환하는 표현식이다.

이처럼 6과 같은 값, 함수 호출, 매크로, 범위 생성 블록 {} 들은 표현식이다.

fn main() {
    let x = 5;

    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

이 코드에서 표현식 부를 살펴보면(변수 y에 할당된 범위)

{
    let x = 3;
    x + 1
}

이 경우 범위 블록 {} 은 4를 반환한다. 앞서 봐온 것과 다르게 x + 1 세미콜론이 없는데 이는 표현식으로 세미콜론을 사용하지 않는다. 세미콜론을 표현식 마지막에 추가하면, 이는 구문으로 변경되고 반환 값이 아니게된다.

함수 반환

반환 타입은 화살표(→) 뒤에 선언한다.(굳이 명명하지 않아도 됨) 반환은 표현식으로 표현할 수 있다. return 키워드를 사용할 수 있지만, Rust에서 대부분 암묵적으로 반환을 표현식으로 사용한다.

fn five() -> i32 {
    5
}

fn main() {
    let x = five();

    println!("The value of x is: {}", x);
}

five() 함수에서 5라는 표현식으로 반환하였다. 만약 뒤에 세미콜론 붙인다면, 이는 구문으로 반환 값이 없는 함수가 되고 타입 에러가 나올 것이다. 값을 반환하지 않는 함수는 () 처럼 비어있는 튜플로 표현된다.