Variable Bindings,변수 바인딩

러스트는 static typing 을 통한 type safety 제공한다. 타입은 변수 선언시 지정할 수 있지만 대부분 컴파일러에 의해 타입이 선언될 수 있다.

Mutability

러스트는 기본으로 불변수인데 mut 를 사용하면 수정이 가능하다.


fn main() {
	

	let last_name = "lee";
	// 불가능
	// last_name = "kim";
	
	//mut
	let mut name = "hello";
	name = "world";
	println!("{name}");
}

Scope and Shadowing

러스트에서 Scope 영역은 해당 변수의 드랍 여부를 나타내는 중요한 지표이다. (드랍이라는 것은 더 이상 참조가 불가능하며 바로는 아니지만 메모리에 제거 된다는 말이다.)

fn main() {
	
	// Scope

	let scope = 1;
	{
	 let inner_scope = 2;

	 println!("{inner_scope}");

	}
	// 이 블록 영역이 지나면 호출 불가능, 드랍된다.
	//println!("{inner_scope}");
	
	println!("{scope}");
	

	//Shadowing

	let shadow = 1;
	
	{
		let shadow = "shadow";
		println!("{shadow}");
	}
	// 같은 이름으로 선언하였지만 드랍되어 쓰일 수 없다.
	println!("{shadow}");
}

Declare first, 변수 선언과 초기화

러스트는 변수를 선언하고 그 후에 초기화 하는 것이 가능하다. 그러나 초기화하지 않고 사용하는 것은 컴파일 에러를 나타낸다.


fn main() {
	//선언
	let declare;
	{
		let a = 2;
		declare = a * a;

	}	
	//위에 초기화값은 블록 안에서도 가능한다. 왜냐하면 변수는 상위에 선언되고 블록 안에서는 상위에 선언된 변수가 value 값만 들어가기 때문이다. (Move 개념_ 추후 설명) 
	println!("{declare}");
	
	//선언 후 초기화 작업 없이는 사용 불가능
	//let a_declare;
	//println!("{a_declare}");
}

Freezing

데이터가 mut 하게 선언되었다가 다시 immut 로 선언되면 이것을 freez 라고 한다. 더 이상 mutable 하게 사용이 불가능하기 때문이다.



fn main() {
	let mut number = 3;

	{
	// 해당 변수에 value 값만 들어간다. 쉐도잉으로 새롭게 선언된 변수는 immut 하다.
	let number = number;
	
	//그렇기에 아래와 같은 구문은 불가능하다.
	//number = 1; 

	}
	// 위의 문장들은 블록 영역이 끝이 나면서 드랍되기 때문에 더 이상 쓸모 없게 되며

	// 맨 위 mut number 변수에 영향을 받는다.
	number = 6;

	println!("{number}");
}