강좌03-변수

1 분 소요

1. immutable과 mutable 선언

  let x: i32 = 1;
  // 형선언은 생략 가능. 생략하면 컴파일러가 판단하여 적용.

기본 변수 선언 방식인 let으로 x를 정의하면 x는 immutable (변경할 수 없는 값) 이 되므로,
선언한 이후에 x = 2; 와 같이 값을 변경할 수 없습니다.

다시말해 기본 선언이 readonly가 된다고 보면 쉬울 것 같습니다.

  let x = 1; 
  x = 2;
  // error

수정 가능한 변수로 만들기 위해 mut로 선언해야 합니다.
let 다음에 mut를 붙이면 mutable 상태로 만들 수 있으며 말 그대로 변수가 됩니다.

  let mut x = 1; 
  x = 2;
  // x = 2

그러나, 다른 형으로 바꾸것은 불가능합니다.

즉, mut는 단순히 readonly를 해제하는 것이지 변수의 형까지 변경하는 것을 허용하지는 않습니다.

  // 가능
  let spaces = "   ";
  let spaces = spaces.len();

  //불가능
  let mut spaces = "   ";
  spaces = spaces.len();

예외

예외 적으로 mut 없이도 값을 변경할 수 있는 케이스가 있는데
같은 형을 가진 상태로 재선언 하는 것 입니다. (같은 주소에 값이 재설정 됩니다.)

  let x = 1;
  let x = x+1; 
  let y = y+1;
  let y = x+2;

2. Scope

javascript와 유사하게 변수의 범위가 제한됩니다.
immutable 변수라도 scope 위치가 다르면 다른 변수로 인식하여 선언할 수 있습니다.

fn main() {
  let outer = 1;
  {
    let outer = 2;
    let inner = 3;
    println!("{} {}", outer, inner);
  }
  println!("{}", outer);
}

//결과
2 3
1

이 때는 위의 재선언과 달리 다른 주소에 저장된 완전히 다른 변수로 인식합니다.
(뒤에 나올 Ownership에 따라 Scope을 벗어나면 Drop 되므로 메모리에서 제거 됩니다.)

3. 유의사항

자바스크립트처럼 equal 연산이 좌->우로 흐르지 않습니다.
한줄에 하나의 변수를 선언하는 것을 추천합니다.

  let x = (let y = 5);  // Error

  //suggest
  let y = 5;
  let x = y;

4. 값과 주소

만일 변수를 c의 포인터와 같이 다른 변수와 같은 주소를 공유하는 용도로 활용하려면 값에 &를 붙여야 합니다.

fn main() {
    let t1 = 10;
    let t2 = &t1;
    println!("{:p} {:p}", &t1, t2);
 }
 
 //결과
 0x77114ff5f4 0x77114ff5f4

만일 일반 변수 복사하듯 선언하면 copy가 발생하며 같은 주소를 공유하지 않습니다.

fn main() {
    let t1 = 10;
    let t2 = t1;
    println!("{:p} {:p}", &t1, &t2);
    
// 결과
0x5e368ff820 0x5e368ff824

c처럼 포인터 *를 사용하지 않아도 출력 옵션에 따라 값과 주소를 모두 표현할 수 있습니다.

댓글남기기