개요

Rust에서는 변수 및 함수를 선언할 때 주로 Expression(식) 형태로 표현하여 Expression 지향 언어라고 한다.

(Expression이 아닌 Statement(문장)가 있는데 이것은 항상 사용했던 표현 방법이라 그렇게 어렵진 않다.)

 

Expression을 설명한 여러 글들을 보고 있는 그대로만 이해한다면, "Expression 표현 방식은 변수나 함수에 값을 할당할 때 코드 블록{...}내의 마지막 부분에 세미콜론을 붙이지 않는 형태이구나"라고 단순하게 생각할 수도 있다.

 

하지만, Rust가 Expression을 지향하는 이유가 있지 않을까?라고 계속해서 반문을 하게 된다.

 

찝찝하지만.. 그래도 지금 당장은 Expression을 이해하는 것보다는 Rust의 소유권 개념 등을 더 빠르게 익히는 것이 중요하다고 판단되어 Expression 표현 방식을 있는 그대로 이해하고 사용하려고 한다.

(Expression 표현 방식으로 꾸준히 코드를 작성하다 보면은 언젠가는 깨달을 수 있지 않을까?? ㅎㅎ..)

 

본론으로 돌아와, 해당 페이지에서는 Expression과 Statement가 무엇인지 간략하게 설명한 뒤 Rust에서 함수를 어떻게 선언하고 파라미터를 넘기고 또 리턴 값을 반환 받는지 설명하도록 한다.

 

Expression & Statement

함수를 통해 Expression과 Statement의 차이점을 단순하게 설명하자면, Expression은 코드 블록{...}의 마지막 라인에서 값을 반환하기 위해 세미콜론을 붙이지 않으며, Statement는 값을 반환하기 위해 세미콜론을 붙인다. 라고 생각하면 된다.

 

아래 Rust의 함수 코드로 예를 들어본다.

fn statement_func() -> i32 {
    let a = 1;

    return a;
}

fn expression_func() -> i32 {
    let a = 1;
    
    a
}

함수 선언 및 리턴 키워드는 모두 무시한채로 코드 블록{...} 내부만을 보자.

 

statement_func()은 마지막 라인에 return a;으로 값을 반환하는 것을 확인할 수 있고,

expression_func()은 마지막 라인에 단순히 a로 값을 반환하는 것을 확인할 수 있다.

(두 함수는 Rust 엔진에서 모두 동작한다.)

 

Expression의 함수 선언 방식만을 예로만 보면 Expression을 이해하기엔 다소 무리가 있다.

이번에는 Expression 방식으로 변수를 선언 및 할당하는 예를 두가지 들어본다.

 

Expression 방식의 변수 선언 및 할당에 대한 첫번째 예이다.

// Example 1)

let y = {
    let mut x = 0;
    x = x+1;
    x+1
};

변수 y의 코드 블록{...}에는 x라는 가변 변수가 선언되고 해당 가변 변수에는 +1이 진행된 뒤 마지막에는 Expression 방식으로 x+1이 반환되는 것을 볼 수 있다. 즉, y에는 최종적으로 2라는 값이 담기게 된다.

 

Expression 방식의 변수 선언 및 할당에 대한 두번째 예이다.

// Example 2)

let number = 13;
let odd = if number % 2 == 0 { "even" } else { "odd" };

변수 odd에는 if 문을 통해 number가 홀/짝인지의 여부에 따라, "even"이나 "odd"가 담기게 된다.

 

위 두 예제를 통해 이게 Expression 방식이라고 생각하면 된다...!

필자의 표현력에 무지함이 더해져,, 정말 확 와닿는 말로 설명하기는 힘들지만, 이것이 Expression 방식이다. 헤헤..

 

아무튼, 함수와 더불어 변수를 Expression 방식으로 선언하게 된다면 위와 같이 하나의 라인에 많은 결과를 담을 수 있게 된다.

(Statement 방식으로는 위와 같이 한 문장으로 표현하긴 힘들 것이다. 그래서 Rust가 Expression을 지원하는 것인가? 생각도 든다)

 

함수 선언

디테일하게는 아니지만 Expression과 Statement의 차이점에 대해서는 알 수 있게 되었을테니,

이제 Rust의 함수 선언 방식과 이어서 파라미터, 리턴에 대해서 알아보자.

 

Rust의 함수는 fn 키워드로 선언할 수 있다.

또한, Rust 함수는 Java처럼 camelCase가 아닌 snake_case 형태로 작성하길 권고하고 있다.

 

아래 Rust 함수 선언의 예를 살펴보자.

fn snake_case() {
	println!("snake_case func()");
}

fn camelCase() {
	println!("camelCase func()");
}

다음과 코드와 같이 Rust 함수는 fn으로 선언할 수 있다.

또한, 앞서 설명하였다시피 Rust는 snake_case 방식으로 함수 이름을 사용하는 것을 권고한다.

 

위 두 함수 모두 이상없이 Rust 엔진에서 동작하겠지만, camelCase로 작성된 함수는 Rust 컴파일러에서 Warning을 띄운다.

 

함수 파라미터

이번에는 Rust에서 함수의 파라미터를 어떻게 작성하는지 간략하게 코드로 알아본다.

fn param_func(a: i32, b: f32) {
	println!("{}, {}", a, b);
}

함수의 파라미터에는 변수의 타입이 반드시 명시되어야 하며, a: i32, b: f32와 같은 형태로 작성할 수 있다.

 

함수 리턴

마지막으로 Rust 함수의 리턴이 필요할 때 어떻게 작성되어야 하는지 간략하게 코드로 알아본다.

fn return_func(a: i32) -> i32 {
	a + 10
}

함수의 리턴을 위해선 -> 를 사용하며 그 뒤에 리턴할 타입(ex. i32, f32 등)을 작성해주면 된다.

위 return_func() 함수는 -> i32를 통해 정수형 32bit를 Expression 방식으로 반환하는 것을 확인할 수 있다.

 

References

http://rust-lang.xyz/rust/article/10-Expression%EA%B3%BC-Statement

https://comb.tistory.com/6

https://shoark7.github.io/programming/knowledge/expression-vs-statement

 

 

 

'Programming > Rust' 카테고리의 다른 글

[Rust] Method와 Function의 차이  (0) 2024.10.15
[Rust] 싱글톤 패턴(Singleton-Pattern) 코드 작성법  (1) 2024.02.09
[Rust] 소유권 시스템  (0) 2023.09.24
[Rust] 변수의 타입  (0) 2023.08.24
[Rust] 기초 학습 사이트  (0) 2023.07.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기