Rust λ©λͺ¨λ¦¬ κ΄λ¦¬ λ§μ€ν°
Rustμ κ°μ₯ μ΄λ €μ΄ κ°λ λ€μ μκ°μ μΌλ‘ νμ΅νμΈμ!
π¨ μΈν°λν°λΈ μκ°ν
Canvas κΈ°λ° μ€μκ° λ©λͺ¨λ¦¬ λ€μ΄μ΄κ·Έλ¨
π μ’ ν© νν 리μΌ
Ownership, Borrowing, Lifetimes, Primitives
π° νν μ€μ ν΄κ²°
μ΄λ³΄ κ°λ°μλ€μ΄ κ²ͺλ 7κ°μ§ μ΄λ €μ
μμνκΈ°
μ νμμ μνλ μ£Όμ λ₯Ό μ ννμΈμ!
- μκ°ν λꡬ: Ownership, Borrowing, Lifetimes μμ
- Primitives: Copy traitκ³Ό μμ νμ
- μ΄λ³΄ μ΄λ €μ: νν μ€μμ ν΄κ²°μ±
π¨ μΈν°λν°λΈ μκ°ν λꡬ
Ownership, Borrowing, Lifetimesλ₯Ό μκ°μ μΌλ‘ νμ΅νμΈμ!
μμ μ ν
1οΈβ£ Ownership μμ
2οΈβ£ Borrowing μμ
3οΈβ£ Lifetimes μμ
π ν΅μ¬ κ°λ
π° Ownership = λ§λ² λμκ΄
- κ° μ± μ ν λͺ μ μ£ΌμΈλ§ μμ
- μ£ΌμΈμ΄ λμκ΄μ λκ°λ©΄ μ± μ¬λΌμ§
- λΉλ €μ€ μλ μμ§λ§ μμ κΆμ μμ
π Borrowing = μ± λΉλ¦¬κΈ°
- μ¬λ¬ μ¬λμ΄ λμμ μ½κΈ° κ°λ₯ (&T)
- ν λͺ λ§ μμ κ°λ₯ (&mut T)
- μ½λ μ€μλ μμ λΆκ°
β³ Lifetimes = λμ¬ κΈ°κ°
- κ° μ°Έμ‘°λ μ ν¨ κΈ°κ°μ΄ μμ
- κ°μ₯ μ§§μ κΈ°κ°μ΄ μ μ©λ¨
- μ»΄νμΌλ¬κ° μλ μΆλ‘
π¦ Primitives & Copy Trait
μμ νμ κ³Ό Copy traitμ μ΄ν΄νμΈμ!
μμ μ ν
1οΈβ£ Copy Trait
μμ νμ μ Copy λ©λλ€!
let x = 5;
let y = x; // Copy!
println!("{}", x); // β
OK
2οΈβ£ Move vs Copy
Copyμ Moveμ μ°¨μ΄λ₯Ό λΉκ΅ν΄λ³΄μΈμ!
// Copy (i32)
let x = 5;
let y = x; // β
λ λ€ μ ν¨
// Move (String)
let s1 = String::from("Hello");
let s2 = s1; // β οΈ s1 무ν¨ν
3οΈβ£ λͺ¨λ μμ νμ
Rustμ λͺ¨λ μμ νμ μ λ§λ보μΈμ!
4οΈβ£ Stack vs Heap
μμ νμ μ Stackμ, 컬λ μ μ Heapμ μ μ₯λ©λλ€!
π Primitives ν΅μ¬ μ 리
π Copy Trait = 볡μ¬κΈ°
- π μλ³Έμ κ·Έλλ‘ λ³΅μ¬
- β 볡μ¬λ³Έκ³Ό μλ³Έ λͺ¨λ μ ν¨
- β‘ λ§€μ° λΉ λ₯Έ λΉνΈ 볡μ¬
- πΎ Stackμλ§ μ μ₯
π¦ μμ νμ λͺ©λ‘
- μ μ: i8, i16, i32, i64, i128, isize
- μ μ: u8, u16, u32, u64, u128, usize
- λΆλμμμ : f32, f64
- λΆλ¦¬μΈ: bool (true/false)
- λ¬Έμ: char (μ λμ½λ)
- νν: (T1, T2, ...)
π μ±λ₯ ν
- β κ°λ₯ν μμ νμ μ¬μ©: λ λΉ λ¦
- β λΆνμν String μ¬μ©: &strμ΄ λ λΉ λ¦
- π‘ Stackμ΄ Heapλ³΄λ€ 10-100λ°° λΉ λ¦
π° μ΄λ³΄ κ°λ°μκ° κ²ͺλ μ΄λ €μ
Rust μ΄λ³΄ κ°λ°μλ€μ΄ κ°μ₯ λ§μ΄ κ²ͺλ 7κ°μ§ μ΄λ €μμ μκ°ννκ³ , ν΄κ²°μ± μ μ μν©λλ€!
1οΈβ£ "μ use of moved value μλ¬κ° λλμ?"
β νν μ€μ
let s1 = String::from("Hello");
let s2 = s1;
println!("{}", s1); // β Error!
β ν΄κ²°μ±
let s1 = String::from("Hello");
let s2 = s1.clone();
println!("{}", s1); // β
OK
2οΈβ£ "μ cannot borrow as mutable μλ¬κ° λλμ?"
β νν μ€μ
let s = String::from("Hello");
let r1 = &s;
let r2 = &mut s; // β Error!
β ν΄κ²°μ±
let mut s = String::from("Hello");
let r1 = &s;
drop(r1);
let r2 = &mut s; // β
OK
3οΈβ£ "μλͺ μ λν μ΄μ ('a)μ΄ λκ°μ?"
β μλ¬
fn longest(x: &str, y: &str) -> &str {
// β Missing lifetime
if x.len() > y.len() { x } else { y }
}
β ν΄κ²°μ±
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
// β
Lifetime λͺ
μ
if x.len() > y.len() { x } else { y }
}