Rust에서 참조자 앞에 붙는 역참조 연산자(*)는 코드가 식의 어디(좌변/우변)에 위치하느냐에 따라 서로 완전히 다른 역할을 수행합니다.
* 연산자의 두 가지 동작 방식을 깔끔하게 정리해 봅니다.
| 구분 | 위치 | 코드 형태 | 역할 | 메모리 동작 |
|---|---|---|---|---|
| 우변 (R-value) | = 기준 오른쪽 | let bar = *f; | 값 읽기 (Dereference) | 메모리 주소에 저장된 값의 복사본을 꺼내옴 |
| 좌변 (L-value) | = 기준 왼쪽 | *f = 13; | 값 쓰기 (Assignment) | 메모리 주소로 직접 찾아가 원본 데이터 수정 |
fn main() {
let mut foo = 42;
let f = &mut foo; // foo의 가변 참조자 생성
// 1. 우변에 사용 (값 읽기 및 복사)
let bar = *f;
// f가 가리키는 메모리의 값(42)을 복사하여 독립된 변수 bar에 저장합니다.
// 2. 좌변에 사용 (원본 데이터 수정)
*f = 13;
// f가 가리키는 원본 메모리 주소(foo)로 직접 찾아가서 값을 13으로 바꿉니다.
println!("foo: {}", foo); // 출력: 13 (원본 변경됨)
println!("bar: {}", bar); // 출력: 42 (복사본 유지됨)
}
i32, bool 같은 기본 정수/단순 자료형은 Rust에서 Copy 트레이트(Trait)를 기본적으로 구현하고 있습니다.let bar = *f;를 실행하면 원본 데이터의 비트를 그대로 복사해 오기 때문에, 이후 *f = 13;을 통해 원본(foo)을 수정해도 bar에 저장된 복사본 값(42)은 영향을 받지 않고 안전하게 유지됩니다.*f를 오른쪽(우변)에 쓸 때: "그 주소에 있는 값 좀 복사해서 가져와 줘!"*f를 왼쪽(좌변)에 쓸 때: "그 주소로 찾아가서 원본 값을 이걸로 바꿔!"