가변 슬라이스(Mutable Slices)
지금까지 슬라이스 타입(str 및 [T])에 대해 이야기할 때는 주로 불변 빌림 형태인 &str과 &[T]를 예로 들었습니다. 하지만 슬라이스도 당연히 가변(mutable)일 수 있습니다!
가변 슬라이스를 생성하는 방법은 다음과 같습니다.
let mut numbers = vec![1, 2, 3];
let slice: &mut [i32] = &mut numbers;
가변 슬라이스를 얻었다면 이제 슬라이스 내부의 요소를 수정할 수 있습니다.
slice[0] = 42;
이렇게 하면 원본 Vec의 첫 번째 요소가 42로 변경됩니다.
제한 사항(Limitations)
불변 빌림을 다룰 때, 소유권을 가진 타입에 대한 참조보다는 슬라이스 참조를 선호하라고 권장했었습니다(예: &Vec<T>보다는 &[T]). 하지만 가변 빌림의 경우에는 이 규칙이 그대로 적용되지 않습니다.
다음과 같은 상황을 생각해 봅시다.
let mut numbers = Vec::with_capacity(2);
let mut slice: &mut [i32] = &mut numbers;
slice.push(1);
위 코드는 컴파일되지 않습니다!
push는 슬라이스의 메소드가 아니라 Vec의 메소드이기 때문입니다. 이는 Rust의 중요한 원칙 중 하나를 보여줍니다. 즉, 슬라이스에서는 요소를 추가하거나 제거할 수 없으며, 오직 이미 존재하는 요소를 수정하거나 교체하는 것만 가능합니다.
이런 관점에서 보면, &mut Vec이나 &mut String은 &mut [T]나 &mut str보다 기능적으로 더 강력하다고 할 수 있습니다. 따라서 여러분이 수행하려는 작업이 무엇인지에 따라 가장 적합한 타입을 선택해야 합니다.
Exercise
The exercise for this section is located in 06_ticket_management/11_mutable_slices