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의 소멸자 호출은 스코프를 떠날 때 자동으로 이루어지므로 메모리 누수를 방지할 수 있습니다.
반응형