Box<String> 에 String 메서드를 부르거나, &str 을 원하는 데 &String 을 넘길 수 있는 이유가 뭐야? 답은 Deref trait — 스마트 포인터를 투명하게 느끼게 하는 메커니즘이야.
Deref: 가리키는 것처럼 행동하기
Deref 구현은 *pointer 가 안쪽 값으로의 참조를 반환하게 하고 — 더 중요하게는 — deref coercion 을 가능하게 해: 컴파일러가 메서드나 함수가 안쪽 타입을 기대하는 곳마다 &Box<T> 를 &T 로, &String 을 &str 로 자동 변환해. 그게 Box<String> 이 String 으로 '그냥 되는' 이유야.
실전의 deref coercion
Borrowing 트랙부터 이름 없이 이걸 기대왔어: &my_string 을 &str 파라미터에 넘기는 게 되는 건 String 이 str 로 deref 하니까. 컴파일러가 필요한 만큼 deref coercion 을 체이닝해서, &Box<String> 가 두 단계 거쳐 보이지 않게 &str 파라미터에 닿아.
Deref 가 스마트 포인터를 투명하게 만들어.
Box, Rc 같은 게 Deref 를 구현하니까, 걔들 통해 안쪽 값의 메서드를 직접 불러. 스마트 포인터가 능력 (힙 저장, 참조 카운팅) 을 더하면서 값을 쓰려고 계속 unwrap 하게 안 만들어.Drop, 동반자
Ownership 트랙에서 Drop 을 만났어 — 스코프 끝에 도는 정리. 스마트 포인터가 거기 기대: Box 가 drop 되면 힙 할당을 해제하고; Rc 가 drop 되면 카운트를 내리고 0 에서만 해제해. Deref 랑 Drop 이 함께 스마트 포인터가 뒤에서 자원을 관리하면서 값처럼 행동하게 만들어.