러스트 기초

출력하기

가장 먼저 hello world를 출력해봅시다. 러스트에서는 main() 함수는 엔트리 포인트라고 부르며 반드시 존재해야 합니다.

프로그램 실행시 가장 먼저 실행되기에 엔트리 포인트라 부릅니다.

fn main() {
    println!("Hello, world");
}
  • 문장 끝에 세미콜론(;)을 붙여야 합니다. 그러나 함수에서 값을 반환해야 할 때는 붙이지 않습니다.
  • fn은 함수를 정의할 때 사용합니다.
  • println!은 매크로입니다. 함수와 비슷한 기능을 합니다. !가 붙어있는 것으로 알아 볼 수 있습니다.
Note

매크로는 다른 언어에서 전처리 기능을 하며, 컴파일 할 때 소스 코드의 일부를 대체하기 때문에 간결한 코드를 작성할 수 있게 합니다. 러스트에서 문자열을 출력할 때 매크로가 사용되는 이유는 특이한 소유권 시스템이 존재하기 때문입니다. 만약 매크로를 사용하지 않는다면 아주 긴 코드를 작성해야 할 것입니다.

타입

러스트에는 사용할 수 있는 많은 내장 타입이 있습니다. 이렇게 타입이 다양한 것은 메모리를 효율적으로 사용하기 위함입니다. 또한 일부는 직접 만들 수 있습니다. 수치형 타입은 크게 3가지가 있습니다

  • 부호가 있는 정수: i8
  • 부호가 없는 정수: u8
  • 부동 소수점: f32, f64
Note

같은 8비트를 사용하더라도 부호 유무의 차이에 의해 표현 할 수 있는 값의 최댓값이 다르다. 부호를 나타내기 위해 1비트를 사용하기 때문입니다.

fn main() {
    let my_int: i32 = 42;
    let my_float: f64 = 3.14;
    let my_bool: bool = true;
    let my_char: char = 'h';
    let my_string: String = String::from("hello");
    let my_tuple: (i32, f64, bool) = (42, 3.14, true);
    let my_array: [i32; 5] = [1, 2, 3, 4, 5];
    let my_vector: Vec<i32> = vec![1, 2, 3, 4, 5];
}

컴파일러가 데이터의 타입을 추론할 수 있긴 하지만 일반적으로 타입을 명시하는 것이 좋습니다.

주석

러스트에서 주석은 보통 이중 슬래시(//)를 사용해 작성합니다. 여러 줄의 주석은 /* */를 사용합니다.

fn main() {
    // 이 부분이 주석입니다.
    /*
    이 부분도 주석입니다.
    */
}

변수 선언

let

let으로 변수를 선언하면 변경할 수 없는 불변성 변수가 됩니다. 그래서 섀도잉(shadowing)이라는 개념을 사용해야 합니다. 섀도잉은 이전에 선언한 변수와 같은 이름으로 새로운 변수를 선언해서 가변성이 있는 것 처럼 만드는 것입니다.

섀도잉은 여러가지 작업을 하면서 새로운 변수를 생성하고 싶지 않을 때 유용합니다.

fn main() {
    let my_number: i32 = 42;
    println!("{}", my_number); // 42가 출력
    let my_number: f32 = 3.14;
    println!("{}", my_number); // 3.14가 출력
}

반복문(for 문)과 조건문(if 문)

Fizzbuzz 문제를 풀어보면서 반복문과 조건문을 살펴보겠습니다.

fn main() {
    for i in 1..=100 {
        if i % 3 == 0 && i % 5 == 0 {
            println!("FizzBuzz");
        } else if i % 3 == 0 {
            println!("Fizz");
        } else if i % 5 == 0 {
            println!("Buzz");
        } else {
            println!("{}", i);
        }
    }
}