
두 숫자를 더한 값을 반환하는 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에서는 함수나 코드 블록의 마지막 표현식이 자동으로 반환값이 됩니다. 이를 "표현식 기반 리턴(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은 명시적인 return 문이 필요합니다:
def get_value():
return 42 # return 키워드 필수
JavaScript도 마찬가지입니다:
function getValue() {
return 42; // return 키워드 필수
}
Rust는 마지막 표현식이 자동으로 반환됩니다:
fn get_value() -> i32 {
42 // 세미콜론 없이 자동 반환
}
return 키워드를 생략할 수 있어 코드가 더 간결해집니다.()가 반환됩니다.return 키워드를 사용하는 것도 가능하며, 함수 중간에서 빠져나올 때는 필수적입니다.a + b와 return 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가 시스템 프로그래밍 언어이면서도 현대적인 프로그래밍 언어의 장점들을 잘 결합했다는 것을 보여주는 좋은 예시입니다.