변수 상수 섀도잉 불변성 가변 mut let

변수

변수 선언 방법

여러 가지 변수 선언 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 기본적인 변수 선언 방법
let sentence = "Sentence 1";
println!("{sentence}");
>> Sentence 1

// 변수는 기본적으로 불변성(immutable) 을 가짐  
sentence = "Sentence 2";
println!("{sentence}");
>> 에러 발생

// 변수를 다시 선언할 수 있게 하려면 mut 지시어를 사용
let mut mutable_sentence = "Sentence 3";
mutable_sentence = "Sentence 4";
println!("{mutable_sentence}");
>> Sentence 4

코드 작성을 완료하고 디버깅하려면 터미널에 cargo run 명령어를 입력해 실행한다.

변수 생성 후 값 할당

1
2
3
4
5
// 기본적인 변수 생성
let mut sentence = String::new();  // String 타입의 변수 생성
sentence = "Sentence 1".to_string();       // 값을 할당  
println!("{sentence}");
>> Sentence 1

.to_string() 을 한 이유 :
sentence 는 String 타입이고, “Sentence 1” 은 &str 타입.
이것과 관련해서는 추후에 소유권과 메모리 관리 방식에서 다시 알아본다.

불변성 (muitable)

불변성이란

  • Rust 에서 변수의 불변성이란, 기본적으로 값을 할당받은 뒤엔 변경될 수 없는 특성을 가리킴
  • 이는 안정성과 쉬운 동시성을 갖기 위한 의도적인 특성임
  • mut 지시어를 사용하면 변수를 가변 변수로 만들 수 있음.

불변성

  • 일반적인 불변 변수를 선언하고, 값 재할당을 시도하면 에러가 발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let sentence = "Sentence 1";
sentence = "Sentence 2";

>> error[E0308]: mismatched types
>>  --> src/main.rs:14:16
>>   |
>>13 |     let sentence = String::new();
>>   |                    ------------- expected due to this value
>>14 |     sentence = "Sentence 1";
>>   |                ^^^^^^^^^^^^- help: try using a conversion method: >>`.to_string()`
>>   |                |
>>   |                expected `String`, found `&str`
>>
>> For more information about this error, try `rustc --explain E0308`.
>> error: could not compile `tt` (bin "tt") due to 1 previous error

가변성

  • 가변 변수로 만들기 위해서는 mut 지시어를 사용한다.
1
2
3
4
5
let mut sentence = "Sentence 1";
sentence = "Sentence 2";
println!("{sentence}");

>> Sentence 2

왜 불변성이라는 특성이 존재하는가?

  • 안정성 : 끝까지 값을 유지하려던 변수를 나중에 변경해버리면 버그로 이어질 수 있음.
  • Rust 는 불변성이라고 지정한 상황에 대한 보증을 수행

상수

상수 개념

  • 상수(constant) 는 값을 절대 변경할 수 없는 것.
  • 불변 변수는 mut 이 가능하지만, 상수는 가변으로 만들 수 없다.
  • 선언시 const 키워드를 사용한다.
  • 선언 후의 계산에 의해 값이 결정돼서는 안된다. 즉, 런타임(실행 환경)에서만 계산될 수 있는 결과값은 안되며, 바로 값을 알 수 있어야 한다.
  • 보통 상수의 이름은 전체를 대문자와 언더바로 구성한다.

상수의 선언

1
2
3
4
const THREE_HOURS_IN_SECOND: u32 = 60*60*3;
println!("{THREE_HOURS_IN_SECOND}");

>> 10800

상수의 특성

  • 선언된 스코프 내에서 프로그램이 동작하는 전체 시간 동안 유효함
  • 따라서, 점수의 최고값이나 빛의 속도와 같이 프로그램의 여러 부분에서 알 필요가 있는 값에 유용함
  • 또한, 전역적으로 사용하게 되면 나중에 업데이트될 하드코딩된 값을 한 군데에서 변경 가능

섀도잉 (Shadowing)

섀도잉 (Shadowing)

  • 새 변수를 이전 변수명과 같은 이름으로 선언하는 방법
  • 첫 번째 변수가 두 변째 변수에 가려졌다(Shadowed) 고 하여 섀도잉이라고 부름
  • 동일 변수명을 다시 사용해 값을 할당할 때 let 키워드를 사용함으로써 섀도잉을 할 수 있다.

에시

  • 이미 선언된 변수명과 동일한 이름으로 변수를 선언할 때 let 키워드를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
let x = 5;
println!("First x value : {x}");

let x = x + 1;
println!("Second x value : {x}");

{
	let x = x + 2;
	println!("Lat x value : {x}");
}

>> First x value : 5
>> Second x value : 6
>> Lat x value : 8
  • 이미 선언된 변수와 다른 타입의 변수로 만들 수도 있다.
1
2
3
4
5
6
7
8
let x = 5;
println!("First x value : {x}");

let x = "Alter Sentence";
println!("Lst x value : {x}")

>> First x value : 5
>> Lst x value : Alter Sentence

Reference

https://doc.rust-kr.org/ch02-00-guessing-game-tutorial.html
https://doc.rust-kr.org/ch03-01-variables-and-mutability.html

Comments