Rust
[Rust] 불변성과 섀도잉
yjk490
2024. 3. 31. 16:00
불변성 (Immutable)
- 러스트에서는 변수가 기본적으로 불변성을 지님
- 변수가 한 번 선언되면 이후 다른 값을 저장할 수 없음
mut키워드를 지정하여 가변 변수로 선언할 수 있음
fn main() {
let x = 5;
println!("The value of x is: {x}");
// 아래 코드를 주석 해제하면 에러 발생
// x = 10; // Error, x에는 이미 값이 할당되었기 때문에 다른 값을 할당할 수 없음
println!("The value of x is: {x}");
}
fn main() {
let mut x = 5;
println!("The value of x is: {x}");
x = 10; // Success, mut 키워드를 통해 가변 변수임을 명시하여 다른 값을 할당함
println!("The value of x is: {x}");
}
불변성의 장점
- 메모리 안정성
- 변수의 값이 변경되지 않기 때문에 다른 부분에서 동시에 접근하더라도 안전하게 사용할 수 있다. 이는 런타임 에러를 방지함으로써 프로그램의 안정성을 향상시킨다.
- 가독성
- 앞 부분에 선언된 변수의 값은 코드가 실행됨에 따라 값이 변경되지 않음을 보장한다. 즉, 해당 변수의 값이 어디서 어떻게 바뀔지 추적할 필요가 없기 때문에 가독성이 향상된다.
- 값이 변경될 변수의 경우
mut키워드를 추가해야하기 때문에 코드를 읽는 사람을 하여금 이 변수의 값이 변경될 것이라는 의도를 전달할 수 있다.
상수와의 차이점
- 불변 변수는 런타임에 값을 할당할 수 있으나, 상수는 컴파일 타임에만 값을 할당할 수 있음
const MAX_NUM: u32 = 100; // 상수 선언
fn main() {
let num = 50;
if num < MAX_NUM {
println!("Number is less than MAX_NUM.");
}
// 다음 줄의 주석을 해제하면 컴파일 에러가 발생
// MAX_NUM = 200; // 상수의 값은 동적으로 할당할 수 없음
}
섀도잉 (Shadowing)
- 새 변수명을 이전 변수명과 같은 이름으로 선언하는 것
- 첫 번째 변수가 두 번째 변수에 의해 가려졌음(Shadowed)을 의미
- 블록 단위로 작동함
fn main() {
let x = 5;
{
let x = x * 2; // let 키워드로 같은 이름의 변수를 다시 선언함 (섀도잉)
println!("Inner x: {}", x); // Inner x: 10 출력
} // 이 블록을 빠져나가면 내부의 변수 x는 사라짐
println!("Outer x: {}", x); // Outer x: 5 출력. 외부에서는 이전 변수 x에 접근 가능합니다.
let x = x + 3; // x를 섀도잉하여 새로운 값을 할당함
println!("Shadowed x: {}", x); // Shadowed x: 8 출력
}
섀도잉과 mut 키워드의 차이점
- 섀도잉은
let키워드 사용을 강제하기 때문에 값의 변경 이후 불변성을 유지할 수 있음 - 또한,
let키워드를 사용하면 같은 이름의 변수에 다른 타입을 할당할 수 있음 mut키워드를 통해 값을 변경할 때는 타입은 변경할 수 없음
fn main() {
let space = " ";
let space = space.len();
println!("space : {space}");
let mut mut_space = " ";
// mut_space = mut_space.len(); // 이 라인을 주석 해제하면 에러 발생, 변수 mut_space는 문자열 타입이기 때문.
}