Rust 기본 문법 정리 - 소유권과 빌림
왜 Rust인가
최근 Rust에 관심을 갖게 되어 학습을 시작했다. Node.js로 API 서버를 운영하면서 성능 이슈가 있는 부분을 C++로 작성할까 고민했는데, Rust가 메모리 안전성과 성능을 동시에 제공한다는 점이 매력적이었다.
소유권(Ownership)
Rust의 핵심 개념이다. 각 값은 단 하나의 소유자를 가진다.
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1의 소유권이 s2로 이동
// println!("{}", s1); // 컴파일 에러
println!("{}", s2); // 정상 동작
}
JavaScript에서는 당연히 되던 것이 Rust에서는 컴파일 에러가 발생한다. 처음엔 답답했지만, 이것이 메모리 안전성을 보장하는 방법이었다.
빌림(Borrowing)
소유권을 이전하지 않고 참조만 빌려주는 방식이다.
fn calculate_length(s: &String) -> usize {
s.len()
}
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("{}, {}", s1, len); // s1 여전히 사용 가능
}
& 기호로 참조를 전달하면 소유권은 그대로 유지된다.
가변 참조
fn main() {
let mut s = String::from("hello");
change(&mut s);
println!("{}", s);
}
fn change(s: &mut String) {
s.push_str(", world");
}
가변 참조는 동시에 하나만 존재할 수 있다. 이것이 데이터 레이스를 컴파일 타임에 방지하는 방법이다.
느낀 점
아직 갈 길이 멀지만, 컴파일러가 많은 버그를 사전에 잡아준다는 점이 인상적이다. 당장 프로덕션에 도입하기는 어렵지만, 성능이 중요한 부분에 점진적으로 적용해볼 계획이다.