Rust의 참조(Reference)와 대여(Borrowing) 정리

agnusdei·2025년 1월 29일
0

Rust의 참조(Reference)와 대여(Borrowing) 정리

Rust의 참조(Reference)대여(Borrowing)는 메모리 안전성을 보장하는 핵심 개념입니다. 이를 통해 데이터를 소유권 없이 효율적으로 사용할 수 있습니다. 아래에서 관련 개념을 차근차근 설명하겠습니다.


1. 참조(Reference)란?

참조는 데이터를 직접 소유하지 않고, 해당 데이터를 가리키는 포인터와 같은 역할을 합니다. 참조는 &를 사용하여 생성됩니다.

특징:

  • 데이터를 소유하지 않으므로 원래 데이터는 여전히 사용 가능합니다.
  • 참조는 데이터를 읽거나(불변 참조) 수정(가변 참조)할 수 있는 접근 권한을 제공합니다.

예제:

let s1 = String::from("hello");
let r = &s1; // s1을 참조
println!("{}", r); // r을 통해 s1에 접근

2. 대여(Borrowing)란?

대여는 참조를 생성하여 데이터를 소유권 없이 빌려주는 과정을 의미합니다. 대여는 두 가지 형태로 나뉩니다.

(1) 불변 대여 (Immutable Borrowing)

  • 데이터를 읽을 수 있지만 변경할 수는 없습니다.
  • 여러 불변 참조를 동시에 생성할 수 있습니다.

예제:

let s1 = String::from("hello");
let r1 = &s1; // 불변 참조 1
let r2 = &s1; // 불변 참조 2
println!("{}, {}", r1, r2); // r1과 r2를 통해 데이터를 읽음

(2) 가변 대여 (Mutable Borrowing)

  • 데이터를 읽는 것뿐만 아니라 변경할 수 있습니다.
  • 가변 참조는 한 번에 하나만 생성 가능합니다.
  • 이는 데이터 경쟁(Data Race)을 방지하기 위한 Rust의 규칙입니다.

예제:

let mut s1 = String::from("hello");
let r = &mut s1; // 가변 참조
r.push_str(", world!"); // 가변 참조를 통해 값 변경
println!("{}", r); // 변경된 값 출력

3. 참조와 대여의 규칙

Rust의 안전한 메모리 관리를 위해 다음 규칙을 따릅니다:
1. 여러 불변 참조를 동시에 생성할 수 있습니다.
2. 가변 참조는 한 번에 하나만 생성할 수 있습니다.
3. 불변 참조와 가변 참조는 동시에 사용할 수 없습니다.
4. 참조는 데이터를 소유하지 않으므로 원본 데이터는 여전히 유효합니다.


4. 불변 참조 사용 후 가변 참조 가능

불변 참조와 가변 참조는 동시에 사용할 수 없지만, 불변 참조의 사용이 끝난 후에는 가변 참조를 생성할 수 있습니다. 이는 Rust의 스코프 규칙 때문입니다.

예제:

let mut s1 = String::from("hello");

// 불변 참조
let r1 = &s1;
println!("{}", r1); // r1 사용 완료

// r1의 사용이 끝났으므로 가변 참조 생성 가능
let r2 = &mut s1;
r2.push_str(", world!");
println!("{}", r2);

설명:

  • r1이 불변 참조로 데이터를 읽습니다.
  • println! 이후, r1의 사용이 끝나므로 r2라는 가변 참조를 생성할 수 있습니다.

5. 잘못된 사용 예: 불변과 가변 참조의 동시 사용

let mut s1 = String::from("hello");

let r1 = &s1;        // 불변 참조
let r2 = &mut s1;    // 에러 발생: 불변 참조가 사용 중인데 가변 참조 생성 시도

println!("{}", r1);   // r1이 사용되므로 에러 원인

에러 원인:

  • 불변 참조 r1이 여전히 사용 중인데, 가변 참조 r2를 생성하려고 했습니다.
  • Rust는 데이터 경쟁을 방지하기 위해 불변 참조와 가변 참조를 동시에 허용하지 않습니다.

6. 참조와 대여 규칙 요약

  1. 불변 참조 (&)
    • 데이터를 읽기만 가능.
    • 여러 개의 불변 참조를 동시에 생성 가능.
  2. 가변 참조 (&mut)
    • 데이터를 읽고 쓰기 가능.
    • 한 번에 하나만 생성 가능.
  3. 불변 참조와 가변 참조는 동시에 사용할 수 없다.
  4. 불변 참조 사용이 끝난 후, 가변 참조를 생성할 수 있다.

간단 요약

  • 참조(Reference): 데이터를 소유하지 않고 접근하는 방법.
  • 대여(Borrowing): 참조를 통해 데이터를 빌려주는 과정.
    • 불변 대여(&): 읽기 전용. 여러 개 허용.
    • 가변 대여(&mut): 읽기/쓰기 가능. 단, 한 번에 하나만 허용.
profile
DevSecOps ⚙️ + CTF🚩

0개의 댓글