Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

스마트 포인터

포인터는 메모리 안의 주소를 담는 변수에 대한 일반적인 개념입니다. 이 주소는 다른 어떤 데이터를 가리킵니다. 러스트에서 가장 흔한 포인터 종류는 4장에서 배운 참조입니다. 참조는 & 기호로 표시하며, 자신이 가리키는 값을 빌려옵니다. 데이터를 가리킨다는 것 외에는 특별한 기능이 없고, 추가 비용도 거의 없습니다.

반면 스마트 포인터(smart pointers) 는 포인터처럼 동작하지만, 추가 메타데이터와 기능까지 갖춘 자료구조입니다. 스마트 포인터라는 개념은 러스트만의 것이 아닙니다. 스마트 포인터는 원래 C++ 에서 시작되었고 다른 언어에도 존재합니다. 러스트는 표준 라이브러리에 여러 종류의 스마트 포인터를 제공하며, 이들은 참조보다 더 많은 기능을 가집니다. 이 장에서는 스마트 포인터의 일반 개념을 이해하기 위해, 참조 카운팅 스마트 포인터를 포함한 몇 가지 예를 살펴봅니다. 이 포인터는 소유자 수를 추적하고, 소유자가 하나도 남지 않으면 데이터를 정리함으로써, 하나의 데이터에 여러 소유자가 있을 수 있게 해 줍니다.

러스트에서는 소유권과 대여 개념 때문에, 참조와 스마트 포인터 사이에 추가적인 차이도 있습니다. 참조는 단지 데이터를 빌릴 뿐이지만, 스마트 포인터는 많은 경우 자신이 가리키는 데이터를 소유 합니다.

스마트 포인터는 보통 구조체를 사용해 구현됩니다. 일반 구조체와 달리, 스마트 포인터는 DerefDrop 트레이트를 구현합니다. Deref 트레이트는 스마트 포인터 구조체의 인스턴스를 참조처럼 동작하게 만들어, 코드가 참조와 스마트 포인터 모두에 대해 동작할 수 있게 해 줍니다. Drop 트레이트는 스마트 포인터 인스턴스가 스코프를 벗어날 때 실행되는 코드를 원하는 대로 지정할 수 있게 해 줍니다. 이 장에서는 이 두 트레이트를 모두 다루고, 왜 스마트 포인터에 중요한지를 설명합니다.

스마트 포인터 패턴은 러스트에서 자주 쓰이는 일반적인 설계 패턴이기 때문에, 이 장에서 존재하는 모든 스마트 포인터를 다루지는 않습니다. 많은 라이브러리가 자기만의 스마트 포인터를 가지고 있고, 여러분이 직접 만들 수도 있습니다. 여기서는 표준 라이브러리의 가장 흔한 스마트 포인터를 다룹니다.

  • Box<T>: 힙에 값을 할당할 때 사용
  • Rc<T>: 여러 소유권을 가능하게 하는 참조 카운팅 타입
  • RefCell<T> 를 통해 접근하는 Ref<T>RefMut<T>: 컴파일 시가 아니라 런타임에 대여 규칙을 검사하는 타입

추가로, 불변 타입이 내부 값 변경용 API를 노출하는 내부 가변성(interior mutability) 패턴도 다루고, 참조 사이클이 어떻게 메모리 누수를 만들 수 있는지, 그리고 이를 어떻게 방지하는지도 살펴봅니다.

이제 시작해 봅시다!