๐Ÿฆ€ Rust Learning Ebook
EN KO

๐Ÿ› ๏ธ Chapter 2: ์‹œ์ž‘ํ•˜๊ธฐ

์ด ์žฅ์—์„œ๋Š” Rust ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. Rust ๋„๊ตฌ ์ฒด์ธ, IDE ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  Cargo ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค.

2.1 Rust ์„ค์น˜

Rust๋Š” rustup์ด๋ผ๋Š” ๊ณต์‹ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. rustup์€ ์—ฌ๋Ÿฌ Rust ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๊ณ , ํƒ€๊ฒŸ ํ”Œ๋žซํผ๋ณ„ ์ปดํŒŒ์ผ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

2.1.1 ์ง€์› ํ”Œ๋žซํผ

ํ”Œ๋žซํผ ์ง€์› ์ƒํƒœ ์š”๊ตฌ์‚ฌํ•ญ
Windows โœ… Tier 1 Windows 7 ์ด์ƒ, Visual Studio Build Tools
macOS โœ… Tier 1 macOS 10.12 ์ด์ƒ, Xcode Command Line Tools
Linux โœ… Tier 1 glibc 2.17 ์ด์ƒ (๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ ๋ฐฐํฌํŒ)
BSD ๊ณ„์—ด โœ… Tier 2 FreeBSD, OpenBSD, NetBSD

2.1.2 macOS / Linux ์„ค์น˜

1 ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2 ์„ค์น˜ ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’ ๊ถŒ์žฅ):
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ 1์„ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3 ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค:
source $HOME/.cargo/env

2.1.3 Windows ์„ค์น˜

1 rustup.rs์—์„œ rustup-init.exe๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”
2 Visual Studio Build Tools ์„ค์น˜ (์•„์ง ์—†๋Š” ๊ฒฝ์šฐ):
  • Visual Studio 2022 Community (๋ฌด๋ฃŒ)
  • ๋˜๋Š” Build Tools for Visual Studio 2022
  • "Desktop development with C++" ์›Œํฌ๋กœ๋“œ ์„ ํƒ
3 rustup-init.exe๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์„ค์น˜

2.1.4 ์„ค์น˜ ํ™•์ธ

โœ“ ์„ค์น˜๊ฐ€ ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธ:

rustc --version
cargo --version
rustup --version

์ถœ๋ ฅ ์˜ˆ์‹œ:

rustc 1.75.0 (82e1608df 2023-12-21)
cargo 1.75.0 (1d8b05cdd 2023-11-20)
rustup 1.26.0 (5af9b9484 2023-04-05)

2.2 IDE ์„ค์ •

Rust๋Š” ๋‹ค์–‘ํ•œ IDE์™€ ์—๋””ํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์˜ต์…˜๋“ค์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

2.2.1 Visual Studio Code (๊ถŒ์žฅ)

ํ™•์žฅ ๊ธฐ๋Šฅ ํ•„์ˆ˜ ์—ฌ๋ถ€
rust-analyzer ์ฝ”๋“œ ์™„์„ฑ, ํƒ€์ž… ํžŒํŠธ, ์—๋Ÿฌ ๊ฒ€์‚ฌ, ๋ฆฌํŒฉํ† ๋ง โœ… ํ•„์ˆ˜
Even Better TOML Cargo.toml ๋ฌธ๋ฒ• ๊ฐ•์กฐ ๋ฐ ๊ฒ€์ฆ โœ… ๊ถŒ์žฅ
CodeLLDB ๋””๋ฒ„๊น… ์ง€์› ๐Ÿ”ธ ์„ ํƒ
crates Cargo.toml์—์„œ ํฌ๋ ˆ์ดํŠธ ๋ฒ„์ „ ๊ด€๋ฆฌ ๐Ÿ”ธ ์„ ํƒ
1 VS Code ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜
2 Extensions (Ctrl+Shift+X)์—์„œ rust-analyzer ๊ฒ€์ƒ‰ ๋ฐ ์„ค์น˜
3 Even Better TOML ์„ค์น˜

2.2.2 ๊ธฐํƒ€ IDE ์˜ต์…˜


2.3 Hello, World!

์ด์ œ ์ฒซ ๋ฒˆ์งธ Rust ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. Cargo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2.3.1 ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

1 ํ„ฐ๋ฏธ๋„์—์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ:
cargo new hello_rust
cd hello_rust

Cargo๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

hello_rust/
โ”œโ”€โ”€ Cargo.toml      # ํ”„๋กœ์ ํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์˜์กด์„ฑ
โ”œโ”€โ”€ .gitignore      # Git ์ œ์™ธ ํŒŒ์ผ
โ””โ”€โ”€ src/
    โ””โ”€โ”€ main.rs     # ์†Œ์Šค ์ฝ”๋“œ

2.3.2 ์ฝ”๋“œ ํ™•์ธ

