Rust

[Rust]4. 함수

푸불 2018. 11. 7. 12:02

1.함수 선언하기

메인함수에서 보시다시피, Rust의 함수선언 예약어는 fn입니다.


fn main(){

}


이처럼, 다른 함수도 선언할수 있습니다.


fn AwesomeFunction(){

}

fn main(){

AwesomeFunction();

}


함수 정의에서 Rust는 굉장히 편리한 구석이 있습니다.
바로 함수 정의 위치가 중요하지 않습니다.
즉,

fn main(){

AwesomeFunction();

}

fn AwesomeFunction(){

}

다음과 같이 선언해도 

문제가 없습니다.


2.함수 매개변수

함수에 매개변수 적는법은 다음과 같습니다.

fn AwesomeFunction(x:i32,y:u8){

}

매개변수명:자료형

의 형태로, 쉼표로 이어적어주면 됩니다.

이때 매개변수의 자료형은 반드시 적어주어야합니다.

컴파일러가 무슨 함수를 의미하는지 손쉽게 찾아내기 위함입니다.


3.함수의 반환값 (1)

함수의 매개변수에 대해서 했으니, 반환값에 대해서도 해야겠죠?

그런데, 러스트의 함수의 반환 방식은 약간 특이합니다.

예제를 봅시다.

fn five()->i32{

5

}

위 예시는 반환값이 5가됩니다.

그리고 반환값의 자료형을 표기하는 방법이 

->자료형

이런식이라는건 알 수 있겠습니다만...


눈에 띄는게 하나 있습니다.

그 흔한 return이 없습니다.

이게 어찌된 일인지 이해하려면, Expression과 Statement에 대해 설명할 필요가 있습니다.


4.Expression과 Statement

Expression은 실행시 값이 반환되는 구문을 말합니다.

그리고 Statement는 실행시 값이 반환되지 않고, 특정 처리를 해주는 구문을 말합니다.

예를들어, 5+6+3은 14가 반환되는 Expression입니다.

반면, let a = 5는 그 자체가 값이 되지 않고 단지 a를 5로 정의하는 기능을 하는 Statement입니다.


하나 더 예를 들어봅시다.

let a=5+4;

이경우 let a=5+4;는 statement입니다.

그리고 5+4는 Expression이죠.

보시다시피 let a = ...; 와 같은 변수 선언에서는 Expression을 필요로 한다는걸 알 수 있습니다.


따라서 이런 구문은 컴파일 에러가 뜹니다.

let a= (let b= 4);

왜냐하면, (let b=4)는 statement고, 이것은 반환값이 없습니다. 

따라서, let a= ... 에 들어가는 Expression이 될수 없습니다.


러스트에서는 블록자체가 expression입니다.

즉,

let y= {

let x=1;

x+1

};

다음과같은 방식으로 값을 정의하는것 또한 가능합니다.

이때 y는 2가됩니다.

여기서, x+1에 세미콜론이 없다는걸 확인할수 있습니다.

이것은 x+1가 Expression이라는 의미고, (모든 Expression에는 세미콜론이 붙지 않고, 모든 statement에는 세미콜론이 붙습니다.)

이것이 블록의 반환값이 됩니다.


5.함수의 반환값 (2)

이제 다시 함수 코드로 돌아가봅시다.

fn five()->i32{

5

}

함수의 블록 내부에는 5라는 Expression이 존재합니다.

따라서, 블록의 반환값은 5가 됩니다.

이것이 러스트가 return이 없는 이유입니다.


그렇다면, 만약 반환값이 없다면 어떻게 되는지도 궁금하실것 같습니다.

예를들어, 위코드를 다음과같이 수정해봅시다.

fn five()->i32{

5;

}

5에 세미콜론이 붙었습니다. 이경우 expression이 statement가 되므로, 함수의 반환값이 없어집니다.
러스트에서는 Expression의 반환값이 없는경우 빈 튜플 ( )을 반환합니다.