소유권

변수의 소유권

  • 변수는 이름과 값으로 구성
  • 러스트에서는 변수의 소유권 개념이 존재
  • 값에 대한 소유권을 가진 변수는 다른 프로그래밍 언어에서 이야기하는 일반적인 변수
  • 러스트에서는 변수가 값에 대한 소유권을 잃은 경우가 발생할 수 있음
  • 소유권을 잃은 변수는 더이상 사용할 수 없음
  • 하나의 값에 대한 소유권을 가진 변수는 단 하나 뿐임

변수의 사용

  • 변수가 저장한 값을 기반으로 새로운 (임시)변수를 만드는 것
  • 대표적인 변수 사용
    1. 다른 변수의 대입에 사용되는 우변값을 구성하는 경우
    2. 다른 복합 자료형 변수의 대입에 사용되는 하나의 속성값을 구성하는 경우
    3. 함수의 인수로 전달
    4. 함수의 반환값으로 전달

복사와 이동

  • 변수가 사용될 때 변수의 자료형에 따라 다음 두 가지 중 하나가 발생한다.
    • 복사 (copy)
      • 새로 만들어지는 (임시)변수는 사용되는 변수의 값을 복사하여 자신만의 값을 가지게 됨
      • 사용된 변수는 해당 값에 대한 소유권을 그대로 가지고 있음
    • 이동 (move)
      • 새로 만들어지는 (임시)변수는 사용되는 변수의 값 자체를 사용함
      • 사용된 변수는 해당 값에 대한 소유권을 잃고 값이 없는 변수가 되어 더 이상 사용 불가
  • 변수 자체가 아닌 변수의 참조가 사용되는 경우에는 복사 또는 이동과 상관 없음

복사/이동의 판별

  • 변수 사용시 복사가 되는가 이동이 되는가는 사용되는 변수의 자료형에 따라 결정됨
    1. 원시 자료형은 무조건 복사
    2. 사용자 정의 자료형은 자료형에 따라 다름.
      • copy trait를 구현한 자료형은 복사
      • copy trait를 구현하지 않은 자료형은 이동
    3. 참조 자료형은 복사 또는 이동이 아닌 참조 현상이 발생

힙/스택과의 연관성

  • 일반적으로 힙에 정보를 가지는 자료형은 copy trait를 구현하지 않는 경우가 많음 (반드시 그런 것은 아님)
  • 따라서 변수가 사용될 때 이동이 발생하고 소유권을 잃게 됨
  • 따라서 이러한 소유권 상실을 막기 위해 보통은 변수 자체를 사용하지 않고 참조를 사용함

소유권 개념을 만든 이유

  • 힙에 정보를 가지는 자료형은 값이 들어갈 메모리를 동적으로 할당하고 해재하여야 함
  • 복수의 변수가 모두 값에 접근할 수 있으면 메모리 해제시에 복잡한 경우가 발생함
  • 파이썬, 자바 등에서는 참조개수와 가비지 콜렉션을 통해 이를 해결함
  • 러스트에서는 소유권 개념을 통해 항상 하나의 변수만 값이 있는 메모리에 접근할 수 있도록 함