Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

소유권과 빌림: Rust의 심장

학습 목표: 파이썬 개발자가 가장 어려워하는 개념인 **소유권(Ownership)**을 정복합니다. 가비지 컬렉터(GC) 없이 메모리를 관리하는 원리를 이해하고, '이동(Move)'과 '빌림(Borrow)'의 차이를 통해 런타임 에러 없는 안전한 코드를 작성하는 법을 배웁니다.


1. 소유권이란 무엇인가?

파이썬은 GC가 알아서 메모리를 치워주지만, Rust는 모든 값에 **딱 하나의 주인(Owner)**이 있습니다. 주인이 사라지면 값도 즉시 메모리에서 사라집니다.

# [Python] 여러 변수가 하나의 객체를 가리킴 (참조 횟수 기반)
a = [1, 2, 3]
b = a  # a와 b가 같은 리스트를 바라봄
b.append(4)
print(a) # [1, 2, 3, 4] - a도 같이 바뀜!
#![allow(unused)]
fn main() {
// [Rust] 소유권 이동 (Move)
let a = vec![1, 2, 3];
let b = a; // 소유권이 a에서 b로 '이동'함
// println!("{:?}", a); // ❌ 에러: 더 이상 a를 쓸 수 없음
}

소유권의 세 가지 규칙

  1. 모든 값은 각자의 주인이 있다.
  2. 주인은 한 번에 딱 한 명뿐이다.
  3. 주인이 스코프(Scope)를 벗어나면 값은 메모리에서 자동 해제된다.

2. 빌림 (Borrowing): 빌려주기 vs 소유권 넘기기

매번 소유권을 넘기는 것은 불편합니다. 그래서 Rust는 **참조자(&)**를 사용해 값을 잠시 빌려오는 기능을 제공합니다.

  • 불변 빌림 (&T): 읽기 전용으로 빌려옵니다. 여러 명이 동시에 읽을 수 있습니다.
  • 가변 빌림 (&mut T): 수정할 수 있게 빌려옵니다. 딱 한 명만 빌려갈 수 있습니다.
#![allow(unused)]
fn main() {
fn print_vec(v: &Vec<i32>) { // 읽기 전용으로 빌림 (소유권 유지)
    println!("{:?}", v);
}

let v = vec![1, 2, 3];
print_vec(&v); // 빌려줌
println!("{:?}", v); // 주인은 여전히 나 (사용 가능)
}

3. 이동(Move) vs 복사(Copy)

파이썬에서는 정수나 불리언 같은 기본 타입은 값이 복사되지만, 리스트나 딕셔너리는 참조가 공유됩니다. Rust도 비슷하지만 기준이 더 엄격합니다.

  • Copy 타입: 정수, 부동 소수점, 불리언 등 (크기가 작고 고정됨). 대입 시 값이 복사됩니다.
  • Move 타입: String, Vec, HashMap 등 (크기가 가변적임). 대입 시 소유권이 이동합니다. 데이터를 복제하고 싶다면 반드시 .clone()을 명시해야 합니다.

4. 스마트 포인터 (Smart Pointers)

소유권 규칙이 너무 까다로울 때 사용하는 도구들입니다. 파이썬의 객체 모델과 가장 흡사해지는 지점입니다.

  • Box<T>: 데이터를 힙(Heap)에 저장하고 소유권은 혼자 가집니다.
  • Rc<T>: 여러 명이 소유권을 공유할 때 사용합니다. (파이썬의 참조 횟수 계산 방식과 유사)
  • Arc<T>: Rc의 멀티스레드 안전 버전입니다.
  • RefCell<T>: 불변 데이터 내부의 값을 가변적으로 바꿀 수 있게 해줍니다. (내부 가변성)

💡 실무 팁: Rc<RefCell<T>>

파이썬처럼 "여러 곳에서 공유하고 어디서든 수정하고 싶다"면 이 조합을 사용합니다. 하지만 성능 오버헤드가 있으므로, 가급적 Rust의 기본 소유권/빌림 규칙을 따르는 설계를 먼저 고민하세요.


💡 실무 팁: 컴파일러의 에러 메시지는 '친구'입니다

빌림 검사기(Borrow Checker)가 내뱉는 에러는 당신을 괴롭히려는 것이 아니라, 나중에 발생할 런타임 버그나 데이터 경합을 미리 막아주는 예방 주사입니다. 에러 메시지를 천천히 읽어보면 대부분 어떻게 수정해야 할지 친절하게 알려줍니다.