# Rust - Common Programming Concepts

tjdwns5123·2021년 6월 8일
0

Chapter_3

Variables

러스트 변수 선언

Rust의 모든 변수는 기본적으로 불변의 특징을 갖는다.

let x: i32 = 5;
println!("The value of x: {}", x);
x = 6;
println!("The value of x: {}", x);
$ cargo check
error[E0384]: cannot assign twice to immutable variable `x`

불변 변수 x에 값을 재할당 하려 하였으므로 컴파일 단계에서 당연하게 에러를 뿜게 된다.
그러나 모든 변수를 불변으로 선언해야만 하는 것은 아니다. mut 키워드를 통해 가변 변수를 선언할 수 있다.

let mut x: i32 = 5;
println!("The value of x: {}", x);
x = 6
println!("The value of x: {}", x);
$ cargo run
    Compiling chapter_3 v0.1.0 (/Users/jun/Desktop/Dev/Dive-To-Rust/chapter_3)
    Finished dev [unoptimized + debuginfo] target(s) in 2.13s
    Running `target/debug/chapter_3`
    The value of x is: 5
    The value of x is: 6

가변 변수와 불변 변수의 사용상에서, 러스트 도큐먼트는 설득력 있는 문맥을 제시한다.

이런 의사 결정에 있어서 버그를 예방하는 것 외에도 고려해야 할 요소들이 있습니다. 예를 들어, 대규모 데이터 구조체를 다루는 경우 가변한 인스턴스를 사용하는 것이 새로 인스턴스를 할당하고 반환하는 것보다 빠를 수 있습니다. 데이터 규모가 작을수록 새 인스턴스를 생성하고 함수적 프로그래밍 스타일로 작성하는 것이 더 합리적이고, 그렇기에 약간의 성능 하락을 통해 가독성을 확보할 수 있다면 더 가치있는 선택입니다.

러스트 상수 선언

/*
 * Rust 상수 명명 규칙 기반으로 상수명은 대문자로 구성한다.
 * 함수 실행의 결과 값이나 런타임에 결정되는 값을 할당할 수 없다.
 */
const MAX_POINTS: u32 = 100000;

Shadowing

let x = 5
let x = x + 1
let x = x * 2

let space = "     ";
let space = space.len();

쉐도잉을 통해 변수를 재 선언하면서 이전 변수의 값을 통해 다른 타입의 변수로써 재 선언할 수 있다. mut 키워드를 통한 변수 선언시 변수의 타입을 변경 할 수 없는 부분과는 비교되는 부분이며 마지막으로 쉐도잉한 변수 재선언 및 할당부 이후로 변수의 불변성을 보장 받을 수 있다는 장점이 있다.

Data Types

Static Typed Language 인 러스트의 특성상 컴파일 단계 이전에 데이터 타입을 명시해야 한다.

  • Scalar Types

    • Integer (i8, i16, i32, i64, u8, u16, u32, u64)
      • 부호 있는 정수 i8 -> -128 ~ 127
      • 부호 없는 정수 u8 -> 0 ~ 255
    • Float (f32, f64)
    • Boolean (bool)
    • Character (char)
  • Compound Types

    • Tuple
      fn main() {
          let tup: (i32, f64, u8) = (500, 6.4, 1);
          let (x,y,z) = tup; // Destructuring
          let five_hundred = tup.0 // access by index
      }
    • Array
      fn main() {
          let months = ["January", "February", "March", ...];
      }

Rust Panic

러스트는 컴파일 단계에서 유효하지 않은 메모리 범위 접근은 허용하지만 허용되지 않은 상황인 경우 즉시 종료한다.

Functions

러스트는 함수의 선언위치가 컴파일 단계에서 중요하지 않다. 선언만 되어 있으면 된다.

fn main () {
    another_function();
}

fn another_function() {
    
}

러스트는 표현식의 반환값을 세미콜론을 두지 않는 문장으로 판단한다.

fn main () {
    let x = 5;
    let y = {
        let x = 3;
        x + 1
    };
    println!("The Value of y is {}", y);
}

러스트는 함수가 반환하는 타입을 화살표 형태로 작성한다.

fn five() -> i32 {
    5
}

Control Flow

러스트는 제어문의 조건식에 반드시 boolean 의 결과값을 요구한다.

fn main () {
    let x = 3;
    if x {
        println!("wow")
    }
}
Compiling chapter_3 v0.1.0 (/Users/jun/Desktop/Dev/Dive-To-Rust/chapter_3)
error[E0308]: mismatched types
 --> src/main.rs:3:8
  |
3 |     if x {
  |        ^ expected `bool`, found integer

러스트의 블록 문장은 그 자체로 표현식에 대한 반환으로 사용될 수 있다.

fn main () {
    let condition: bool = true;
    // 지정한 타입의 변수에 할당되기 때문에 블록이 반환하는 값의 타입이 서로 다를수 없습니다.
    let result: u8 = if condition {
        5
    } else {
        6
    };
}
Compiling chapter_3 v0.1.0 (/Users/jun/Desktop/Dev/Dive-To-Rust/chapter_3)
Finished dev [unoptimized + debuginfo] target(s) in 0.45s
Running `target/debug/chapter_3`
5

Loop

fn main () {
    let mut number: u8 = 10;
    while number > 0 {
        println({}, number);
    }
}
fn main () {
    let a = [1,2,3,4,5];
    for num in a.iter() {
        println!("{}", num);
    }
}

0개의 댓글