#3 함수와 주석

Pt J·2020년 8월 13일
0

[完] Rust Programming

목록 보기
4/41
post-thumbnail

이 시리즈는 Rust 공식문서를 통해 공부한 흔적임을 밝힙니다.

함수 Functions

우리는 함수를 선언할 때 fn 키워드를 사용해야 한다는 것과
main 함수의 시작점은 곧 Rust 프로그램의 시작점이라는 것에 대해 이미 이야기 한 바가 있다.
함수의 이름은 변수와 마찬가지로 소문자로 작성되며, 밑줄_을 통해 단어를 구분한다.
이러한 방식의 작명법을 snake case라고 한다는 것은 여담.

함수를 선언할 때는 fn 키워드와 함수의 이름, 그리고 괄호를 사용하며
그 직후에 오는 중괄호는 컴파일러에게 함수 본문의 시작과 끝을 알린다.
함수를 사용할 때는 함수의 이름과 괄호를 사용하여 호출한다.
C 언어에서는 함수의 선언 순서가 중요하지만 Rust에서는 그 순서는 상관 없다.

함수를 선언하고 호출하는 간단한 예제를 작성해보자면,

peter@hp-laptop:~/rust-practice/chapter03$ cargo new functions
     Created binary (application) `functions` package
peter@hp-laptop:~/rust-practice/chapter03$ cd functions/
peter@hp-laptop:~/rust-practice/chapter03/functions$ vi src/main.rs

src/main.rs

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

    another_function();
}

fn another_function() {
    println!("Another function.");
}
peter@hp-laptop:~/rust-practice/chapter03/functions$ cargo run
   Compiling functions v0.1.0 (/home/peter/rust-practice/chapter03/functions)
    Finished dev [unoptimized + debuginfo] target(s) in 0.19s
     Running `target/debug/functions`
Hello, world!
Another function.
peter@hp-laptop:~/rust-practice/chapter03/functions$

main에서 Hello, world를 출력하고
another_function이 호출되어 Another function을 출력하는 것을 볼 수 있다.

매개변수 Parameter

함수를 선언할 때 매개변수를 포함하여 선언할 수 있다.
매개변수는 함수를 호출할 때 어떤 구체적인 값을 전달하는 데 이용된다.
이 구체적인 값을 인자라고 부른다.

여담: 매개변수Parameter인자Argument
매개변수와 인자의 의미를 혼용하는 경우가 있는데 엄밀히 따지면 서로 다른 개념이다.
매개변수는 말 그대로 변수다.
함수 선언 시 함께 선언되어 그 함수 내부에서만 사용되는 변수를 매개변수라고 한다.
인자는 함수 호출 시 그 매개변수에 bind되는 값이다.
간단히 말해, 선언할 때 쓰는 게 매개변수고 호출할 때 쓰는 게 인자다.

매개변수는 함수 이름 다음에 오는 괄호 안에 넣을 수 있는덴 반드시 자료형을 포함해야 한다.
매개변수를 여러 개 사용할 경우 쉼표로 구분하여 전달할 수 있다.

peter@hp-laptop:~/rust-practice/chapter03/functions$ cd ..
peter@hp-laptop:~/rust-practice/chapter03$ cargo new function_with_parametrs
     Created binary (application) `function_with_parametrs` package
peter@hp-laptop:~/rust-practice/chapter03$ cd function_with_parametrs/
peter@hp-laptop:~/rust-practice/chapter03/function_with_parametrs$ vi src/main.rs 

src/main.rs

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);
}
peter@hp-laptop:~/rust-practice/chapter03/function_with_parametrs$ cargo run
   Compiling function_with_parametrs v0.1.0 (/home/peter/rust-practice/chapter03/function_with_parametrs)
    Finished dev [unoptimized + debuginfo] target(s) in 0.16s
     Running `target/debug/function_with_parametrs`
The value of x is: 5
The value of y is: 6
peter@hp-laptop:~/rust-practice/chapter03/function_with_parametrs$ 

본문 Body

중괄호{}로 쌓여 있는 함수의 본문은 구문Statement과 표현식Expression으로 이루어져 있다.
구문과 표현식을 구분하지 않는 경우가 많지만 Rust에서는 그 구분이 중요하다.
구문은 세미콜론으로 끝나며 어떤 동작을 실행하는 것 그 자체로, 결과값이 존재하지 않는다.
반면 표현식은 세미콜론을 찍지 않으며 어떤 결과값을 가진다.
구문에게서 반환값을 얻으려고 한다면 Rust는 빈 튜플 ()을 제시할 것이다.

여담: C 언어와의 차이점
C 언어의 경우 구문과 표현식을 구분하지 않으며 모든 구문이 결과값을 가진다.
C 언어의 대입 연산은 대입한 값을 결과값으로 가지므로
x = y = 3; 같은 연산으로 둘 이상의 변수에 같은 값을 한 번에 대입할 수 있지만
Rust의 대입 연산은 표현식으로 결과값을 가지지 않아 그럴 수 없다.

