[Rust] 역참조 연산자(*)

S·2026년 8월 29일

[Rust] 역참조 연산자(*)의 두 가지 얼굴: 읽기(복사)와 쓰기(수정)

Rust에서 참조자 앞에 붙는 역참조 연산자(*)는 코드가 식의 어디(좌변/우변)에 위치하느냐에 따라 서로 완전히 다른 역할을 수행합니다.

* 연산자의 두 가지 동작 방식을 깔끔하게 정리해 봅니다.


1. 한눈에 보는 핵심 요약

구분위치코드 형태역할메모리 동작
우변 (R-value)= 기준 오른쪽let bar = *f;값 읽기 (Dereference)메모리 주소에 저장된 값의 복사본을 꺼내옴
좌변 (L-value)= 기준 왼쪽*f = 13;값 쓰기 (Assignment)메모리 주소로 직접 찾아가 원본 데이터 수정

2. 코드 예제로 이해하기

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 (복사본 유지됨)
}

3. 왜 "복사본"이 생성될까?

  • 기본 타입의 특성: i32, bool 같은 기본 정수/단순 자료형은 Rust에서 Copy 트레이트(Trait)를 기본적으로 구현하고 있습니다.
  • 독립성 보장: let bar = *f;를 실행하면 원본 데이터의 비트를 그대로 복사해 오기 때문에, 이후 *f = 13;을 통해 원본(foo)을 수정해도 bar에 저장된 복사본 값(42)은 영향을 받지 않고 안전하게 유지됩니다.

4. 결론

  • *f를 오른쪽(우변)에 쓸 때: "그 주소에 있는 값 좀 복사해서 가져와 줘!"
  • *f를 왼쪽(좌변)에 쓸 때: "그 주소로 찾아가서 원본 값을 이걸로 바꿔!"

0개의 댓글