보통 변수를 한번 선언해두면 전역변수나 스테틱이 아닌 경우 해당 변수에 지정된 종류의 값을 전력이 차단될 때까지 다른 값으로 변경이 가능한 반면
그런데 Rust는 특이하게도 계속 변경이 가능한 변수와 그렇지 않은 변수 2가지로 나뉘어져 있다.
아래 예를 보자
let x1 = 60; // x1변수에 60 값 (수정 불가능)
let mut x2 = 0; // x2 변수에 0 할당 (수정 가능)
match x1 {
0 => {
println!("0 이네");
}
1|29 => {
println!("1 또는 29");
}
30..=40 =>{
println!("30부터 40 사이의 값");
}
matchvalue @ 41..=100 => {
x2 = matchvalue; // 다른 언어도 되는지 모르것지만 사이값을 뽑아낼수 있다!!
println!("41에서 100 사이의값!! = {}", x2);
}
_ => {
println!("지정된 값이 아닌가벼.. {}", x1);
}
}
println!("우와 중간에 match에서 사이값을 저장했는데 그게 이거임 {}", x2);
변수 앞에 mut라고 선언 해주면 해당 변수는 변경이 가능한 변수로 선언한 것이다.
만약 mut라고 선언한 변수를 용도에 맞지 않게 사용하면 컴파일 시 근엄하고 무시무시한 rust 컴파일러 사관이 지적을 한다(컴파일은 됨).
x2 변수는 match ( 다른언어에서는 case 또는 switch 라 불리운다 ) 문 내부에서 41부터 100까지 사이의 값을 matchvalue 변수에 넣은 코드인데 편리한거 같다. 아무튼 중요한건 mut 로 선언한 x2에 사이값을 담아 match 문 이후에 출력한 결과이다.
// 41에서 100 사이의값!! = 60
// 우와 중간에 match에서 사이값을 저장했는데 그게 이거임 60
match 문에서 변수를 선언하고 match 문 밖에서 사용하려 하면 근엄하고 무시무시한 Rust 컴파일러 사관이 오류를 뱉어낸다. match 문 내에서 선언한 변수는 match문 밖에서 사용이 안된다.
Rust언에서 스코프라는 명칭이 있는데 어떤 한 함수나 루틴이 끝나는 범위를 스코프라고 한다. 스코프내부에서 선언된 변수는 스코프 내부를 벗어나면 소멸된다.
Rust언어는 가비지컬렉터가 없어 가비지컬렉터가 있는 언어보다는 상대적으로 속도에 이점이 있다고 한다.
절세신공 소유권에 대해 살짝 깊게 들어가면 절대로 Rust 학습을 끝 마칠 수 없다.
Rust 초보자에게는 C 언어의 다중 포인터 만큼의 골때리는 상황이 연출됨으로 살짝 찍먹하다 상당한 핵불닭 맛을 보고 나가 떨어지게 될 수도 있다.
그러기엔 Rust라는 언어가 너무 매력적이지 않은감?
잡설은 그만하고 Rust에서는 변수를 재선언? 할 수 있는데 아래 코드를 보자
let x1 = 60; // x1변수에 60 값 (수정 불가능)
let mut x2 = 0; // x2 변수에 0 할당 (수정 가능)
match x1 {
0 => {
println!("0 이네");
}
1|29 => {
println!("1 또는 29");
}
30..=40 =>{
println!("30부터 40 사이의 값");
}
matchvalue @ 41..=100 => {
let mut x2 = matchvalue; // 다른 언어도 되는지 모르것지만 사이값을 뽑아낼수 있다!!
println!("41에서 100 사이의값!! = {}", x2);
}
_ => {
println!("지정된 값이 아닌가벼.. {}", x1);
}
}
match문 중간에(이제 스코프 라고하겠다) let must x2 라는 같은 변수명으로 재선언을 했다
컴피알 하면 역시 근엄하고 무시무시한 Rust 컴파일러 사관이 지적질을 하지만 컴파일은 된다.
// 41에서 100 사이의값!! = 60
// 우와 중간에 match에서 사이값을 저장했는데 그게 이거임 0
이전과 다르게 match의 스코프를 벗어난 상태로 해당 값을 출력하니 0이 출력된다.
이는 스코프 내에서 쓰인 변수명이 스코프 밖에서 쓰인 변수명과 동일해도 다른 변수로 동작한다는 것이다.
즉 하나의 스코프 내에 선언된 변수는 스코프를 벗어나면 Rust가 지워버린단 얘기다.
C++ 과 비슷한 개념이지만 Rust가 메모리를 해제 해주니 좋지 아니한가?
핵불닭 매운맛을 보기전에 심오하고 오묘한 소유권은 여기까지 맛보기만 하자.