comnic's Dev&Life

[Rust] 9. 생성자와 소멸자, RAII 개념 본문

Rust

[Rust] 9. 생성자와 소멸자, RAII 개념

comnic 2023. 12. 7. 05:58
반응형

9. 생성자와 소멸자, RAII(Resource Acquisition Is Initialization) 개념

 

9.1 생성자와 소멸자 메소드 정의

생성자(new 메소드): Rust에서는 impl 블록 내에서 new라는 이름을 가진 함수를 통해 생성자 역할을 수행합니다. 이 함수는 보통 새로운 객체를 생성하고 초기화하는 데 사용됩니다.

struct MyResource {
    data: String,
}

impl MyResource {
    fn new(initial_data: &str) -> MyResource {
        println!("리소스 생성");
        MyResource {
            data: String::from(initial_data),
        }
    }
}
  • MyResource 구조체에는 data라는 필드가 있습니다.
  • impl 블록 내부에서 new 메소드는 MyResource 구조체의 새로운 인스턴스를 생성하고 초기화합니다.
  • 생성자에서는 필요한 초기화 로직을 수행합니다.

 

소멸자(drop 메소드): Rust에서는 Drop 트레이트를 구현하여 소멸자 역할을 수행합니다. Drop 트레이트에 정의된 drop 메소드는 해당 객체가 범위를 벗어나면 자동으로 호출됩니다.

impl Drop for MyResource {
    fn drop(&mut self) {
        println!("리소스 제거: {}", self.data);
    }
}

 

9.2 RAII (Resource Acquisition Is Initialization) 개념

RAII는 리소스 획득이 초기화와 동일하다는 원칙을 기반으로 하는 디자인 패턴입니다. Rust에서는 Drop 트레이트를 이용하여 RAII를 구현합니다.

struct FileResource {
    file_name: String,
}

impl FileResource {
    fn open(file_name: &str) -> FileResource {
        println!("파일 열기: {}", file_name);
        FileResource {
            file_name: String::from(file_name),
        }
    }
}

impl Drop for FileResource {
    fn drop(&mut self) {
        println!("파일 닫기: {}", self.file_name);
    }
}
  • FileResource 구조체는 파일 이름을 나타내는 file_name 필드를 가집니다.
  • open 메소드를 통해 파일을 열고, Drop 트레이트를 구현하여 파일을 닫는 소멸자를 정의합니다.
  • 이 구현은 리소스 획득이 객체의 초기화와 동일하게 이루어져, 리소스 누수를 방지하고 안전성을 유지합니다.

 

9.3 간단한 예제

fn main() {
    // 생성자 호출
    let resource = MyResource::new("Hello, Rust!");
    // resource를 사용하는 로직
    // ...

    // 범위를 벗어날 때 소멸자 호출
}
  • main 함수에서 MyResource의 생성자인 new 메소드를 호출하여 resource라는 객체를 생성합니다.
  • resource 객체를 사용하는 로직이 있는 부분입니다.
  • resource의 범위를 벗어나면 소멸자 drop이 자동으로 호출됩니다. Rust의 소멸자 호출은 스코프를 떠날 때 자동으로 이루어지므로 메모리 누수를 방지할 수 있습니다.
반응형
Comments