๐ ๏ธ 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 ์ค์น
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
1) Proceed with installation (default) 2) Customize installation 3) Cancel installation
๋๋ถ๋ถ์ ๊ฒฝ์ฐ 1์ ์ ํํ๋ฉด ๋ฉ๋๋ค.
source $HOME/.cargo/env
2.1.3 Windows ์ค์น
- Visual Studio 2022 Community (๋ฌด๋ฃ)
- ๋๋ Build Tools for Visual Studio 2022
- "Desktop development with C++" ์ํฌ๋ก๋ ์ ํ
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์์ ํฌ๋ ์ดํธ ๋ฒ์ ๊ด๋ฆฌ | ๐ธ ์ ํ |
2.2.2 ๊ธฐํ IDE ์ต์
- IntelliJ IDEA / CLion - JetBrains์ Rust ํ๋ฌ๊ทธ์ธ ์ง์
- Vim / Neovim - rust.vim, coc-rust-analyzer
- Emacs - rust-mode, rustic
- Sublime Text - Rust Enhanced
2.3 Hello, World!
์ด์ ์ฒซ ๋ฒ์งธ Rust ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ด ์๋ค. Cargo๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
2.3.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 ํ๋ก๊ทธ๋จ ์คํ
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() {
// ํจ์ ๋ณธ๋ฌธ
}
fn- ํจ์ ์ ์ธ ํค์๋main- ํ๋ก๊ทธ๋จ์ ์ง์ ์ (entry point)()- ๋งค๊ฐ๋ณ์ ์์{}- ํจ์ ๋ณธ๋ฌธ
๋ชจ๋ Rust ์คํ ํ์ผ์ main ํจ์์์ ์์ํฉ๋๋ค.
2.4.2 println! ๋งคํฌ๋ก
println!("Hello, world!");
println!- ์ฝ์์ ํ ์คํธ๋ฅผ ์ถ๋ ฅํ๋ ๋งคํฌ๋ก!- ํจ์๊ฐ ์๋ ๋งคํฌ๋ก๋ฅผ ๋ํ๋"..."- ๋ฌธ์์ด ๋ฆฌํฐ๋ด;- ๋ฌธ์ฅ์ ๋ (์ธ๋ฏธ์ฝ๋ก ํ์)
๋งคํฌ๋ก 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 ์ฑํฐ ์์ฝ
์ฃผ์ ๊ฐ๋ :
- rustup: Rust ๊ณต์ ์ค์น ๋๊ตฌ๋ก, ์ฌ๋ฌ ๋ฒ์ ๊ณผ ํ๊ฒ ๊ด๋ฆฌ
- Cargo: Rust์ ๋น๋ ์์คํ ์ด์ ํจํค์ง ๊ด๋ฆฌ์
- main ํจ์: ๋ชจ๋ Rust ํ๋ก๊ทธ๋จ์ ์ง์ ์
- println! ๋งคํฌ๋ก: ์ฝ์ ์ถ๋ ฅ์ ์ํ ํ์ค ๋งคํฌ๋ก
- ๋น๋ ๋ชจ๋: Debug (๊ฐ๋ฐ์ฉ)์ Release (๋ฐฐํฌ์ฉ) ๋ ๊ฐ์ง
2.9 ๋ณต์ต ๋ฌธ์
- rustup๊ณผ Cargo์ ์ญํ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
println!์!๋ ๋ฌด์์ ์๋ฏธํ๋์?cargo build์cargo build --release์ ์ฐจ์ด์ ์ ์ค๋ช ํ์ธ์.cargo check๋ ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊ฐ์?- Cargo.toml๊ณผ Cargo.lock์ ์ญํ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
- Debug ๋น๋์ Release ๋น๋์ ์ฑ๋ฅ ์ฐจ์ด๋ ์ผ๋ง๋ ๋๋์?
2.10 ๋ค์ ์ฅ ์๊ณ
3์ฅ์์๋ Rust์ ๊ฐ์ฅ ๋ ํนํ ๊ธฐ๋ฅ์ธ ์์ ๊ถ ์์คํ ์ ๋ฐฐ์๋๋ค. ์์ ๊ถ, ๋น๋ฆผ, ์๋ช ์ ๊ฐ๋ ์ ํตํด Rust๊ฐ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋ณด์ฅํ๋์ง ์ดํดํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
Chapter 2 ์๋ฃ | ์ฝ 15ํ์ด์ง