src/main.rs ํŒŒ์ผ์„ ์—ด๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

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

2.3.3 ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰

2 ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰:
cargo run

์ถœ๋ ฅ:

   Compiling hello_rust v0.1.0 (/path/to/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 1.23s
     Running `target/debug/hello_rust`
Hello, world!

[i] ์ฐธ๊ณ : cargo run์€ ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•œ ํ›„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋นŒ๋“œ๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.


2.4 ์ฝ”๋“œ ์ดํ•ดํ•˜๊ธฐ

๊ฐ„๋‹จํ•œ "Hello, World!" ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•ด๋ด…์‹œ๋‹ค.

2.4.1 main ํ•จ์ˆ˜

fn main() {
    // ํ•จ์ˆ˜ ๋ณธ๋ฌธ
}

๋ชจ๋“  Rust ์‹คํ–‰ ํŒŒ์ผ์€ main ํ•จ์ˆ˜์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

2.4.2 println! ๋งคํฌ๋กœ

println!("Hello, world!");

๋งคํฌ๋กœ vs ํ•จ์ˆ˜

๋งคํฌ๋กœ๋Š” !๋กœ ๋๋‚˜๋ฉฐ, ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. println!์€ ํฌ๋งทํŒ…๊ณผ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2.4.3 ํฌ๋งท ๋ฌธ์ž์—ด

println!์€ ๋ณ€์ˆ˜ ์‚ฝ์ž…๊ณผ ํฌ๋งทํŒ…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

fn main() {
    let name = "Rust";
    let version = 1.75;

    println!("Hello, {}!", name);
    println!("{} version {}", name, version);
    println!("{name} version {version}");  // Rust 1.58+
}

2.5 Cargo ๋ช…๋ น์–ด

Cargo๋Š” Rust์˜ ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด์ž ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์„ ์•Œ์•„๋ด…์‹œ๋‹ค.

๋ช…๋ น์–ด ์„ค๋ช… ์‚ฌ์šฉ ์‹œ์ 
cargo new <name> ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์‹œ
cargo build ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ ๋นŒ๋“œ ์‹คํ–‰ ์—†์ด ๋นŒ๋“œ๋งŒ ํ•  ๋•Œ
cargo run ๋นŒ๋“œ ํ›„ ์‹คํ–‰ ๊ฐœ๋ฐœ ์ค‘ ํ…Œ์ŠคํŠธ
cargo check ์—๋Ÿฌ๋งŒ ํ™•์ธ (๋นŒ๋“œ ์•ˆ ํ•จ) ๋น ๋ฅธ ์—๋Ÿฌ ์ฒดํฌ
cargo build --release ์ตœ์ ํ™”๋œ ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ ๋ฐฐํฌ์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ƒ์„ฑ
cargo test ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
cargo fmt ์ฝ”๋“œ ์ž๋™ ํฌ๋งทํŒ… ์ฝ”๋“œ ์Šคํƒ€์ผ ํ†ต์ผ
cargo clippy ๋ฆฐํŠธ ๊ฒ€์‚ฌ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ 
cargo doc --open ๋ฌธ์„œ ์ƒ์„ฑ ๋ฐ ์—ด๊ธฐ ์˜์กด์„ฑ ๋ฌธ์„œ ํ™•์ธ

2.5.1 ๋นŒ๋“œ ๋ชจ๋“œ ๋น„๊ต

ํŠน์„ฑ Debug ๋ชจ๋“œ Release ๋ชจ๋“œ
๋นŒ๋“œ ์‹œ๊ฐ„ ๋น ๋ฆ„ (1-2์ดˆ) ๋А๋ฆผ (10์ดˆ ์ด์ƒ)
์‹คํ–‰ ์†๋„ ๋А๋ฆผ ๋น ๋ฆ„ (10-100๋ฐฐ)
๋””๋ฒ„๊ทธ ์ •๋ณด ํฌํ•จ ์ œ๊ฑฐ
์ตœ์ ํ™” ์—†์Œ ์ตœ๋Œ€
๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ ํผ ์ž‘์Œ
์‚ฌ์šฉ ์‹œ์  ๊ฐœ๋ฐœ ์ค‘ ๋ฐฐํฌ ์‹œ

2.6 ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

Cargo ํ”„๋กœ์ ํŠธ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ด๋ด…์‹œ๋‹ค.

my_project/
โ”œโ”€โ”€ Cargo.toml          # ํ”„๋กœ์ ํŠธ ์„ค์ •
โ”œโ”€โ”€ Cargo.lock          # ์˜์กด์„ฑ ๋ฒ„์ „ ๊ณ ์ • (์ž๋™ ์ƒ์„ฑ)
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ main.rs         # ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง„์ž…์ 
โ”‚   โ”œโ”€โ”€ lib.rs          # ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง„์ž…์  (์„ ํƒ)
โ”‚   โ””โ”€โ”€ bin/            # ์ถ”๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ (์„ ํƒ)
โ”œโ”€โ”€ tests/              # ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
โ”œโ”€โ”€ examples/           # ์˜ˆ์ œ ์ฝ”๋“œ
โ”œโ”€โ”€ benches/            # ๋ฒค์น˜๋งˆํฌ
โ””โ”€โ”€ target/             # ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ (Git ์ œ์™ธ)
    โ”œโ”€โ”€ debug/          # ๋””๋ฒ„๊ทธ ๋นŒ๋“œ
    โ””โ”€โ”€ release/        # ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ

2.6.1 Cargo.toml ํŒŒ์ผ

ํ”„๋กœ์ ํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์˜์กด์„ฑ์„ ์ •์˜ํ•˜๋Š” TOML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค:

[package]
name = "hello_rust"
version = "0.1.0"
edition = "2021"

[dependencies]
# ์—ฌ๊ธฐ์— ์˜์กด์„ฑ ์ถ”๊ฐ€
# serde = "1.0"
# tokio = { version = "1.35", features = ["full"] }

2.7 ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ

Rust๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

2.7.1 "rustc not found" ์˜ค๋ฅ˜

์ฆ์ƒ: rustc: command not found

์›์ธ: PATH์— Rust ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Œ

ํ•ด๊ฒฐ:

# macOS/Linux
source $HOME/.cargo/env

# Windows (PowerShell)
$env:Path += ";$env:USERPROFILE\.cargo\bin"

2.7.2 "linker not found" ์˜ค๋ฅ˜

์ฆ์ƒ: error: linker 'link.exe' not found

์›์ธ: C/C++ ๋นŒ๋“œ ๋„๊ตฌ ๋ฏธ์„ค์น˜ (Windows)

ํ•ด๊ฒฐ: Visual Studio Build Tools ์„ค์น˜

2.7.3 "missing semicolon" ์˜ค๋ฅ˜

error: expected `;`, found `}`
 --> src/main.rs:3:5
  |
2 |     println!("Hello")  // ์„ธ๋ฏธ์ฝœ๋ก  ์—†์Œ
  |                       ^ help: add `;` here
3 | }
  | - unexpected token

