Rust의 독특한 return문

Rust

목록 보기
2/5
post-thumbnail

Rust의 독특한 리턴 로직을 알아봅시다

return 키워드가 없다고?

두 숫자를 더한 값을 반환하는 add함수를 정의하는 예제를 가지고 생각해봅시다.
먼저 파이썬을 예로 들겠습니다.

def add(a: int, b: int) -> int:
    return a + b

자바스크립트도 비슷합니다.

function add(a, b) {
    return a + b;
}

C 언어도 마찬가지입니다.

int add(int a, int b) {
    return a + b;
}

그런데 Rust에서 이 함수를 이렇게 써버립니다.

fn add(a: i32, b: i32) -> i32 {
    a + b  // 세미콜론이 없음!
}

뭡니까 이게?!

Rust의 표현식 기반 리턴

Rust에서는 함수나 코드 블록의 마지막 표현식이 자동으로 반환값이 됩니다. 이를 "표현식 기반 리턴(Expression-based return)"이라고 합니다.

fn add(a: i32, b: i32) -> i32 {
    a + b  // 세미콜론이 없음!
}

위 코드는 아래와 완전히 동일합니다:

fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

세미콜론의 의미

Rust에서 세미콜론(;)은 매우 중요한 의미를 가집니다. 세미콜론이 있는 표현식은 () (unit type)을 반환합니다. unit 타입은 C나 JAVA의 void, 자바스크립트의 undefined와 유사한 아무것도 없는 타입이라고 생각하면 됩니다.

fn example() {
    let x = 5;  // x는 5
    x + 1;      // 이 표현식은 ()를 반환
    x + 1       // 이 표현식은 6을 반환
}

다른 언어와의 비교

Python

Python은 명시적인 return 문이 필요합니다:

def get_value():
    return 42  # return 키워드 필수

JavaScript

JavaScript도 마찬가지입니다:

function getValue() {
    return 42;  // return 키워드 필수
}

Rust

Rust는 마지막 표현식이 자동으로 반환됩니다:

fn get_value() -> i32 {
    42  // 세미콜론 없이 자동 반환
}

Rust가 굳이 이렇게 하는 이유는?

  1. 간결성: 불필요한 return 키워드를 생략할 수 있어 코드가 더 간결해집니다.
  2. 일관성: 함수의 반환값이 항상 마지막 표현식이므로 코드의 의도가 더 명확해집니다.
  3. 함수형 프로그래밍: 함수형 프로그래밍 스타일에 더 적합한 문법을 제공합니다. 함수형 패러다임에서는 모든 표현식이 어떠한 값을 반환합니다.

주의사항

  1. 세미콜론 주의: 마지막 표현식에 세미콜론을 붙이면 ()가 반환됩니다.
  2. 명시적 return: return 키워드를 사용하는 것도 가능하며, 함수 중간에서 빠져나올 때는 필수적입니다.
  3. 표현식 기반 리턴은 항상 코드 블럭의 마지막에 사용해야 합니다. 이게 왜 주의할 점이냐면, 표현식 기반 리턴과 리턴문의 사용은 항상 같은것이 아니기 때문입니다. 예를 들어 세미콜론 생략한 a + breturn a + b;는 항상 같지 않습니다. 코드블럭 중간에 a + b라는 값을 리턴하는 경우 return 키워드로 명시적 리턴을 해줘야 합니다. 코드블럭 중간에 a + b를 쓴다고 해서 그것이 return a + b;로 해석되지 않으며, 컴파일 에러가 발생합니다.

실제 사용 예시

fn calculate_score(answers: &[bool]) -> i32 {
    answers.iter()
        .filter(|&&correct| correct)
        .count() as i32 * 10  // 자동으로 반환됨
}

fn process_data(data: Option<i32>) -> i32 {
    match data {
        Some(value) => value * 2,  // Some 케이스의 결과
        None => 0                  // None 케이스의 결과
    }  // match 표현식의 결과가 자동으로 반환됨
}

결론

Rust의 표현식 기반 리턴은 처음에는 생소할 수 있지만, 코드를 더 간결하고 명확하게 만들어주는 강력한 기능입니다. 특히 함수형 프로그래밍 패러다임에서 자주 사용되는 패턴들과 잘 어울리며, Rust의 타입 시스템과도 잘 통합됩니다.

이러한 특성은 Rust가 시스템 프로그래밍 언어이면서도 현대적인 프로그래밍 언어의 장점들을 잘 결합했다는 것을 보여주는 좋은 예시입니다.

0개의 댓글