RustBook - 3.3 Functions

숲사람·2022년 3월 23일
0

Rust

목록 보기
5/15
post-custom-banner

이 시리즈는 Rust Book을 공부하고 정리한 문서입니다. 댓글로 많은 조언 부탁드립니다.
Rust Book: https://doc.rust-lang.org/book/


함수 기본 형태

fn main() {
    println!("Hello, world!");

    another_function();
}

fn another_function() {
    println!("Another function.");
}
  • fn 키워드 사용
  • 함수 정의 위치가 위에 있을 필요 없음

함수 정의 형태를 함수의 시그니처 라고 부르는듯.

함수 매개변수

fn main() {
    another_function(5, 6);
}

fn another_function(x: i32, y: i32) {
    println!("The value of x is: {}", x);
    println!("The value of y is: {}", y);
}
  • 변수명 : 타입 매개 변수와 타입을 같이 명시해야함.

Statements 구문

Statement 란 어떤 값을 리턴하지 않고 수행되는 명령이다. 가령 아래 let y = 6; 은 statement 이다.

fn main() {
    let y = 6;
}

statement는 리턴값이 없기 때문에 아래와 같이 또 다른 let 으로 값을 할당할 수 없다. 아래 예제 처럼 let y = 6 는 statement 이기 때문에 리턴값이 없어 x 에 어떤값을 바인드 할 수 없다. 이것이 C 같은 언어와의 차이점이다. (int x = y = 6 가 가능한)

fn main() {
    let x = (let y = 6);
}

error: expected expression, found statement ('let')

Expressions 표현식

Expression은 마지막에 세미콜론이 없는 구문이다. 만약 어떤 표현에 세미콜론을 붙이면 그것은 Statement가 된다. 이 표현식은 {} 를통해서, 함수, 매크로르 통해서 return 될 수 있다.

let y = 6; 에서 6은 6을 리턴하는 표현식이다. 함수, 매크로도 물론 표현식이다. {} 로 묶인 코드블럭 또한 표현식이다. 가령아래 에서 y 는 표현식 {} 으로 인해 어떤 값을 할당 받는다.

fn main() {
    let x = 5;

    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

여기서 {} 코드 블럭 까지만 표현식 부분이다 x + 1 이 리턴값이 된다. (세미콜론으로 끝나지 않은 문장)

    let y = {
        let x = 3;
        x + 1
    };  <- ;으로 마무리하여 let y =; 구문 완성
    ^
    여기까지가 표현식 {}

리턴값을 갖는 함수

함수의 리턴값은 함수 내 마지막 표현식의 값이라고 생각하면 된다.
러스트에서는 이 리턴값의 타입을 함수 마지막 -> 이후 명시 한다. 리턴은 return키워드를 사용할 수 도 있지만 암묵적으로 ; 없는 표현식을 반환한다.

fn five() -> i32 {
    5
}

fn main() {
    let x = five();

    println!("The value of x is: {}", x);
}

five() 함수는 let 구문도 없이 달랑 5만 있다. 이것은 러스트에서 완벽하게 허용되는 함수이다. five함수의 리턴값이 5이기 때문에 결국 let x = five();let x = 5; 와 완벽하게 동일한 구문이 된다.

만약 함수에서 return 이나 표현식(expression)을 통해 값을 리턴하지 않으면 컴파일 에러가 발생하고 에러메시지에는 비어있는 튜플이 표현 된다.

error[E0308]: mismatched types
...
  = note: expected type `i32`
             found type `()`

여러값 리턴하기, 리턴타입에 튜플 사용.

fn func() -> (u32, f32) {
    (20, 0.7)
}
profile
기록 & 정리 아카이브용
post-custom-banner

0개의 댓글