Mozilla에서 개발한 시스템 프로그래밍 언어다. 메모리 안전성과 높은 성능을 동시에 잡았고, C/C++의 대안으로 주목받고 있다.
GC 없이 메모리 안전을 보장한다. 컴파일 타임에 메모리 버그를 잡아내는 게 핵심이다.
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1의 소유권이 s2로 이동
// println!("{}", s1); // 컴파일 에러!
}
소유권을 넘기지 않고 참조만 빌려줄 수 있다. 라이프타임으로 참조의 유효 범위를 추적한다.
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1); // 빌려주기만 함
println!("{}: {}", s1, len); // s1 여전히 사용 가능
}
fn calculate_length(s: &String) -> usize {
s.len()
}
Rust의 가장 강력한 특징 중 하나다. 소유권 시스템 덕분에 데이터 레이스를 컴파일 타임에 방지한다.
use std::thread;
fn main() {
let v = vec![1, 2, 3];
let handle = thread::spawn(move || {
println!("{:?}", v); // move로 소유권 이전
});
handle.join().unwrap();
}
채널을 통한 메시지 패싱도 깔끔하다:
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
tx.send("hello").unwrap();
});
println!("{}", rx.recv().unwrap());
}
고수준 추상화를 써도 런타임 오버헤드가 없다. 이터레이터, 클로저 등을 마음껏 써도 직접 작성한 저수준 코드만큼 빠르다.
match 표현식으로 강력한 패턴 매칭이 가능하다. 모든 케이스를 처리해야 컴파일되기 때문에 실수를 방지할 수 있다.
enum Result<T, E> {
Ok(T),
Err(E),
}
fn main() {
let result: Result<i32, &str> = Ok(42);
match result {
Ok(value) => println!("성공: {}", value),
Err(e) => println!("실패: {}", e),
}
}
| 분야 | 예시 |
|---|---|
| 시스템 프로그래밍 | OS, 드라이버 |
| 웹 백엔드 | Actix, Axum |
| CLI 도구 | ripgrep, bat |
| 웹어셈블리 | 브라우저 고성능 앱 |
| 블록체인 | Solana, Polkadot |
러닝 커브가 있지만, 한 번 익히면 안전하고 빠른 코드를 작성할 수 있다. Stack Overflow에서 8년 연속 "가장 사랑받는 언어" 1위를 차지한 데는 이유가 있다.
처음엔 컴파일러와 싸우겠지만, 결국 컴파일러가 가장 좋은 친구가 될 거다. 🦀
참고 자료