&str을 다룬다면 메모리 공간에 대한 포인터를 처리하고 읽을 수 있지만, 수정할 수는 없다. 따라서 &str을 사용하면 메모리를 더 효율적으로 사용할 수 있다. 경험적으로 터득한 규칙은 다음과 같다. 함수를 만들 때 단순히 문자열 값을 읽는다면 매개변수 타입을 &str으로 사용하고, 문자열을 소유하고 수정하려면 매개변수 타입을 String으로 사용한다.
그림 2-6에서 볼 수 있듯 문자열 리터럴과 문자열은 모두 힙(heap)에 있지만, 스택(stack)에는 다른 포인터가 할당되어 있다. 힙과 스택의 개념을 자세히 이해할 필요는 없지만, 앞으로 컴파일러 에러를 더 잘 이해하려면 개념에 익숙해지는 것이 좋다. 다음 ‘스택 대 힙’에서 주요 개념을 설명한다.
▲ 그림 2-6 기본 타입은 러스트의 스택에 저장되는 반면 더 복잡한 타입은 힙에 저장된다. String과 &str은 좀 더 복잡한 데이터 타입(UTF-8 값 모음)을 가리킨다. &str에는 힙 위치를 나타내는 팻 포인터(fat pointer, 메모리 주소와 길이 필드가 같이 있는 포인터)가 있는 반면 String 포인터에는 주소와 길이 외에 용량 필드도 있다