Rust 기초 학습 시작 - 소유권 개념 이해하기
배경
최근 시스템 프로그래밍 언어에 관심이 생겨 Rust를 학습하기 시작했다. JavaScript/Node.js만 사용하다 보니 메모리 관리를 직접 신경 쓸 일이 없었는데, Rust는 GC 없이도 메모리 안정성을 보장한다는 점이 매력적으로 느껴졌다.
소유권 개념
Rust의 핵심은 소유권 시스템이다. 각 값은 단 하나의 소유자를 가지며, 소유자가 스코프를 벗어나면 자동으로 메모리가 해제된다.
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1의 소유권이 s2로 이동
// println!("{}", s1); // 컴파일 에러
println!("{}", s2); // 정상 동작
}
처음에는 이 개념이 불편하게 느껴졌다. JavaScript에서는 자유롭게 변수를 복사하고 참조할 수 있었는데, Rust는 소유권 이동(move)과 빌림(borrow)을 명확히 구분한다.
빌림과 참조
값의 소유권을 넘기지 않고 참조만 전달하려면 빌림을 사용한다.
fn calculate_length(s: &String) -> usize {
s.len()
}
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("'{}' length: {}", s1, len); // s1 여전히 사용 가능
}
느낀 점
컴파일 에러와 싸우는 시간이 많았지만, 컴파일만 통과하면 런타임 메모리 오류가 거의 없다는 점이 인상적이다. 아직은 낯설지만 계속 학습해볼 예정이다.
당장 프로덕션에 적용하기는 어렵겠지만, 시스템 레벨에 대한 이해도를 높이는 데 도움이 될 것 같다.