[ RustπŸ¦€ ] Rust 의 보편적 κΈ°λŠ₯

Rust 의 μ–Έμ–΄λ‘œμ„œμ˜ 보편적인 κΈ°λŠ₯을 μ•Œ 수 μžˆλ‹€.

Rust 의 μ–Έμ–΄λ‘œμ„œμ˜ 기본적 속성

RustλŠ” λ‹€λ₯Έ 언어와 같이 λ³€μˆ˜ / ν•¨μˆ˜ / 주석 / μ œμ–΄λ¬Έ λ“±κ³Ό 같은 기본적인 μš”μ†Œλ“€μ„ 가지고 μžˆλ‹€.
이 쀑, Rust의 특이점이라 ν•˜λ©΄, λ³€μˆ˜μ˜ λΆˆλ³€μ„±/가변성이 μ‘΄μž¬ν•œλ‹€λŠ” 점이닀.

λ³€μˆ˜μ™€ λΆˆλ³€μ„± ( variable and immutable )

Rust μ—μ„œλŠ” λ³€μˆ˜λ₯Ό let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œλ‹€.
let x λͺ…령을 톡해 λ³€μˆ˜ x λ₯Ό μ„ μ–Έν•˜κ²Œ 되면, λ³€μˆ˜ xλŠ” 기본적으둜 λΆˆλ³€μ„±(immutable) 의 μ„±μ§ˆμ„ κ°€μ§€κ²Œ λœλ‹€.
즉, λ³€μˆ˜ x의 값을 더이상 λ°”κΏ€ 수 μ—†λ‹€λŠ” λœ»μ΄λ‹€.

λ³€μˆ˜μ˜ 값을 λ°”κΎΈκ³  μ‹Άλ‹€λ©΄, let λ‹€μŒμ— mutν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όλ©΄ λ˜λŠ”λ°, let mut x의 꼴이 λœλ‹€.

fn main() {
    let x = 1;
    let mut y = 1;
    x = 2; // compile error
    y = 2;
    println!("{} {}", x ,y);
}

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ²Œ 되면, μ•„λž˜μ™Έ 같은 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

error[E0384]: cannot assign twice to immutable variable `x`
 --> src/main.rs:5:5
  |
3 |     let x = 1;
  |         -
  |         |
  |         first assignment to `x`
  |         help: make this binding mutable: `mut x`
4 |     let mut y = 1;
5 |     x = 2; // compile error
  |     ^^^^^ cannot assign twice to immutable variable

이처럼 λ³€μˆ˜μ˜ 기본적인 ν˜•νƒœκ°€ λΆˆλ³€μ μΈ 것은, 값이 λ°”λ€Œμ–΄μ•Ό ν•˜λŠ” λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λͺ…μ‹œμ μœΌλ‘œ ν‘œκΈ°ν•˜κ²Œ λ§Œλ“€μ–΄, λ³€μˆ˜ 값이 λ°”λ€ŒλŠ” λ°μ—μ„œ λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό 쀄이기 μœ„ν•¨μœΌλ‘œ 보인닀.

데이터 νƒ€μž… ( data type )

Rust μ—μ„œ 데이터 νƒ€μž…μ€ 크게 Scalar 와 Compound νƒ€μž…μœΌλ‘œ λ‚˜λˆ„μ–΄ 진닀.
Scalar 은 ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ ν‘œν˜„λ˜λŠ” 데이터 νƒ€μž…μ„ λ§ν•˜κ³ , Compound 은 μ—¬λŸ¬ λ°μ΄ν„°μ˜ 쌍으둜 ν‘œν˜„λ˜λŠ” νƒ€μž…μ„ λ§ν•œλ‹€.

integer : i8, u8, i16, u16, i32, u32
float : f32, f64
char : 1~5 byte ( default UTF-8 encoding )

ν•¨μˆ˜ ( function )

Rust μ—μ„œ ν•¨μˆ˜λŠ” fn ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜κ²Œ λœλ‹€.
νŠΉμ΄ν•˜κ²Œ ν•¨μˆ˜λͺ…은 snake_case 둜 μ œν•œλœλ‹€. 예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 ν•¨μˆ˜λ₯Ό 컴파일 ν•˜κ²Œ 되면,

fn HelloPrint() {
    println!("hello, world");
}

fn main() {
    HelloPrint();
}

