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

가변 참조

~12 min · borrowing, mutable, aliasing, E0502

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

& 로 읽는 건 절반의 이야기야. 빌린 값을 바꾸려면 가변 참조가 필요해: &mut.

&mut — 빌려서 수정

&mut s 는 값을 바꿀 수 있는 참조를 빌려줘. 함수가 호출자의 데이터를 제자리에서 수정해 — 소유권 이전도, 반환도 필요 없어. 이게 허용되려면 값 자체가 mut 으로 선언돼야 해; 불변인 것에 가변 참조를 잡을 순 없어.

하나의 큰 제약

어느 순간이든 값에 대해 불변 참조를 몇 개든 OR 가변 참조를 정확히 하나 가질 수 있어 — 둘 다는 절대. &mut 가 존재하는 동안엔 그 값으로의 다른 참조 (가변이든 아니든) 가 공존 못 해. 처음엔 빡빡하게 느껴지고, 언어에서 가장 중요한 규칙 하나야.

Aliasing XOR mutation. 독자 여럿 또는 작성자 하나, 동시에는 절대. 이 규칙 하나가 컴파일 타임에 데이터 레이스를 없애 — 한 참조만 쓸 수 있고 그 쓰는 동안 아무도 읽지도 못하면, 두 스레드가 같은 데이터를 망칠 수 없어.

왜 이게 진짜 버그를 막냐면

리스트를 순회하는 동안 다른 게 그걸 수정하는 상황 — 많은 언어의 전형적 크래시 (iterator invalidation). Rust 에선 borrow checker 가 거부해: 순회가 참조를 들고 있으니 동시 &mut 는 컴파일 안 돼. 버그가 권장 안 되는 게 아니라 불가능해.

Code

&mut 는 빌려서 제자리 수정·rust
fn add_excitement(s: &mut String) {
    s.push_str("!!!"); // 호출자의 String 을 직접 수정
}

fn main() {
    let mut msg = String::from("hello");
    add_excitement(&mut msg); // 가변 참조를 빌려줌
    println!("{msg}");        // hello!!! — 제자리에서 바뀜

    // Aliasing XOR mutation 현장:
    let r1 = &msg;
    let r2 = &msg;            // 불변 borrow 여럿: 괜찮음
    println!("{r1} {r2}");
    // let w = &mut msg;      // error[E0502]: 불변 borrow 가 아직
    //                        // 쓰이는 동안 가변으로 빌릴 수 없음
}

External links

Exercise

&mut Vec<i32> 를 받아서 숫자 99 를 push 하는 함수를 써봐. 호출하고 벡터를 출력해서 제자리에서 바뀐 걸 확인해. 이제 벡터로의 불변 참조를 만들고 그 참조가 호출 후에도 쓰이는 동안 함수를 불러봐 — E0502 에러를 읽어.
Hint
함수 안의 가변 borrow 는 호출자에 아직 살아있는 불변 borrow 랑 공존 못 해. 수정 전에 불변 참조의 마지막 사용을 끝내.

Progress

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

댓글 0

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

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