본문 바로가기
카테고리 없음

Rust 참조(Reference)와 빌림(Borrowing) 쉽게 이해하기

by mystory55801 2025. 5. 29.

Rust 참조(Reference)와 빌림(Borrowing) 쉽게 이해하기

Rust는 메모리 안전성을 보장하는 언어입니다. 그 핵심 기능 중 하나가 바로 참조(Reference)빌림(Borrowing)입니다. 다른 언어에서는 메모리 관리와 관련된 문제가 흔히 발생하지만, Rust는 빌림 규칙을 통해 안전하게 메모리를 공유할 수 있도록 도와줍니다.

이번 글에서는 Rust에서의 참조란 무엇인지, 그리고 불변 참조와 가변 참조의 차이를 쉽게 설명하고, 실제 예제를 통해 이해를 도와드리겠습니다.

참조(Reference)란 무엇인가?

참조란 데이터를 직접 소유하지 않고, 그 데이터에 접근할 수 있도록 하는 기능입니다. Rust에서는 & 기호를 사용하여 참조를 만듭니다.


let s = String::from("Rust");
let r = &s;
println!("참조를 통해 접근: {}", r);

여기서 rs를 참조하는 변수이며, s의 소유권은 여전히 유지됩니다. 이는 값을 복사하지 않으면서도 읽을 수 있도록 해줍니다.

빌림(Borrowing)이란?

Rust에서는 참조를 만드는 행위를 빌림(Borrowing)이라고 표현합니다. 값을 직접 복사하거나 소유권을 넘기지 않고도 함수 등에 값을 전달할 수 있게 해주는 기능입니다.

불변 빌림 (Immutable Borrowing)

불변 참조는 데이터를 수정하지 않고 읽기만 할 수 있습니다. & 기호를 사용하며, 동시에 여러 개의 불변 참조가 가능합니다.


fn print_message(msg: &String) {
    println!("메시지: {}", msg);
}

fn main() {
    let s = String::from("Hello");
    print_message(&s);
    println!("원본 그대로 사용 가능: {}", s);
}

이 경우 s의 소유권은 그대로 유지되며, 함수에서는 읽기 전용으로 값에 접근할 수 있습니다.

가변 빌림 (Mutable Borrowing)

값을 수정하고 싶을 때는 &mut 키워드를 사용해 가변 참조를 만들어야 합니다. 하지만 가변 참조는 한 번에 하나만 존재할 수 있습니다.


fn append_world(s: &mut String) {
    s.push_str(", world!");
}

fn main() {
    let mut text = String::from("Hello");
    append_world(&mut text);
    println!("{}", text);
}

가변 참조가 있는 동안에는 다른 참조를 만들 수 없고, 동시에 여러 개의 가변 참조도 허용되지 않습니다. 이것이 Rust가 데이터 경쟁 조건(data race)을 컴파일 타임에 차단할 수 있는 이유입니다.

불변 참조와 가변 참조는 동시에 불가능

Rust는 불변 참조와 가변 참조를 동시에 허용하지 않습니다. 이는 충돌을 방지하고, 코드의 안정성을 확보하기 위한 중요한 규칙입니다.


let mut s = String::from("hi");

let r1 = &s;
let r2 = &s;
let r3 = &mut s; // 오류 발생: 불변 참조가 존재하는 동안 가변 참조 불가

이런 제약이 때로는 불편하게 느껴질 수 있지만, Rust의 철저한 메모리 규칙 덕분에 런타임 오류 없이 안전한 코드를 작성할 수 있습니다.

참조의 유효 범위와 스코프

참조의 유효 범위가 끝나면 다른 참조를 만들 수 있습니다. Rust 컴파일러는 참조가 언제까지 사용되는지를 분석해 안전성을 확보합니다.


let mut s = String::from("rust");

{
    let r1 = &s; // r1의 유효 범위는 여기까지
    println!("r1: {}", r1);
} // r1이 여기서 사라지므로

let r2 = &mut s; // 이제 가변 참조 가능
r2.push_str("lang");
println!("s: {}", s);

결론: 빌림과 참조는 Rust 안전성의 핵심

Rust의 참조와 빌림 개념은 메모리를 명확하고 안전하게 다루기 위한 강력한 도구입니다. 불변 참조는 안전하게 데이터를 공유할 수 있게 하고, 가변 참조는 데이터의 변경을 컴파일 타임에 제어할 수 있게 도와줍니다.

처음에는 제한처럼 느껴질 수 있지만, 결국 이러한 규칙이 런타임 오류 없는 시스템 프로그래밍을 가능하게 합니다. 소유권(Ownership)과 함께 참조와 빌림을 제대로 이해하면, Rust의 진정한 힘을 느낄 수 있게 될 것입니다.