C.W.K.
Stream
Lesson 01 of 05 · published

참조 — 소유 없이 빌리기

~11 min · borrowing, references, immutable

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

Ownership 트랙은 답답함으로 끝났어: 함수가 네 데이터를 읽게 하려면 넘겨줬다가 돌려받아야 했지. 참조가 그걸 고쳐. 참조는 소유 안 하고 값을 쓰게 해줘 — 빌리고, 보고, 자동으로 놓아줘.

& 연산자

&s 는 소유권 안 가져가고 s 로의 참조를 만들어. &s 를 함수에 넘기면 함수가 값을 빌려: 읽을 수 있지만 소유권은 호출자한테 남아. 참조가 스코프를 벗어나도 아무것도 drop 안 돼 — 빌렸을 뿐이니까.

함수 시그니처에서 빌리기

&String (더 낫게는 &str) 타입 파라미터는 '이거 소유 말고 읽고 싶어' 라고 말해. 호출이 반환된 뒤에도 호출자가 값을 유지하고. 이게 네가 계속 손 뻗을 기본값이야: 진짜로 소유권이 필요한 게 아니면 참조를 받아.

기본은 빌리기; 소유권은 꼭 필요할 때만. 대부분 함수는 데이터를 읽거나 잠깐 쓰면 돼. 참조가 정확히 그걸 말하고, 호출자의 값을 손대지 않은 채 남겨 — move 도, 돌려주려고-반환하기도 없어.

참조는 위험한 종류의 포인터가 아니야

Rust 참조는 존재하는 동안 유효한 데이터를 가리킨다고 보장돼 — 컴파일러가 증명해. null 참조도, dangling 참조도, '이거 아직 살아있나?' 도 없어. 참조는 borrow checker 가 강제하는 약속이지, 네가 돌봐야 하는 raw 주소가 아니야.

Code

빌려서 읽고, 소유권은 유지·rust
fn length(s: &String) -> usize {
    s.len() // 참조를 통해 읽기
} // s 가 스코프를 벗어나지만 참조일 뿐 — 아무것도 drop 안 됨

fn main() {
    let name = String::from("Ferris");
    let len = length(&name);   // 참조를 빌려줌
    // name 은 여기서 여전히 유효 — 빌렸을 뿐
    println!("{name} is {len} chars");
}

External links

Exercise

Ownership 트랙의 어색한 loudest 함수를 Vec<String> 대신 &[String] (빌린 슬라이스) 를 받게 다시 써봐, 그래서 더는 vec 를 반환할 필요가 없게. 호출 후에도 호출자가 자기 벡터를 여전히 쓸 수 있는지 확인해.
Hint
함수가 데이터를 읽기만 하면 & 로 빌려. 호출자가 소유권을 유지하니까 반환할 게 없어 — move 하고 돌려주는 춤이 사라져.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.