Rust는 안정성과 성능을 최우선으로 설계된 언어입니다. 특히 가변성(Mutability)은 Rust의 독특한 특징 중 하나로, 데이터의 변경 가능성을 명확히 제어하면서도 안정성을 유지할 수 있도록 설계되었습니다. 이 글에서는 Rust의 가변성을 이해하고 효과적으로 활용하는 방법에 대해 다룹니다.
1. 기본 원칙: 불변성이 기본
Rust에서 변수는 기본적으로 불변(immutable)입니다. 즉, 변수를 선언한 후 값을 변경할 수 없습니다. 이는 실수로 값이 변경되는 것을 방지해 안정성을 높이는 Rust의 중요한 설계 철학입니다.
fn main() {
let x = 5; // 불변 변수
x = 6; // 에러 발생: 변수 x는 변경할 수 없습니다.
}
2. mut 키워드를 활용한 가변 변수 선언
Rust에서는 mut 키워드를 사용해 가변 변수를 명시적으로 선언할 수 있습니다. 이렇게 선언된 변수는 값을 변경할 수 있어 보다 유연한 동작을 가능하게 합니다.
fn main() {
let mut x = 5; // 가변 변수 선언
x = 6; // 값 변경 가능
println!("{}", x); // 출력: 6
}
3. 함수와 가변성
함수 매개변수는 기본적으로 불변입니다. 이를 변경하려면 **가변 참조(mut reference)**를 사용해야 합니다. 이는 값이 아닌 참조를 통해 값을 변경할 수 있도록 설계되었습니다.
fn modify_value(value: &mut i32) {
*value += 1; // 가변 참조를 사용해 값 변경
}
fn main() {
let mut number = 10;
modify_value(&mut number);
println!("{}", number); // 출력: 11
}
가변 참조는 데이터 레이스를 방지하고, 동시에 데이터가 안전하게 사용되도록 보장합니다.
4. 데이터 구조와 가변성
Rust의 데이터 구조에서도 가변성을 활용할 수 있습니다. 대표적으로 벡터(Vector)에서 가변성을 활용해 데이터를 동적으로 추가하거나 수정할 수 있습니다.
fn main() {
let mut numbers = vec![1, 2, 3];
numbers.push(4); // 값 추가
println!("{:?}", numbers); // 출력: [1, 2, 3, 4]
}
5. 가변성과 불변성의 조화
Rust에서는 하나의 변수에 대해 동시에 여러 참조를 사용할 때 불변 참조와 가변 참조가 혼합될 수 없습니다. 이는 데이터 레이스를 방지하기 위한 Rust의 중요한 설계 원칙 중 하나입니다.
fn main() {
let mut value = 10;
let r1 = &value; // 불변 참조
let r2 = &value; // 또 다른 불변 참조
println!("r1: {}, r2: {}", r1, r2);
let r3 = &mut value; // 가변 참조
println!("r3: {}", r3); // 불변 참조와 가변 참조가 동시에 존재할 수 없음
}
이러한 제약은 Rust의 컴파일 타임 안전성을 보장하며, 런타임 오류를 방지합니다.
결론
Rust에서 가변성은 코드의 안전성과 유연성을 균형 있게 조화시키는 중요한 개념입니다. 기본적으로 불변성을 사용해 안정성을 높이고, 필요 시 mut 키워드를 통해 가변성을 명시적으로 선언함으로써 유연성을 확보할 수 있습니다. 이러한 설계는 데이터 레이스를 방지하고, 프로그래머가 데이터의 사용 방식을 명확히 이해할 수 있도록 돕습니다.
Rust에서 가변성을 올바르게 이해하고 활용하면 더 안전하고 효율적인 코드를 작성할 수 있습니다.
Rust, Rust 가변성, Rust mut, Rust mutable, Rust 불변성, Rust 참조, Rust 데이터 레이스, Rust 안전성, 러스트, 러스트 가변성, 러스트 mut, 러스트 mutable, 러스트 불변성, 러스트 immutable, 러스트 참조