함수의 선언은 구문에 속하며 함수의 호출은 표현식에 속한다.
그리고 {}로 감싼 코드블록도 표현식에 속하는데
코드블록은 맨 마지막 줄에만 표현식을 포함할 수 있으며
그 내부의 구문을 차례대로 수행하고 마지막 줄에 표현식이 있다면
그 표현식의 결과값이 코드블록의 결과값이 된다.

peter@hp-laptop:~/rust-practice/chapter03/function_with_parametrs$ cd ..
peter@hp-laptop:~/rust-practice/chapter03$ cargo new expression
     Created binary (application) `expression` package
peter@hp-laptop:~/rust-practice/chapter03$ cd expression/
peter@hp-laptop:~/rust-practice/chapter03/expression$ vi src/main.rs 

src/main.rs

fn main() {
    let x = 5;

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

    println!("The value of x is {}", x);
    println!("The value of y is {}", y);
}
peter@hp-laptop:~/rust-practice/chapter03/expression$ cargo run
   Compiling expression v0.1.0 (/home/peter/rust-practice/chapter03/expression)
    Finished dev [unoptimized + debuginfo] target(s) in 0.18s
     Running `target/debug/expression`
The value of x is 5
The value of y is 4
peter@hp-laptop:~/rust-practice/chapter03/expression$

위 예제에서 유추할 수 있는 부분이지만
코드블록 내에서 선언된 변수는 그 바깥의 변수와 이름이 같아도
shadowing이 적용되지 않고 코드블록 내부에서만 사용된다는 점을 유의하자.

반환값 Return Value

재차 말하지만 함수의 호출은 표현식이다.
그 말은 즉, 함수가 어떤 결과값을 가질 수 있다는 것이다.
함수의 코드블록도 일반적인 코드블록처럼 맨 마지막에 표현식을 가질 수 있고
그것이 함수의 결과값에 해당한다.
함수가 갖는 결과값은 반환값이라고 부르며 그 자료형은 함수의 선언 옆에 명시한다.
함수의 선언 옆에 자료형이 명시되지 않은 함수는 반환값을 갖지 않는 함수다.
이러한 함수는 표현식으로서 사용할 수 없다.
구문과 마찬가지로 반환값이 없는 함수의 반환값을 bind하려고 하면 빈 튜플 ()이 bind될 것이다.
반환값의 자료형을 명시할 땐 함수 소괄호와 중괄호 사이에 ->과 함께 적는다.

peter@hp-laptop:~/rust-practice/chapter03$ cd expression/
peter@hp-laptop:~/rust-practice/chapter03/expression$ cd ..
peter@hp-laptop:~/rust-practice/chapter03$ cargo new function_with_return_value
     Created binary (application) `function_with_return_value` package
peter@hp-laptop:~/rust-practice/chapter03$ cd function_with_return_value/
peter@hp-laptop:~/rust-practice/chapter03/function_with_return_value$ vi src/main.rs 

src/main.rs

fn main() {
    let x = plus_one(5);
    println!("The value of x: {}", x);
}

fn plus_one(x: i32) -> i32 {
    x + 1
}
peter@hp-laptop:~/rust-practice/chapter03/function_with_return_value$ cargo run
   Compiling function_with_return_value v0.1.0 (/home/peter/rust-practice/chapter03/function_with_return_value)
    Finished dev [unoptimized + debuginfo] target(s) in 0.21s
     Running `target/debug/function_with_return_value`
The value of x: 6
peter@hp-laptop:~/rust-practice/chapter03/function_with_return_value$ 

반환값에 해당하는 부분은 표현식이므로 세미콜론을 붙이면 안된다는 점을 유의하자.

주석 Comments

우리가 지금까지 작성한 예제와 같이 짧고 단순한 코드는 그 자체만으로 이해하기 쉽지만
코드가 더 크고 복잡해질수록 코드만으로는 그 흐름을 이해하기 어려워질 수 있다.
이럴 때 사용할 수 있는 녀석이 주석이다.
컴파일러는 주석을 무시하지만 개발자는 주석을 읽을 수 있기에
주석을 통해 코드에 대한 부연 설명을 남길 수 있다.
Rust의 주석은 //을 통해 작성할 수 있으며
이것부터 그 줄이 끝날 때까지의 모든 내용을 주석으로 취급한다.
여러 줄짜리 주석은 따로 존재하지 않으며
주석으로 취급하고 싶은 모든 줄에 //를 붙여주면 된다.
주석은 부연 설명이 필요한 코드 우측이나 상단에 작성하는데 후자가 일반적이다.

이러한 부연 설명을 위한 주석 외에도 Rust에는 문서화 주석이라는 특별한 주석이 존재하는데
그것에 대해서는 추후에 이야기하도록 하겠다.

이 포스트의 내용은 공식문서의 3장 3절 Functions & 3장 4절 Comments에 해당합니다.

profile
Peter J Online Space - since July 2020

2개의 댓글

comment-user-thumbnail
2020년 11월 27일

여담이 너무 좋네요 간과했던것들을 다시 짚어주고 알려줘서 감사합니다 ㅎ
이제 러스트 시작해서 잘보고있습니다.
코로나 조심하세요!~

1개의 답글