5.1 소유권(OwnerShip)
러스트에서만 있는 소유권.....이제 서서히 개념에 대한 생각에 점점 머리가 아파질거에요.
차후 좀 더 공부를 하면 메모리 하나하나 찍어가면서 해보는 것도 좋을 듯 합니다.
let s1 = "hello";
let s2 = s1; // 소유권 이동 (move)
// 아래 코드는 컴파일 오류 발생
// println!("{}", s1); // s1은 더 이상 유효하지 않음 println!("{}", s2); // 정상 작동
5.2 빌림(Borrowing)
소유자가 소유권을 이전하지 않고 소유권을 유지한 상태에서 참조자(&)를 사용해 값을 빌려주는 방식으로 러스트에서 매우 많이 사용하는 방식이니 개념을 잘 이해하길 바란다..그리고 세번째 불변 참조와 가변 참조에 대한 내용을 꼭 알아두길 바란다..
fn calculate_length(s: &str) -> usize {
s.len() }
let s1 = "hello";
let len = calculate_length(&s1);
println!(" '{}'의 길이는 {}", s1, len); // s1은 여전히 유효함
5.3 소유권 규칙
c 언어와 다르게 메모리 안전성을 위해서 컴파일 과정에서 이미 규칙을 벗어나면 에러를 발생하게 하여 소유권 시스템은 메모리 안정성을 유지하기 위한 매우 좋은 시스템이라 생각된다. 그리고 향후에 스택에서 동작과 힙에서 동작을 익히면 좀 더 메모리 관리에 대해서도 좋은 결과물로 좋은 코드를 만들어 낼 수 있을 것이다.
5.4 실습 문제
fn main() {
// 소유권 이동 예제
let s1 = String::from("hello"); let s2 = s1;
// 빌림 예제
let s3 = String::from("world"); let len = get_length(&s3);
println!("s3: {}, len: {}", s3, len);
}
fn get_length(s: &String) -> usize {
s.len() }
소유권 시스템은 가비지 컬렉션보다 어떤 장점이 있는 지도 검색해보시고 왜 여러 개의 가변 참조를 허용하지 않는 지도 검색해 보시길 바랍니다.