러스트 소유권(Ownership) 정리
소유권이란?
러스트(Rust)의 가장 핵심 개념
메모리 안전(Memory Safety)을 보장하기 위한 설계 철학
"러스트는 데이터에 대한 소유권 규칙을 통해 메모리를 자동으로 관리한다."
소유권 규칙 3가지
1. 값 이동은 오직 하나의 소유자(owner)만 가진다. | |
2. 소유자가 스코프를 벗어나면 데이터는 자동으로 drop(메모리 해제) 된다. | |
3. 데이터 이동(move)시 원래 소유자는 더 이상 데이터 사용 불가 |
(1)소유권
// 소유권을 다른 변수로 이관하는 예제
fn main() {
//새로운 문자열 변수 생성
let s1 = String::from("Hello Rust!");
// s2로 소유권을 이동
let s2 = s1;
// s1은 소유권을 상실했기 때문에 s1에 접근하는 순간 컴파일 에러 발생
println!("{}", s1);
}
// clone를 사용해 값을 복제해서 소유권 문제 해결
fn main() {
// 새로운 문자열 변수를 생성
let s1 = String::from("Hello Rust!");
// s1을 "복사"하여 s2에 저장
let s2 = s1.clone();
// s1은 여전히 소유권을 가지고 있기 때문에 문제없음
println!("{}", s1);
}
(2) 빌림
//함수 파라미터로 값을 전달하는 경우 소유권도 함께 이전 되기에
// 변수의 재사용이 어렵다.
fn main() {
let s = String::from("Hello");
push_str(s); // push_str 함수에 소유권을 전달
println!("{}", s); // s를 사용하는 순간 컴파일 오류 발생
}
fn push_str(mut s: String) {
s.push_str(" Rust!");
}
// 빌림을 사용해 소유권 공유
// 값은 전달하되 소유권은 유지하고 싶을 경우 사용
fn main() {
let mut s = String::from("Hello");
//s 의 소유권을 이전하지 않고, 참조를 전달해 문자열의 내용을 변경
push_str(&mut s);
// s는 소유권을 유지하고 있기에 정상 동작
println!("{}", s);
}
fn push_str(s: &mut String) {
s.push_str(" Rust!");
}
댓글 없음:
댓글 쓰기