ํ•ด๊ฒฐ: ๋ฌธ์žฅ ๋์— ์„ธ๋ฏธ์ฝœ๋ก  ์ถ”๊ฐ€


2.8 ์ฑ•ํ„ฐ ์š”์•ฝ

์ฃผ์š” ๊ฐœ๋…:

  1. rustup: Rust ๊ณต์‹ ์„ค์น˜ ๋„๊ตฌ๋กœ, ์—ฌ๋Ÿฌ ๋ฒ„์ „๊ณผ ํƒ€๊ฒŸ ๊ด€๋ฆฌ
  2. Cargo: Rust์˜ ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด์ž ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž
  3. main ํ•จ์ˆ˜: ๋ชจ๋“  Rust ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ 
  4. println! ๋งคํฌ๋กœ: ์ฝ˜์†” ์ถœ๋ ฅ์„ ์œ„ํ•œ ํ‘œ์ค€ ๋งคํฌ๋กœ
  5. ๋นŒ๋“œ ๋ชจ๋“œ: Debug (๊ฐœ๋ฐœ์šฉ)์™€ Release (๋ฐฐํฌ์šฉ) ๋‘ ๊ฐ€์ง€

2.9 ๋ณต์Šต ๋ฌธ์ œ

  1. rustup๊ณผ Cargo์˜ ์—ญํ•  ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
  2. println!์˜ !๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋‚˜์š”?
  3. cargo build์™€ cargo build --release์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์„ธ์š”.
  4. cargo check๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€๊ฐ€์š”?
  5. Cargo.toml๊ณผ Cargo.lock์˜ ์—ญํ•  ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
  6. Debug ๋นŒ๋“œ์™€ Release ๋นŒ๋“œ์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ์–ผ๋งˆ๋‚˜ ๋˜๋‚˜์š”?

2.10 ๋‹ค์Œ ์žฅ ์˜ˆ๊ณ 

3์žฅ์—์„œ๋Š” Rust์˜ ๊ฐ€์žฅ ๋…ํŠนํ•œ ๊ธฐ๋Šฅ์ธ ์†Œ์œ ๊ถŒ ์‹œ์Šคํ…œ์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์†Œ์œ ๊ถŒ, ๋นŒ๋ฆผ, ์ˆ˜๋ช…์˜ ๊ฐœ๋…์„ ํ†ตํ•ด Rust๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


Chapter 2 ์™„๋ฃŒ | ์•ฝ 15ํŽ˜์ด์ง€

๋‹ค์Œ: Chapter 3 - ์†Œ์œ ๊ถŒ

๐Ÿ“š ์ „์ฒด Ebook ๊ตฌ๋งคํ•˜๊ธฐ

EN $99 | KO $99 | Bundle $159

๐Ÿ›’ WIA Book