변수의 소유권
- 변수는 이름과 값으로 구성
- 러스트에서는 변수의 소유권 개념이 존재
- 값에 대한 소유권을 가진 변수는 다른 프로그래밍 언어에서 이야기하는 일반적인 변수
- 러스트에서는 변수가 값에 대한 소유권을 잃은 경우가 발생할 수 있음
- 소유권을 잃은 변수는 더이상 사용할 수 없음
- 하나의 값에 대한 소유권을 가진 변수는 단 하나 뿐임
변수의 사용
- 변수가 저장한 값을 기반으로 새로운 (임시)변수를 만드는 것
- 대표적인 변수 사용
- 다른 변수의 대입에 사용되는 우변값을 구성하는 경우
- 다른 복합 자료형 변수의 대입에 사용되는 하나의 속성값을 구성하는 경우
- 함수의 인수로 전달
- 함수의 반환값으로 전달
복사와 이동
- 변수가 사용될 때 변수의 자료형에 따라 다음 두 가지 중 하나가 발생한다.
- 복사 (copy)
- 새로 만들어지는 (임시)변수는 사용되는 변수의 값을 복사하여 자신만의 값을 가지게 됨
- 사용된 변수는 해당 값에 대한 소유권을 그대로 가지고 있음
- 이동 (move)
- 새로 만들어지는 (임시)변수는 사용되는 변수의 값 자체를 사용함
- 사용된 변수는 해당 값에 대한 소유권을 잃고 값이 없는 변수가 되어 더 이상 사용 불가
- 변수 자체가 아닌 변수의 참조가 사용되는 경우에는 복사 또는 이동과 상관 없음
복사/이동의 판별
- 변수 사용시 복사가 되는가 이동이 되는가는 사용되는 변수의 자료형에 따라 결정됨
- 원시 자료형은 무조건 복사
- 사용자 정의 자료형은 자료형에 따라 다름.
- copy trait를 구현한 자료형은 복사
- copy trait를 구현하지 않은 자료형은 이동
- 참조 자료형은 복사 또는 이동이 아닌 참조 현상이 발생
힙/스택과의 연관성
- 일반적으로 힙에 정보를 가지는 자료형은 copy trait를 구현하지 않는 경우가 많음 (반드시 그런 것은 아님)
- 따라서 변수가 사용될 때 이동이 발생하고 소유권을 잃게 됨
- 따라서 이러한 소유권 상실을 막기 위해 보통은 변수 자체를 사용하지 않고 참조를 사용함
소유권 개념을 만든 이유
- 힙에 정보를 가지는 자료형은 값이 들어갈 메모리를 동적으로 할당하고 해재하여야 함
- 복수의 변수가 모두 값에 접근할 수 있으면 메모리 해제시에 복잡한 경우가 발생함
- 파이썬, 자바 등에서는 참조개수와 가비지 콜렉션을 통해 이를 해결함
- 러스트에서는 소유권 개념을 통해 항상 하나의 변수만 값이 있는 메모리에 접근할 수 있도록 함