๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

Curriculum

ยท 9๋ถ„ ์ฝ๊ธฐ

๐Ÿฆ€ Rust ํ•™์Šต ์ปค๋ฆฌํ˜๋Ÿผ (40์ผ ์™„์„ฑ)

  • Phase 1: Foundation (Day 1-13)

    • Day 1-2: Setup & Basic Syntax
    • Day 3-5: Ownership
    • Day 6-8: References & Borrowing
    • Day 9-10: Structs & Methods
    • Day 11-13: Enums & Pattern Matching
    • Phase 1 ์ข…ํ•ฉ ๋ฆฌ๋ทฐ
  • Phase 2: Data & Functional (Day 14-20)

    • Day 14-15: Collections
    • Day 16-17: Slices ์‹ฌํ™” & String ๋‚ด๋ถ€
    • Day 18-20: Iterators & Closures
  • Phase 3: Type System & Error Handling (Day 21-28)

    • Day 21-22: Error Handling ์‹ฌํ™”
    • Day 23-26: Traits & Generics
    • Day 27-28: Lifetimes
  • Phase 4: Advanced & Ecosystem (Day 29-34)

    • Day 29-30: Smart Pointers (Box, Rc, Arc, RefCell)
    • Day 31-32: Concurrency ๊ธฐ์ดˆ
    • Day 33-34: Type Conversions & Common Patterns
  • Phase 5: Project Infrastructure (Day 35-38)

    • Day 35-36: Modules, Testing & Project Structure
    • Day 37-38: ์‹ค์ „ ํฌ๋ ˆ์ดํŠธ ์ƒํƒœ๊ณ„ (serde, clap, thiserror, anyhow)
  • Phase 6: Advanced Concepts (Day 39-40)

    • Day 39-40: Macro ๊ธฐ์ดˆ & Unsafe ์ธ์‹

Phase 1: Foundation (Day 1-13)

Rust์˜ ํ•ต์‹ฌ ์ฒ ํ•™๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์˜ ๊ธฐ๋ฐ˜์„ ์„ธ์šฐ๋Š” ๋‹จ๊ณ„

