💻
프로그래밍
보로우 체커
Borrow Checker
Rust 컴파일러의 핵심 기능. 소유권과 빌림 규칙을 검사하여 메모리 안전성 보장.
Borrow Checker
Rust 컴파일러의 핵심 기능. 소유권과 빌림 규칙을 검사하여 메모리 안전성 보장.
보로우 체커(Borrow Checker)는 Rust 컴파일러의 핵심 구성 요소로, 소유권과 빌림 규칙을 컴파일 시점에 검증합니다. 이를 통해 런타임 오버헤드 없이 메모리 안전성과 데이터 레이스 방지를 보장합니다.
보로우 체커가 강제하는 핵심 규칙은 다음과 같습니다: 어떤 시점에든 하나의 가변 참조(&mut)만 존재하거나, 여러 개의 불변 참조(&)만 존재할 수 있습니다. 가변 참조와 불변 참조는 동시에 존재할 수 없습니다.
이 규칙은 데이터 레이스를 컴파일 시점에 방지합니다. 여러 스레드가 같은 데이터에 접근할 때, 적어도 하나가 쓰기를 하면 데이터 레이스가 발생할 수 있는데, Rust의 타입 시스템이 이를 원천적으로 차단합니다.
보로우 체커는 처음에는 제약적으로 느껴질 수 있지만, 익숙해지면 더 안전하고 명확한 코드를 작성하게 됩니다. Rust의 NLL(Non-Lexical Lifetimes) 도입으로 보로우 체커가 더 스마트해져서 이전보다 많은 패턴이 허용됩니다.
fn main() {
// 불변 빌림: 여러 개 가능
let s = String::from("hello");
let r1 = &s;
let r2 = &s;
println!("{}, {}", r1, r2); // OK
// 가변 빌림: 하나만 가능
let mut s = String::from("hello");
let r1 = &mut s;
// let r2 = &mut s; // 에러! 이미 가변 빌림 존재
r1.push_str(" world");
println!("{}", r1);
// 불변 + 가변 동시 불가
let mut s = String::from("hello");
let r1 = &s; // 불변 빌림
// let r2 = &mut s; // 에러! 불변 빌림이 아직 사용 중
println!("{}", r1); // r1 사용 종료
// NLL: 사용 범위가 끝나면 새 빌림 가능
let r2 = &mut s; // OK! r1은 더 이상 사용되지 않음
r2.push_str("!");
println!("{}", r2);
// 댕글링 참조 방지
// fn dangle() -> &String {
// let s = String::from("hello");
// &s // 에러! s는 함수 종료 시 해제됨
// }
// 올바른 방법: 소유권 이동
fn no_dangle() -> String {
let s = String::from("hello");
s // 소유권 이동
}
}