Rust에서, 변수와 상수에 대한 예약어로 다음 세가지가 있습니다.
1.let
2.mut
3.const
하나씩 알아보죠.
1.let
let은 변수 선언입니다.
예를들어,
let a = 1;
하면 값이 1인 변수 a가 정의됩니다.
그러나 let으로 선언된 변수는 대입도 불가능해 값을 변경할수 없습니다.
이를 immutable하다고 합니다.
당연한 얘기지만, 변수인데 값을 변경할수 없으면, 프로그래밍하기 참 곤란해지겠죠.
그래서 있는게 예약어 mut입니다.
2.mut
mut는 변수가 값을 변경할수 있게 만들어주는 예약어입니다.
예를들어, let mut a= 1; 이렇게하면, 값을 변경할수 있는 변수 a가 정의되고, 그 값은 1이됩니다.
이렇게 값을 변경할수 있는 변수를 mutable 하다고 합니다.
3.const
값을 변경할수 없다는 점에서, let과 비슷합니다.
하지만 두가지 차이가 있습니다.
-let과는 달리 선언시 자료형을 지정해주어야 한다.
-선언시 대입하는 값은 상수여야한다. (함수의 반환값처럼, 런타임시 달라질 수 있는 동적인 값은 불가능)
4.섀도잉(Shadowing)
let a=1;
let a=2;
let a=3;
이런식으로 같은 이름의 변수를 여러번 정의하면, 이후 코드에서 a를 참고할때 가장 마지막에 선언된 3을 참조합니다.
마지막에 선언한 변수로 앞서 선언된 변수를 가리는것, 이를 섀도잉이라고 합니다.
아래의 코드를 읽어봅시다.
let a=1;
{
let a=2;
}
첫줄에서 a=1로 정의됩니다.
그러나 세번째줄에서 이를 2로 재정의하고 있죠.
세번째 줄에서 a를 2로 재정의 한 후부터, 스코프가 끝날때 까지는 a는 2가 됩니다.
2인 a가 재정의 되면서, 원래 있던 1인 a는 가려집니다.
따라서 스코프 내에서는 a를 참조하면, 그 값은 2가됩니다.
이처럼 지역 변수로 전역 변수를 섀도잉하여, 해당 변수명을 지역변수로 안전하게 사용할수 있도록 해줍니다.
특징
섀도잉을 이용하여, 이름이 같은 변수를 다른 자료형으로 활용할수 있습니다.
무슨소리인가 하면, C에서 다음과 같은 코드가 있다고 칩시다.
int a=1;
float a=1.0; //Compile Error
같은 스코프내에서는 중복정의가 불가능하다면서, 컴파일러가 에러를 뿜습니다.
반면, 러스트에서는 문제가 없습니다.
let a = 1;
let a= 1.0; //Okay
5.주의점
기본적으로 러스트는 정적 타이핑을 합니다.
let mut a=1;
a=2; // Okay
a="hi" // Compile Error
1행에서 정의될때, 정수가 들어갔기 때문에, 문자열을 대입하려고하면 에러가 납니다.
let a = 1;
let a = "hi"; // Okay
a=5; //compile error
2행에서 섀도잉을 한 후에는 문자열 변수 a를 참조하게 되므로, 3행에서 정수를 대입하려고 하면 에러가 납니다.
'Rust' 카테고리의 다른 글
| [Rust]5. 흐름 제어 (조건문과 반복문) (0) | 2018.11.08 |
|---|---|
| [Rust]4. 함수 (0) | 2018.11.07 |
| [Rust]3. 컴파운드 타입 (0) | 2018.11.06 |
| [Rust]2. 스칼라 타입 (0) | 2018.11.06 |
| [Rust]0. 시작하기, 출력 (0) | 2018.11.05 |