가변 참조중 원본 수정

백엔드&인프라 추종자·2025년 6월 18일

rust 공부

목록 보기
7/14

개인 생각

일단 rust 결론은 가변 참조중에는 원본 수정이 불가능하다.

c언어에서 저렇게 하면 무한루프에 빠져서 결국 메모리 오류가 날것같은데

rust 라는 언어는 알아서 컴파일 타임에 체크를 해준다.


이 코드는 컴파일 타임에 에러가 발생합니다. 그 이유는 Rust의 엄격한 빌림(Borrowing) 규칙 때문입니다.


🔍 코드 분석

let mut v = vec![1, 2, 3, 4, 5];    
for i in &mut v {
    v.push(6);
    *i += 50;
}
  • &mut vv에 대한 가변 참조를 만들어 for 루프에서 사용하고 있습니다.
  • for i in &mut v 구문은 내부적으로 v.iter_mut()를 호출하며, v를 순회하는 동안 가변 참조가 유지됩니다.
  • 그런데 루프 내부에서 v.push(6)을 호출함으로써, v직접 수정하려고 합니다.

❌ 에러가 발생하는 이유

Rust는 같은 시점에 가변 참조가 존재하면 원본에 직접 접근하는 것을 허용하지 않습니다.

즉, &mut v를 통해 v를 순회하고 있으므로 v는 이미 빌려진 상태입니다. 그런데 그 와중에 v.push(6)으로 v를 다시 직접 변경하려 하므로 다음과 같은 컴파일 에러가 발생합니다:

error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable

📌 요약

  • 루프가 실행되는 동안 v가변 참조 상태(&mut v) 이며,
  • 그 와중에 v.push(6)처럼 직접 수정(가변 빌림) 하려고 하면 Rust가 이를 안전하지 않다고 판단하여 컴파일 에러를 발생시킵니다.

✅ 해결 방법 예시

v를 순회하면서 동시에 수정하려면, 값을 복사하거나, 수정 후 따로 반복하는 방식으로 바꿔야 합니다:

1. 복사본으로 반복:

let mut v = vec![1, 2, 3, 4, 5];
let copy = v.clone();  // 또는 v.to_vec()

for _ in &copy {
    v.push(6);
}

2. 값을 먼저 처리하고 이후에 push:

let mut v = vec![1, 2, 3, 4, 5];
let len = v.len();

for i in 0..len {
    v[i] += 50;
    v.push(6);  // 안전하게 반복 범위 외부에서 push
}

필요하시다면 이 코드를 안전하게 바꾸는 목적(예: 성능, 구조)도 함께 도와드릴 수 있습니다.

profile
AI 답변 글을 주로 올립니다.

0개의 댓글