Rust 소유권(Ownership)

agnusdei·2025년 1월 29일

Rust 소유권과 std::mem::drop 요약


1. 소유권(Ownership) 개념

Rust의 소유권(Ownership)은 메모리 안전성을 보장하기 위한 핵심 시스템으로, 각 데이터가 하나의 소유자를 가지며 소유자가 범위를 벗어나면 메모리가 자동 해제됩니다. 이를 통해 런타임 가비지 컬렉션 없이 안전하고 효율적인 메모리 관리를 제공합니다.


2. 소유권의 주요 원칙

  1. 각 데이터는 하나의 소유자만 가질 수 있다.
  2. 소유자가 범위를 벗어나면 데이터는 해제된다.
  3. 데이터에 대한 가변 참조(Mutable Reference)는 동시에 하나만 가능하다.

3. 소유권의 활용

  1. 소유권 이동(Move): 데이터 소유권을 다른 변수로 이전.
  2. 대여(Borrowing): 소유권을 유지한 채 데이터 참조.
  3. 복제(Clone): 데이터를 복사하여 독립적으로 사용.
fn main() {
    let s1 = String::from("hello");
    let s2 = s1; // 소유권 이동
    // println!("{}", s1); // 컴파일 에러
    println!("{}", s2); // 정상 출력
}
fn main() {
    let s1 = String::from("hello");
    let s2 = &s1; // 대여
    println!("{}", s1); // 정상
    println!("{}", s2); // 정상
}

4. std::mem::drop 함수

Rust에서는 std::mem::drop을 사용해 데이터를 명시적으로 해제할 수 있습니다.
동작 원리:

  • 소유권을 소멸시키고 메모리를 반환.
  • 호출 이후 해당 변수는 더 이상 유효하지 않음.

코드 예시:

use std::mem;

fn main() {
    let s = String::from("hello");
    println!("Before drop: {}", s);
    mem::drop(s); // 명시적 해제
    // println!("{}", s); // 컴파일 에러
}

5. 주의사항

  1. 대여 중 해제 금지: 참조가 존재하는 동안 drop 호출 불가.
  2. 멀티스레드 안전성: 동기화와 데이터 경합에 주의.

6. 실용적 사용

  • 자원 조기 반환:
let large_data = vec![0; 10_000_000];
std::mem::drop(large_data);
  • RAII 패턴 활용:
struct Resource;
impl Drop for Resource {
    fn drop(&mut self) {
        println!("Resource dropped!");
    }
}
let res = Resource;
std::mem::drop(res);

결론

Rust의 소유권은 메모리와 데이터 사용의 안전성을 컴파일 타임에 보장합니다. std::mem::drop을 통해 특정 시점에 메모리를 명시적으로 해제할 수 있으며, 이를 활용해 효율적이고 안전한 시스템 프로그래밍이 가능합니다.

profile
DevSecOps Pentest🚩

0개의 댓글