프로그래밍/프로그래밍언어

[rust] Ownership 2

Hithero 2021. 12. 28. 15:08

Ownship 을 리턴 값이 있는 함수에서 보자.

fn main() {
	let s1 = gives_ownership();

	let s2 = String::from("hello");
    
 	let s3 = takes_and_gives_back(s2);
    
}
fn gives_ownership() -> String {
	let something = String::from("yours");
    
	something
}
fn takes_and_gives_back(a_string: String) -> String {
	a_string
}

함수에서 문법은 코틀린과 비슷하다.

메인 함수에서 s1,s2,s3을 선언한다.

s1 변수부터 보면 gives_ownership 함수에서 리턴 값을 받아온다. 해당 함수에서 something 변수는 함수내 scope에 있지만, 메인문으로 리턴값이 s1으로 move(이동)했다고 보면 된다.

s2는 string을 선언한다. 이는 힙에 저장된다.

s3는 s2을 매개변수로 호출된 takes_and_gives_back함수에서 리턴값을 받는다.

우선 s2를 매개변수로 넘겨주면서, 힙에 저장되어있는 변수는 Copy가 아닌 Move이므로 함수로 넘어가면서 메인문의 s2는 invalid가 된다.

함수로 들어오면 s2에서 a_string로 이동되고, 이 값이 리턴값이다. 함수를 벗어나면서 something은 메모리 해제가 되고, 해당 리턴값이 s3로 된다. 이상황에서 valid한 변수는 s1과 s3이다. (s2는 함수의 매개변수로 넘어가면서 invalid 되었다.)

그리고 메인문의 scope를 벗어나면서 s1,s3의 메모리는 해제된다.(drop)

Rust에서 말하는 Ownership은 Move와 관련있다고 보면된다. s2상황을 보면, s2의 ownership은 함수의 매개변수인 a_string이 ownership을 갖게되었다.

 

참고자료

https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html

728x90
반응형