μ•„λž˜μ™€ 같이 μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ ν•¨μˆ˜λͺ…을 snake_case 둜 μˆ˜μ •ν•΄ μ€€λ‹€.

warning: function `HelloPrint` should have a snake case name
 --> src/main.rs:2:4
  |
2 | fn HelloPrint() {
  |    ^^^^^^^^^^ help: convert the identifier to snake case: `hello_print`
  |
  = note: `#[warn(non_snake_case)]` on by default

ν•¨μˆ˜λŠ” ν‘œν˜„μ‹(expression)κ³Ό ꡬ문(statement)으둜 이루어 μ§€λŠ”λ°, ν‘œν˜„μ‹μ€ λ°˜ν™˜κ°’μ΄ 있고, ꡬ문은 λ°˜ν™˜κ°’μ΄ μ—†λ‹€. λ˜ν•œ, ν‘œν˜„μ‹μ€ μ„Έλ―Έμ½œλ‘ μ΄ 뢙지 μ•Šκ³ , ꡬ문은 μ„Έλ―Έμ½œλ‘ μ΄ λΆ™λŠ”λ‹€.

예λ₯Ό λ“€μ–΄, μ•žμ„œ μ„€λͺ…ν–ˆλ˜ x = 1κ³Ό 같은 λŒ€μž…μ€ ꡬ문이닀.
λ°˜ν™˜ν•˜λŠ” 값이 μ—†κΈ° λ•Œλ¬Έμ—, 일반적으둜 λ‹€λ₯Έ μ–Έμ–΄μ—μ„œλŠ” μ‚¬μš© κ°€λŠ₯ ν–ˆλ˜ y = x = 1; κ³Ό 같은 μ‹μ˜ μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ ν•˜λ‹€.

fn hello() {
    println!("hello");
}

fn one_is_return() -> i32 {
    1
}

fn x_is_return(x:i32) -> i32 {
    x
}

ν•¨μˆ˜μ˜ 선언은 μœ„μ™€ 같이 λ°˜ν™˜ν˜•μ΄ μžˆλŠ” 경우 -> 으둜 ν‘œκΈ°ν•΄ μ£Όκ³ , νŒŒλΌλ―Έν„°λŠ” x: i32와 같이 데이터 νƒ€μž…μ„ λͺ…μ‹œν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.
λˆˆμΉ˜κ°€ λΉ λ₯Έ 뢄은 이미 μ•Œμ•„μ±˜κ² μ§€λ§Œ, λ°˜ν™˜κ°’μ΄ μ—†λŠ” hello() λŠ” μ„Έλ―Έμ½œλ‘ μœΌλ‘œ λλ‚˜λŠ” println!(); 의 ꡬ문으둜 μ’…λ£Œλ˜κ³ , λ°˜ν™˜κ°’μ΄ μžˆλŠ” λ‚˜λ¨Έμ§€ ν•¨μˆ˜λ“€μ€ μ„Έλ―Έμ½œλ‘ μ΄ μ—†λŠ” ν‘œν˜„μ‹μœΌλ‘œ μ’…λ£Œλœλ‹€.

주석 ( comment )

λ‹€λ₯Έ 언어와 λ§ˆμΉœκ°€μ§€λ‘œ // μ΄λ‚˜ /**/ 으둜 주석을 달 수 있으며, λ¬Έμ„œν™” μ£Όμ„μ΄λΌλŠ” 것이 μžˆλ‹€κ³  ν•˜λŠ”λ°, μ΄λŠ” λ‚˜μ€‘μ— 닀루겠닀.

μ œμ–΄λ¬Έ ( control statement )

λ‹€λ₯Έ 언어와 λ§ˆμ°¬κ°€μ§€λ‘œ if else λ¬Έ, while λ¬Έ, for 문이 μ‘΄μž¬ν•œλ‹€.

이 쀑, for 문의 ν˜•νƒœλŠ” C μŠ€νƒ€μΌμΈ for(;;)은 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ©°,
python 처럼 for var in expression { } 의 ν˜•νƒœλ§Œ μ§€μ›ν•œλ‹€.

예λ₯Ό λ“€μ–΄, 1λΆ€ν„° 10 κΉŒμ§€ 좜λ ₯ν•˜κ³  μ‹ΆμœΌλ©΄ μ•„λž˜μ™€ 같이 ν•˜λ©΄ λœλ‹€.

fn main() {
    for x in 1..11 {
        println!("{}",x);
    }
}

References