러스트의 가장 중요한 개념인 Ownership에 대해서 알아보자.
대부분의 프로그래밍 언어는 스택메모리와 힙메모리에 대해서 생각하지 않아도 된다. 하지만 러스트나 C++등의 시스템프로그래밍 언어는 그렇지 않는다. ( 구글에 "메모리 구조" 검색하면 어떤 변수들이 어디에 저장되는지가 나온다. ) 힙에 할당하는것보다 스택에 push 하는것이 빠르다. pointer를 따라가서 들어가기 때문이다.
기본지식은 이러하다.
Ownership의 3가지
- 모든값은 Owner를 갖는다.
- 하나의 값은 하나의 Owner를 갖는다.
- Owner가 scope 밖으로 나가면 사라진다.
String 타입은 Heap영역에 저장된다.
fn main() {
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
}
이는 오류를 뱉는 코드다.
다음과 같은 상황에서 s2 = s1을 하면
메모리를 해제한다. move라고불린다.
따라서 러스트에서는 깊은복사를 할때는 따로 clone() 을사용하고 이외에는 얕은 복사를 한다.
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
다음과 같이 call by reference로 사용할 수 있다.
fn main() {
let s = String::from("hello");
change(&s);
}
fn change(some_string: &String) {
some_string.push_str(", world");
}
다음과 같은 코드는 오류를 내는데 빌려온 변수를 수정하려고 해서 그렇다.
fn main() {
let mut s = String::from("hello");
change(&mut s);
println!("The length of {}.", s);
}
fn change(some_string: &mut String) {
some_string.push_str(", world");
}
mut 일경우 가능하다 ( let mut s )
'휴지통 > 러스트' 카테고리의 다른 글
러스트 Structure, Enum (0) | 2023.08.30 |
---|---|
러스트 Ownership2 (0) | 2023.08.23 |
러스트 기본프로그래밍 2 함수, 조건문, 반복문 (0) | 2023.08.17 |
러스트 기본프로그래밍 1 변수, 출력 (0) | 2023.08.17 |
러스트 hello world (0) | 2023.08.16 |