Day 1-2: Setup & Basic Syntax

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
Cargonew, build, run, check ์›Œํฌํ”Œ๋กœ์šฐ
๋ณ€์ˆ˜๊ธฐ๋ณธ immutable, mut ๋ช…์‹œ, shadowing (ํƒ€์ž… ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
ํƒ€์ž…์ •์ˆ˜(i32), ์‹ค์ˆ˜(f64), bool, char, ํŠœํ”Œ, ๋ฐฐ์—ด
์ œ์–ด ํ๋ฆ„if/else, loop, while, for, ๋ชจ๋‘ expression

Python๊ณผ์˜ ํ•ต์‹ฌ ์ฐจ์ด: Rust๋Š” ๊ธฐ๋ณธ immutable (Python์€ ๊ธฐ๋ณธ mutable)

Day 3-5: Ownership

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
์†Œ์œ ๊ถŒ 3์›์น™๊ฐ’๋งˆ๋‹ค ์†Œ์œ ์ž ํ•˜๋‚˜, ์Šค์ฝ”ํ”„ ๋๋‚˜๋ฉด drop, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜
MoveHeap ํƒ€์ž…(String, Vec) ๋Œ€์ž… ์‹œ ์†Œ์œ ๊ถŒ ์ด๋™
CopyStack ํƒ€์ž…(i32, bool, char) ๋Œ€์ž… ์‹œ ๋น„ํŠธ ๋ณต์‚ฌ
CloneHeap ํƒ€์ž…์˜ ๋ช…์‹œ์  ๊นŠ์€ ๋ณต์‚ฌ (.clone())
ํ•จ์ˆ˜ ์ „๋‹ฌํ•จ์ˆ˜์— ๊ฐ’์„ ๋„˜๊ธฐ๋ฉด ์†Œ์œ ๊ถŒ๋„ ์ด๋™ (Move semantics)

ํ•ต์‹ฌ ํ†ต์ฐฐ: double-free ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ปดํŒŒ์ผ ํƒ€์ž„ ๋ณด์žฅ

Day 6-8: References & Borrowing

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
ํ•ต์‹ฌ ๊ทœ์น™&T ์—ฌ๋Ÿฌ ๊ฐœ OR &mut T ํ•˜๋‚˜ (๋™์‹œ ๊ณต์กด ๋ถˆ๊ฐ€)
๋ชฉ์ data race๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฐฉ์ง€
NLLNon-Lexical Lifetimes โ€” ์ฐธ์กฐ์˜ ์ˆ˜๋ช…์€ ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ์‹œ์ ๊นŒ์ง€
์ตœ์†Œ ๊ถŒํ•œ์ฝ๊ธฐ๋งŒ ํ•˜๋ฉด &, ์ˆ˜์ • ํ•„์š”ํ•˜๋ฉด &mut

Python๊ณผ์˜ ํ•ต์‹ฌ ์ฐจ์ด: Python ์ฐธ์กฐ๋Š” ํ•ญ์ƒ ์ˆ˜์ • ๊ฐ€๋Šฅ, Rust &๋Š” ๊ธฐ๋ณธ ์ฝ๊ธฐ ์ „์šฉ

Day 9-10: Structs & Methods

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
struct๋ฐ์ดํ„ฐ ์ •์˜ (Python class์˜ ํ•„๋“œ ๋ถ€๋ถ„)
impl๋™์ž‘ ์ •์˜ (๋ฐ์ดํ„ฐ์™€ ๋ถ„๋ฆฌ)
self 3์ข…&self(์ฝ๊ธฐ), &mut self(์ˆ˜์ •), self(์†Œ๋น„)
Associated fnSelf::new() โ€” self ์—†์ด ํ˜ธ์ถœ (:: ์‚ฌ์šฉ)
Struct update..other๋กœ ๋‚˜๋จธ์ง€ ํ•„๋“œ ๋ณต์‚ฌ (Move ์ฃผ์˜)

ํ•ต์‹ฌ ํ†ต์ฐฐ: &self = ์†Œ์œ ๊ถŒ ๋ณด์กด, self = ์†Œ์œ ๊ถŒ ์†Œ๋น„

Day 11-13: Enums & Pattern Matching

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
enumvariant๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ
matchexhaustiveness โ€” ๋ชจ๋“  variant ์ฒ˜๋ฆฌ ํ•„์ˆ˜
Option<T>Some(T) / None โ€” Rust์˜ null ๋Œ€์ฒด
Result<T, E>Ok(T) / Err(E) โ€” ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ๊ธฐ๋ณธ
if letํ•˜๋‚˜์˜ ํŒจํ„ด๋งŒ ์ฒ˜๋ฆฌํ•  ๋•Œ match์˜ ๊ฐ„๊ฒฐํ•œ ๋Œ€์•ˆ
Combinatorsmap, and_then, unwrap_or, ok_or ๋“ฑ

ํ•ต์‹ฌ ํ†ต์ฐฐ: Option/Result = ์•ˆ์ „ํ•œ ๊ฐ’ ์ฒ˜๋ฆฌ์˜ ํ‘œ์ค€ ํŒจํ„ด


Phase 2: Data & Functional (Day 14-20)

์ปฌ๋ ‰์…˜, ๋ฌธ์ž์—ด ๋‚ด๋ถ€ ๊ตฌ์กฐ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์„ ์ตํžˆ๋Š” ๋‹จ๊ณ„

Day 14-15: Collections

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
Vec<T>๋™์  ๋ฐฐ์—ด, push/pop/get/์ธ๋ฑ์‹ฑ
HashMap<K, V>ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ, insert/get/entry API
entry APIor_insert, and_modify โ€” ์กฐ๊ฑด๋ถ€ ์‚ฝ์ž…/์ˆ˜์ •
Ownership์ปฌ๋ ‰์…˜์— ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์†Œ์œ ๊ถŒ ์ด๋™
Borrowing ์ถฉ๋Œ&v[0] ์‚ด์•„์žˆ์„ ๋•Œ v.push() ๋ถˆ๊ฐ€ (์žฌํ• ๋‹น ์œ„ํ—˜)

Python ๋Œ€์‘: list โ†’ Vec, dict โ†’ HashMap

Day 16-17: Slices ์‹ฌํ™” & String ๋‚ด๋ถ€

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
&[T] / &str์Šฌ๋ผ์ด์Šค = fat pointer (ํฌ์ธํ„ฐ + ๊ธธ์ด)
String vs &strString(์†Œ์œ , Heap) vs &str(๋นŒ๋ฆผ, ์–ด๋””์„œ๋“ )
UTF-8Rust ๋ฌธ์ž์—ด์€ UTF-8, ์ธ๋ฑ์‹ฑ ๋ถˆ๊ฐ€ (s[0] โŒ)
๋ฌธ์ž์—ด ์ ‘๊ทผ.chars(), .bytes(), .char_indices()
๋ณ€ํ™˜&String โ†’ &str (์ž๋™ deref), &str โ†’ String (.to_string())

ํ•ต์‹ฌ ํ†ต์ฐฐ: fat pointer = (๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ, ๊ธธ์ด) โ€” ์•ˆ์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์˜ ํ•ต์‹ฌ

Day 18-20: Iterators & Closures

์ฃผ์ œํ•ต์‹ฌ ๊ฐœ๋…
Iterator trait.next() โ†’ Option<Item>, lazy evaluation
์–ด๋Œ‘ํ„ฐmap, filter, enumerate, zip, take, skip, chain
์†Œ๋น„์žcollect, sum, count, any, all, find, fold
Closures|args| body, ํ™˜๊ฒฝ ์บก์ฒ˜ (&, &mut, move)
Fn traitsFn(๋ถˆ๋ณ€ ๋นŒ๋ฆผ), FnMut(๊ฐ€๋ณ€ ๋นŒ๋ฆผ), FnOnce(์†Œ๋น„)
์†Œ์œ ๊ถŒ ์—ฐ๊ฒฐ.iter()(&T), .iter_mut()(&mut T), .into_iter()(T)

Python ๋Œ€์‘: list comprehension โ†’ .iter().filter().map().collect()


Phase 3: Type System & Error Handling (Day 21-28)

Rust ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ โ€” Traits, Generics, Lifetimes๋กœ ์ถ”์ƒํ™” ๋Šฅ๋ ฅ์„ ํ™•์žฅ

Day 21-22: Error Handling ์‹ฌํ™”

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
? ์—ฐ์‚ฐ์ž์—๋Ÿฌ ์ž๋™ ์ „ํŒŒ โ€” match/unwrap ๋Œ€์‹  ๊ฐ„๊ฒฐํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
์ปค์Šคํ…€ ์—๋Ÿฌenum์œผ๋กœ ๋„๋ฉ”์ธ ์—๋Ÿฌ ํƒ€์ž… ์ •์˜
From trait?๊ฐ€ ์—๋Ÿฌ ํƒ€์ž…์„ ์ž๋™ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜
์—๋Ÿฌ ์ „๋žตpanic! vs Result โ€” ์–ธ์ œ ์–ด๋–ค ๊ฒƒ์„ ์“ธ์ง€
์‹ค์ „ ํŒจํ„ดํŒŒ์ผ I/O, ํŒŒ์‹ฑ ๋“ฑ์—์„œ์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ฒด์ธ

์„ ์ˆ˜ ์ง€์‹: Phase 1์˜ Result<T, E>, Option<T>, enum, pattern matching

Day 23-26: Traits & Generics

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
Trait ์ •์˜trait = ์ธํ„ฐํŽ˜์ด์Šค โ€” ๊ณต์œ  ํ–‰๋™ ์ •์˜
Trait ๊ตฌํ˜„impl Trait for Type
ํ‘œ์ค€ TraitsDisplay, Debug, Clone, PartialEq, Iterator ๋“ฑ
derive ๋งคํฌ๋กœ#[derive(Debug, Clone, PartialEq)] ์ž๋™ ๊ตฌํ˜„
Genericsfn process<T>(item: T) โ€” ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ
Trait Bounds<T: Display + Clone> โ€” ์ œ๋„ค๋ฆญ์— ์ œ์•ฝ ์ถ”๊ฐ€
where ์ ˆ๋ณต์žกํ•œ bounds๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ํ‘œํ˜„
impl Traitํ•จ์ˆ˜ ์ธ์ž/๋ฐ˜ํ™˜์—์„œ์˜ trait ํ™œ์šฉ

Python ๋Œ€์‘: ABC(Abstract Base Class) โ†’ trait, duck typing โ†’ trait bounds

Day 27-28: Lifetimes

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
Lifetime์ด๋ž€์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•œ ๋ฒ”์œ„๋ฅผ ๋ช…์‹œํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
'a ๋ฌธ๋ฒ•fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
Lifetime elision์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™ ์ถ”๋ก ํ•˜๋Š” 3๊ฐ€์ง€ ๊ทœ์น™
Struct์˜ lifetime์ฐธ์กฐ๋ฅผ ๋‹ด๋Š” struct์— 'a ํ•„์š”
'staticํ”„๋กœ๊ทธ๋žจ ์ „์ฒด ์ˆ˜๋ช… ๋™์•ˆ ์œ ํšจํ•œ ์ฐธ์กฐ

ํ•ต์‹ฌ ๋ชฉํ‘œ: "dangling reference ๋ฐฉ์ง€"๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜๋Š”์ง€ ์ดํ•ด


Phase 4: Advanced & Ecosystem (Day 29-34)

ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ๋™์‹œ์„ฑ์˜ ๊ธฐ์ดˆ โ€” Rust์˜ ๊ณ ๊ธ‰ ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด

Day 29-30: Smart Pointers

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
Box<T>ํž™ ํ• ๋‹น, ์žฌ๊ท€ ํƒ€์ž…, trait object
Rc<T>์ฐธ์กฐ ์นด์šดํŒ… โ€” ์—ฌ๋Ÿฌ ์†Œ์œ ์ž (์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ)
Arc<T>์›์ž์  ์ฐธ์กฐ ์นด์šดํŒ… (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ)
RefCell<T>๋Ÿฐํƒ€์ž„ borrow checking โ€” interior mutability
Deref trait์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์ž๋™ ์—ญ์ฐธ์กฐ

Python ๋Œ€์‘: Python์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์‚ฌ์‹ค์ƒ Rc<RefCell<T>>์™€ ๋น„์Šทํ•œ ๊ตฌ์กฐ

Day 31-32: Concurrency ๊ธฐ์ดˆ

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
std::thread์Šค๋ ˆ๋“œ ์ƒ์„ฑ๊ณผ join
move closureํด๋กœ์ €๊ฐ€ ํ™˜๊ฒฝ์„ ์†Œ์œ ๊ถŒ์œผ๋กœ ์บก์ฒ˜
Send / Sync์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก ์•ˆ์ „์„ฑ trait
Mutex<T>์ƒํ˜ธ ๋ฐฐ์ œ โ€” lock() โ†’ MutexGuard
Arc + Mutex๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ณต์œ  ๋ฐ์ดํ„ฐ์˜ ํ‘œ์ค€ ํŒจํ„ด
์ฑ„๋„mpsc::channel โ€” ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ

ํ•ต์‹ฌ ๋ชฉํ‘œ: "fearless concurrency" โ€” ์ปดํŒŒ์ผ ํƒ€์ž„์— data race ๋ฐฉ์ง€

Day 33-34: Type Conversions & Common Patterns

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
From / Intoํƒ€์ž… ๋ณ€ํ™˜์˜ ํ‘œ์ค€ trait
TryFrom / TryInto์‹คํŒจ ๊ฐ€๋Šฅํ•œ ๋ณ€ํ™˜ (โ†’ Result)
AsRef / AsMut์ €๋ ดํ•œ ์ฐธ์กฐ ๋ณ€ํ™˜
Display / ToString๋ฌธ์ž์—ด ํ‘œํ˜„
Iterator ์‹ฌํ™”์ปค์Šคํ…€ Iterator ๊ตฌํ˜„
Builder ํŒจํ„ด๋ณต์žกํ•œ ๊ตฌ์กฐ์ฒด ์ƒ์„ฑ ํŒจํ„ด
Newtype ํŒจํ„ดํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์œ„ํ•œ ๋ž˜ํผ

Phase 5: Project Infrastructure (Day 35-38)

์‹ค์ „ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐํ™”, ํ…Œ์ŠคํŒ…, ์ƒํƒœ๊ณ„ ํ™œ์šฉ

Day 35-36: Modules, Testing & Project Structure

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
mod ์‹œ์Šคํ…œmod, use, pub โ€” ์ฝ”๋“œ ๊ตฌ์กฐํ™”
ํŒŒ์ผ ๊ตฌ์กฐlib.rs vs main.rs, ๋ชจ๋“ˆ ํŠธ๋ฆฌ
๊ฐ€์‹œ์„ฑpub, pub(crate), pub(super)
#[test]๋‹จ์œ„ ํ…Œ์ŠคํŠธ, assert!, assert_eq!
#[cfg(test)]ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ ๋ถ„๋ฆฌ
Integration testtests/ ๋””๋ ‰ํ† ๋ฆฌ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
Documentation/// doc comment, cargo doc

Python ๋Œ€์‘: import โ†’ use, __init__.py โ†’ mod.rs

Day 37-38: ์‹ค์ „ ํฌ๋ ˆ์ดํŠธ ์ƒํƒœ๊ณ„

ํฌ๋ ˆ์ดํŠธ์šฉ๋„Python ๋Œ€์‘
serde + serde_json์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”json ๋ชจ๋“ˆ
clapCLI ์ธ์ž ํŒŒ์‹ฑargparse
thiserror๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์šฉ ์—๋Ÿฌ ์ •์˜์ปค์Šคํ…€ Exception
anyhow์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์ผ๋ฐ˜ Exception ์ฒ˜๋ฆฌ
tokio (์†Œ๊ฐœ)๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„asyncio

ํ•ต์‹ฌ ๋ชฉํ‘œ: Cargo.toml ์˜์กด์„ฑ ๊ด€๋ฆฌ + ์‹ค์ „์—์„œ ์ž์ฃผ ์“ฐ๋Š” ํฌ๋ ˆ์ดํŠธ ์ฒดํ—˜


Phase 6: Advanced Concepts (Day 39-40)

Rust์˜ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์•ˆ์ „์„ฑ ๊ฒฝ๊ณ„๋ฅผ ์ดํ•ดํ•˜๋Š” ๋งˆ๋ฌด๋ฆฌ ๋‹จ๊ณ„

Day 39-40: Macro ๊ธฐ์ดˆ & Unsafe ์ธ์‹

์ฃผ์ œํ•™์Šต ๋‚ด์šฉ
์„ ์–ธ์  ๋งคํฌ๋กœmacro_rules! โ€” vec![], println!์˜ ์›๋ฆฌ
๋งคํฌ๋กœ ํŒจํ„ด๋ฐ˜๋ณต($()*), ๋งค์นญ, ํ† ํฐ ํŠธ๋ฆฌ
์ ˆ์ฐจ์  ๋งคํฌ๋กœderive macro ๊ฐœ๋… ์ดํ•ด (๊นŠ์ด ํŒŒ์ง€๋Š” ์•Š์Œ)
unsafe ํ‚ค์›Œ๋“œ์•ˆ์ „ํ•œ Rust๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” 5๊ฐ€์ง€
unsafe ์‚ฌ์šฉ์ฒ˜raw pointer, FFI, unsafe impl
์ฒ ํ•™unsafe = "๋‚ด๊ฐ€ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ฒ ๋‹ค"๋Š” ์„ ์–ธ

ํ•ต์‹ฌ ๋ชฉํ‘œ: ๋งคํฌ๋กœ์˜ ๋™์ž‘ ์›๋ฆฌ ์ดํ•ด + unsafe์˜ ์กด์žฌ ์ด์œ ์™€ ์‚ฌ์šฉ ๊ธฐ์ค€ ์ธ์‹