๐ RUST, ๊ธฐํธ
๐ณ๏ธโ๐ [๊ถ๊ธํ์ ]
๐[๋ชฉ์ฐจ]
- ๐ ๊ฐ์
- ๐ฐ ๋ด์ฉ
- Rust ๊ธฐํธ๋ค
- :: (๊ฒฝ๋ก ์ฐ์ฐ์)
- ๋ชจ๋, ํจ์, ํ์ , ์์ ๋ฑ์ ๊ฒฝ๋ก๋ก ์ ๊ทผํ ๋ ์ฌ์ฉ
- => (ํจํด ๋งค์นญ ๊ฒฐ๊ณผ)
- match, if let, for ๋ฑ์์ ํจํด์ ๋งค์นญ๋์์ ๋ ์ํํ ์์ ์ ์ง์
- -> (ํจ์ ๋ฐํ ํ์ )
- ํจ์๋ ํด๋ก์ ์ ๋ฆฌํด ํ์ ๋ช ์
- ? (์๋ฌ ์ ํ ์ฐ์ฐ์)
- Result๋ Option์์ ์ค๋ฅ๋ฅผ ๋ง๋๋ฉด ์ฆ์ ๋ฐํ
- ! (๋งคํฌ๋ก, Never ํ์ )
- .. (๋ฒ์, ๊ตฌ์กฐ์ฒด ํ๋ ์๋ต)
- (์ ๋ค๋ฆญ ํ์ )
- ํ์ ์ ์ผ๋ฐํ (ํจ์, ๊ตฌ์กฐ์ฒด, ํธ๋ ์ ๋ฑ์์)
- * (ํฌ์ธํฐ ์ญ์ฐธ์กฐ / ๊ณฑ์ )
- \& (์ฐธ์กฐ, ์ฐธ์กฐ์)
- as (ํ๋ณํ)
- | (ํด๋ก์ , ๋นํธ ์ฐ์ฐ)
- RUST ๊ธฐํธ ์์ฝ ํ ์ด๋ธ
- โ ๏ธ ์๋ ค์ง ๋ฌธ์ ๋ฐ ํด๊ฒฐ๋ฒ
- ์์ฉ
Rust์ ๊ธฐํธ๊ฐ ๋ณต์กํ๋ค๊ณ ๋๊ปด์ง๋ ์ด์ ๋, ์ธ์ด์ ํน์ฑ๊ณผ ์ฒ ํ, ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋์์ ์ถ๊ตฌํ๋ ค๋ ์ค๊ณ ๋ชฉํ์์ ๋น๋กฏ๋๋ค. Rust๋ฅผ ๋ ํธํ๊ฒ ์ตํ๊ธฐ ์ํด์๋ ์ต์ํ ๊ธฐํธ๋ค์ ์๋ฏธ๋ฅผ ์ ํํ ํ์ ํ๊ณ ๋ค์ํ ์์ ๋ฅผ ํตํด ํจํด์ ๋ฐ๋ณต ํ์ตํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค.
Rust๋ ์์คํ
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก์ C/C++์ฒ๋ผ ์ ์์ค ์ ์ด(ํฌ์ธํฐ, ๋ฉ๋ชจ๋ฆฌ, lifetimes ๋ฑ)๋ฅผ ์ ๊ณตํ๋ฉด์๋, ๊ณ ์์ค ์ธ์ด์ ์ถ์ํ(์ ๋ค๋ฆญ, trait, async ๋ฑ)๋ฅผ ๊ฐ์ถ๊ณ ์๋ค.
๊ทธ๋์ *, &, ->, , 'a, unsafe ๊ฐ์ ๊ธฐํธ์ ๊ฐ๋
์ด ํจ๊ป ์กด์ฌํ๋ค.
fn foo<'a, T>(x: &'a T) -> &'a T // lifetime, reference, generic ์ ๋ถ
Rust๋ ์ปดํ์ผ ํ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ์ํด ๊ฐ๋ ์ ๊ธฐํธ๋ก ๋๋ฌ๋ด๋ ๋ฐฉ์์ ํํ๋ค.
C๋ Python์์๋ ์๋ฌต์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๊ฐ๋ ๋ค์ด Rust์์๋ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋๊ธฐ ๋๋ฌธ์ ๊ธฐํธ๊ฐ ๋ ๋ง๊ณ ๋์ ๋๋ค.
Rust๋ ๋ช ํํ๊ณ ์๋๋ ํํ์ ์ ํธํ๋ค. ์ถ๋ก ๋ณด๋ค๋ ํ์ /๋์/์๋ฌ ๋ฑ์ ๋ช ์์ ์ผ๋ก ํํํด์ผ ํ๋ค.
let result: Result<i32, String> = some_function()?; // ?๋ก ์๋ฌ ์ ํ
let closure = |x: i32| -> i32 { x + 1 }; // -> ๋ฆฌํด ํ์
์ฝ๋ ํด์์ด ์ด๋ ต๋๋ผ๋, ์คํ ์ ์ค๋ฅ๋ณด๋ค ์ปดํ์ผ ์ ์ค๋ฅ๋ฅผ ์ ํธํ๊ธฐ ๋๋ฌธ์, ๋ณต์กํ ๊ธฐํธ๋ฅผ ๊ฐ์ํ๋ค.
Rust๋ ๋ค์์ ๋์์ ์ง์ํ๋ค.
| ๊ธฐ๋ฅ | ์์ |
|---|---|
| ํจํด ๋งค์นญ | match, if let, while let ๋ฑ ๋ค์ํ ํจํด ์ฌ์ฉ |
| ํธ๋ ์ ๊ธฐ๋ฐ ์ ๋ค๋ฆญ | <T: Trait> |
| ๋น๋๊ธฐ/๋์์ฑ | async/await, .await |
| ์์ ๊ถ ๋ชจ๋ธ | &, &mut, Box<T>, Rc<T>, Arc<T> ๋ฑ |
์ด๋ฐ ํํ๋ค์ ๊ฐ๊ฒฐํ๊ฒ ํํํ๋ ค๋ค ๋ณด๋ ๋ค์ํ ๊ธฐํธ๊ฐ ์๊ฒผ๋ค.
C++์ด๋ Java์์๋ ์ธ์ด์ ๋ด์ฅ๋ ๊ธฐ๋ฅ๋, Rust์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. ๊ทธ๋์ ์ ๊ทผ ๋ฐฉ์๋ ๋ค๋ฅด๋ค.
Vec::new()
Option::map()
Result<T, E>::unwrap_or()
๊ฒฝ๋ก ์ฐ์ฐ์ :: ๊ฐ์ ๊ธฐํธ ์ฌ์ฉ์ด ์ฆ์์ง๋ค.
std::fs::File::open("file.txt")?;
let num = i32::from_str_radix("FF", 16)?;
match x {
1 => println!("one"),
_ => println!("other"),
}
fn add(a: i32, b: i32) -> i32 {
a + b
}
let file = File::open("config.txt")?; // ์คํจํ๋ฉด ํจ์๋ Err๋ก ๋ฐํ๋จ
(1) ๋งคํฌ๋ก ํธ์ถ
println!("Hello");
vec![1, 2, 3];
(2) Never ํ์ (!)
fn panic_and_die() -> ! {
panic!("crash");
}
(1) ๋ฒ์ ์ฐ์ฐ์
for i in 0..5 { } // 0๋ถํฐ 4๊น์ง
for i in 0..=5 { } // 0๋ถํฐ 5๊น์ง
(2) ๊ตฌ์กฐ์ฒด ํ๋ ์๋ต
let p = Point { x: 3, ..other_point };
fn print_all<T: Debug>(v: Vec<T>) {
println!("{:?}", v);
}
(1) ์ญ์ฐธ์กฐ
let x = 10;
let p = &x;
let y = *p; // p๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ป์
(2) ๊ณฑ์
let area = width * height;
(1) ์ฐธ์กฐ ์์ฑ
let s = String::from("hello");
let r = &s; // ์ฐธ์กฐ์
(2) ํจํด ๋งค์นญ ์ฐธ์กฐ
match &x {
&1 => println!("One"),
_ => {}
}
let f = 42 as f64;
let c = b'A' as char;
(1) ํด๋ก์ ์ธ์
let square = |x: i32| x * x;
(2) ๋นํธ ์ฐ์ฐ
let flags = READ | WRITE;
| ๊ธฐํธ | ์ฉ๋ ์์ฝ | |
|---|---|---|
:: | ๊ฒฝ๋ก ํ์ (๋ชจ๋, ํจ์, ํ์ ๋ฑ) | |
=> | match ๋ถ๊ธฐ ์กฐ๊ฑด | |
-> | ํจ์ ๋ฆฌํด ํ์ | |
? | ์ค๋ฅ ์๋ ์ ํ | |
! | ๋งคํฌ๋ก ํธ์ถ / never ํ์ | |
.. | ๋ฒ์, ๊ตฌ์กฐ์ฒด ํ๋ ์๋ต | |
<T> | ์ ๋ค๋ฆญ ํ์ | |
* | ์ญ์ฐธ์กฐ ๋๋ ๊ณฑ์ | |
& | ์ฐธ์กฐ ์์ฑ / ์ฐธ์กฐ ์ ๋ฌ | |
as | ๋ช ์์ ํ๋ณํ | |
\ | ํด๋ก์ ์ธ์ / ๋นํธ or ์ฐ์ฐ์ |
๊ฐ์ ํจ์๋ผ๋ ์์น์ ๋ฐ๋ผ ::/.์ด ๋ฌ๋ผ์ง๊ณ , ์ด์ฌ์์๊ฒ ์ง๊ด์ ์ด์ง ์์
::๋ ํ์ /๋ชจ๋ ์ ๊ทผ
.๋ ๊ฐ์ ๋ฉ์๋ ํธ์ถ
->๋ ํจ์ ๋ฆฌํด ํ์
์์:
Vec::new(); // ํ์
์์ ์ฐ๊ด ํจ์ ํธ์ถ
let v = vec![1, 2, 3];
v.iter().map(|x| x + 1); // ๋ฉ์๋ ์ฒด์ด๋
fn foo() -> Result<()> { ... } // ํจ์ ๋ฐํ
C/C++์ ์ต์ํ ์ฌ๋์ ๋ฐ์๋ค์ด๊ธฐ ์ฌ์ฐ๋, Python/Java ๊ฐ๋ฐ์์๊ฒ๋ ๊ฐ๋ ์ ์ผ๋ก ์ด๋ ต๊ณ ๊ธฐํธ๊ฐ ์ง๊ด์ ์ด์ง ์์
let x = 5;
let r = &x; // ์ฐธ์กฐ
let y = *r; // ์ญ์ฐธ์กฐ
์ด์ฌ์๋ "์ด๊ฑด ๋ญ ์ฐธ์กฐํ๋ ๊ธฐํธ์ธ๊ฐ?" ํ๋ฉฐ &์ ํผ๋ํ๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ถ๋ก ์ ํด์ฃผ์ง๋ง, ๋ช ์๊ฐ ํ์ํ ๋ ํฐ ์ง์ ์ฅ๋ฒฝ์ด๋ค.
์๋ฏธ๋ ๊ฐ๋จํ์ง๋ง ์จ๊ฒจ์ง ๋ฐํ ํ๋ฆ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ด์ฌ์๊ฐ ๋๋ฒ๊น ํ ๋ ์ด๋ ค์
ํ ๊ธฐํธ์ ๋๋ฌด ๋ง์ ์๋ฏธ๊ฐ ์์ด์, ์ปจํ ์คํธ ์์ด ๋ณด๋ฉด ํท๊ฐ๋ฆผ
๋ณต์ฌ
ํธ์ง
0..10 // ๋ฒ์
Point { x, ..p } // ๊ตฌ์กฐ์ฒด ํ๋ ์ฑ์ฐ๊ธฐ
match x { 1..=3 => ... } // ํจํด ๋งค์นญ
let f = |x| x + 1; // ํด๋ก์
match x { 1 => "one" } // ํจํด ๋งค์นญ
์ด๊ธฐ์๋ ๊ธฐํธ๋ณด๋ค ํจํด ์ค์ฌ์ผ๋ก ํ์ต
โ ์: match, impl, async ๋ณ๋ก ์์ฃผ ์ฐ์ด๋ ๊ธฐํธ ์ ๋ฆฌ
์ปจํ ์คํธ๋ฅผ ๊ตฌ๋ถํ๋ ํ๋ จ
โ &x๋ ๊ฐ, &T๋ ํ์ ์์์ ์ฐธ์กฐ
โ ::๋ ํ์ ์ด๋ ์ฐ๊ด ํจ์, .๋ ์ธ์คํด์ค ๋ฉ์๋
IDE(์: rust-analyzer)์ ๋์ ์ ๊ทน ํ์ฉ
โ ์ด๋ค ๊ธฐํธ๊ฐ ์ด๋ค ์๋ฏธ๋ก ์ฌ์ฉ๋์๋์ง ๋ง์ฐ์ค ์ค๋ฒ๋ก ํ์ธ