Rust 함수

zdpk·2024년 6월 25일

Rust

목록 보기
4/4
post-thumbnail

대부분의 언어에 존재하는 함수와 유사하므로 매우 간단하게 정리하고 넘어가도록 하자.


Function Definition

Rust로 작성한 프로그램의 Entry Point가 main 함수이기 때문에 언급하지는 않았지만, 지난 장에서 계속 main 함수를 봤었다.

fn main() {
	println!("Hello World");
}

함수 선언은 다른 언어와 유사하며, fn 키워드를 사용한다.

// C
int main() {
	printf("Hello World\n");
	return 0;
}

위 코드는 C의 함수인데, 오래된 언어들은 대부분 변수 및 함수가 '선행 타입'이기 때문에,

반환 타입이 함수명 앞에 위치한다.

Rust는 후행 타입이기 때문에 함수명 앞에 fn 키워드를 명시하고 반환 타입은 인자 뒤에 명시한다.

단, 반환값이 없는 경우는 생략이 가능하며, 이는 void가 아닌 Unit Type이라 했었다.

표기는 ()로 하면 된다.

fn main() -> () {
	println!("Hello World");
}

지금까지 우리가 작성한 main 함수는 ()을 반환 타입에서 생략한 형태였던 것이다.

수학에서의 함수와 마찬가지로, 모든 함수는 1개의 결과를 반환하고,

아무 것도 반환하지 않는 경우는 1개의 '없음'을 의미하는 값을 반환하며,

그것이 Unit Type == ()이다.


Function Parameter

간단한 덧셈 함수를 만들었다.

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

인자가 2개 주어지며, 이를 더한 결과를 반환한다.

TypeScript, Kotlin과 유사한 문법이다.

셋 다 후행 타입인 언어이므로 구조 상 비슷한 부분들이 있다.

이후에 자세히 보겠지만, Rust는 마지막 Expression;을 붙이지 않는 경우, 반환값으로 인지한다.

fn add(a: i32, b: i32) -> i32 {
	// 암시적으로 반환
	a + b
}

위 코드는 직전에 작성했던 add와 완전히 동일하다.

또한 TypeScript와 달리 반환 타입에 대한 추론은 불가하다.

// TypeScript
function add(a: number, b: number) {
	// ✅
	return a + b;
}
// Rust
fn add(a: i32, b: i32) {
	// ❌ mismatched types expected `()`, found `i32`
	a + b
}

반환 타입을 생략하면, 함수 반환값을 바꾸는 것 만으로 의도치 않게 시그니처까지 변해버리기 때문에 예상치 못한 실수가 발생할 수 있다.

// TypeScript
function add(a: number, b: number) {
	// a + b를 문자열로 감싸서 반환 타입이 자동으로 `string`으로 변환
	return $`{a + b}`;
}

어찌 보면 불편하지만, 좀 더 안전하고 명시적인 방법이라고 볼 수 있겠다.


Rust에서 함수의 간단한 사용법 정도만 알아봤는데, 소유권이나 라이프타임과 얽히게 되면 좀 더 복잡해지고 추가적으로 알아야 하는 부분들이 생기게 된다.

이 부분은 추후 자세히 알아보겠다.

0개의 댓글