unanimous0

[RUST 1-7] 참조 본문

RUST

[RUST 1-7] 참조

unanimous0 2025. 3. 2. 00:56
  • 참조
    • 러스트에서 참조(Reference)는 소유권(Ownership) 시스템의 핵심 개념 중 하나로, 데이터의 소유권을 넘기지 않고 해당 데이터에 접근할 수 있게함
    • 바로가기 링크나 심볼릭 링크같은 개념
    • C언어에서의 포인터와 같은 개념. 즉, 값 그 자체가 아니라 값이 있는 곳을 나타내는 정보.
    • 참조를 이용하면 어떤 함수 안에서 생성한 값을 다른 함수에 전달해 변경할 수 있음
    • 참조의 기본 개념
      • 불변 참조(&T):
        데이터의 읽기 전용 접근을 허용. 여러 개의 불변 참조를 동시에 가질 수 있어, 같은 데이터를 여러 곳에서 읽을 때 안전하게 사용할 수 있음.
      • 가변 참조(&mut T):
        데이터를 수정할 수 있는 접근을 제공. 단, 한 시점에 하나의 가변 참조만 존재할 수 있고, 다른 불변 참조와 동시에 사용할 수 없음. 이는 데이터 경쟁(race condition)을 방지하기 위한 규칙.
    • 소유권과 빌림(Borrowing)
      • 빌림:
        참조를 사용하는 행위를 빌림(borrowing)이라고 합니다. 빌림은 소유권을 넘기지 않으면서 데이터를 활용할 수 있게함
      • 안전성:
        러스트의 Borrow Checker는 컴파일 타임에 참조의 유효성을 검사하여, 댕글링 포인터나 데이터 경쟁 같은 문제를 방지
    • 수명(Lifetimes)
      • 수명 주기:
        참조는 유효한 범위, 즉 수명(lifetime)을 가지며, 참조가 가리키는 데이터가 참조보다 먼저 소멸하면 안됨. 컴파일러는 수명 주기를 분석하여 안전하게 데이터에 접근할 수 있게함.
      • 명시적 수명:
        대부분의 경우 러스트 컴파일러가 수명을 추론하지만, 복잡한 경우 개발자가 명시적으로 수명을 지정해줘야 할 때도 있음
    • 결론
      • 러스트의 참조는 데이터의 소유권을 이전하지 않으면서도 안전하게 데이터를 공유할 수 있는 강력한 도구. 불변 참조와 가변 참조의 엄격한 규칙, 그리고 수명 검사 시스템은 런타임 에러 없이 효율적인 메모리 관리를 가능하게 하며, 안전한 병행성을 보장함.
fn main() {
    let mut v = 10;
    set_value(&mut v);
    println!("v = {}", v);
}

// 인수의 값을 100으로 변경하는 함수
fn set_value(arg: &mut u32) {
    *arg = 100;
}

/*
    실행 결과
    v = 100
*/

 

  • 코드 설명
    • set_value 함수를 보면 인수 arg의 값을 변경하기 위해 인수의 타입을 &mut u32로 지정하고 있음
    • 여기서 인수 arg의 값을 100으로 변경하는데, 참조 값을 돌려줄 때 해당 값을 변경해야하므로 역참조(dereference)를 나타내는 "*"를 붙여 *arg=100 과 같이 기술함
    • 함수의 인수를 변경하는데 참조(인수로 들어온 가변(참조)변수와 역참조)를 사용함