러스트에서는 변수 선언을 let 키워드를 사용하고, 상수 선언을 const 키워드로 사용한다.
하지만, let, const 모두 값의 재할당을 시도할 경우 컴파일 에러가 발생한다.
const는 상수니까 당연 안되는거고, let 변수는 let mut variable_name 과 같이 사용하면 재할당이 가능하다.
변수의 재할당을 기본적으로 불허한 이유는 불변성과 프로그래밍 과정에서 개발자의 실수로 발생할 수 있는 다양한 버그를 방지하기 위함이다.
변수와 상수의 차이점
상수는 대문자 + 언더스코어(_)문자만을 사용하여 작명한다.
상수는 프로그램이 실행중인 동안에는 선언된 범위 내에서 항상 유효한 값이므로 게임에서 플레이어가 얻을 수 있는 최고 점수나 빛의 속도 등 불변하는 값을 저장하는데 유용하다.
따라서, 상수는 항상 표현식으로 할당해야하며, 프로그램 런타임 상에서 연산되는 결과를 할당하는 것은 불가하다.
변수 가리기
let 키워드를 사용하여 이미 선언한 변수와 동일한 이름의 변수를 또 다시 선언할 수 있다.
이런 식으로 이미 선언된 변수명이 있음에도, 새로운 변수로 다시 선언하는 행위를 변수가리기 라고 한다.
이렇게 하면, let 자체는 불변성을 띄고 있지만, 아예 새로운 변수를 작성하는 개념이기 때문에 값이 재할당되게 된다.
mut 키워드가 붙은 변수에 대해 값을 재할당하는 것과 다른 점은 변수 가리기가 될 때는 동일한 데이터타입이 아니어도 할당된다는 차이가 있다.
데이터타입
러스트에는 Scala 데이터 타입과 Compound 데이터 타입, 총 두 가지 타입이 존재한다.
러스트는 정적 타입 언어이다. 그 뜻은 모든 변수는 데이터 타입이 정의되어 있어야한단 뜻이다.
타입스크립트 처럼 타입 추론이 적용되어 있지만, 간혹 개발자가 직접 데이터 타입을 명시해줘야하는 경우도 있다.
스칼라 타입
integer, float, boolean, character 네 가지 종류의 데이터 타입이 있다.
정수 타입은 int 와 같이 사용하는 C언어와는 달리 다양한 byte 단위와 unsigned 여부 등 종류가 다양하다.
i32 가 흔히 아는 int 로 치환하면 될 것 같고, f32 또한 흔히 하는 float 인 것 같다. 러스트에서는 부동소수점 표현은 기본적으로 f64 타입을 사용한다. 그리고 개발자가 직접 명시할 때도 그 타입의 사용을 권장한다.
true / false 타입은 bool 타입으로 표기한다.
문자 타입은 char 으로 표기하고, 홋따옴표로 한 글자를 표현한다. 문자열은 String 객체를 사용하는듯 하다.
컴파운드 타입
스칼라 타입을 여러개 혼합한 형태의 타입이다.
자바스크립트로 따지면 객체, 배열로 이해하면 쉽고, 러스트에도 튜플과 배열 두 가지가 있다.
튜블 타입은 한 튜플 내에 원소들이 모두 같은 타입일 필요는 없으며 한 번 정의하면 그 크기를 변경할 수 없다.
let tup: (i32, f64, u8) = (500, 6.4, 1) 와 같이 선언한다.
let (x, y, z) = tup 처럼 destruct도 지원한다.
tup.0 으로 n 번째 요소에 접근할 수 있다.
배열 타입은 흔히 자바스크립트나 C언어에서 선언하는 클리셰 그대로 쓰면 된다. 단, 자바스크립트완 달리 C언어처럼 한 번 선언하면 그 크기를 변경할 수 없다. 크기를 유연하게 사용하려면 C언어처럼 Vector 객체를 사용해야한다.
let a = [3; 5] // 이 코드는 이것과 같다 -> [3,3,3,3,3]
a[0] 처럼 일반 배열과 같이 n번째 요소에 접근 가능
배열의 길이보다 큰 인덱스를 접근하고자 한다면 c언어는 쓰레기값이 읽혀지는 반면에 러스트는 런타임 에러가 발생한다.
함수
러스트에서는 모든 변수명과 함수명을 snake_case 로 사용한다.
일반적으로 C언어를 공부했다면 특별한 특징 없이 그냥 함수를 선언해서 쓸 수 있을듯
이건 좀 특이한 것 같아서 따로 정리해봄
fn main() {
let x = (let y = 6);
}
// 위 코드는 컴파일 에러가 발생한다.
// 함수 본문 내에서 구문과 표현식이 흔히 JS에서 사용하던 방식대로 사용하면 안되기 때문이다.
fn main() {
let x = 5;
let y = {
let x = 3;
x + 1
};
}
// 이렇게 하면 y 변수에는 4 값이 할당된다.
// x+1 라인에 세미콜론이 없는게 포인트!
함수의 값 리턴
흔히 사용하는 return 키워드를 사용하지 않고, 위 x+1 라인 처럼 세미콜론이 없는 라인이 return 으로 인식된다.
따라서, 두 정수를 입력받아 합을 반환하는 함수는 아래와 같이 작성이 가능하다
아래 코드에서 마찬가지로, 세미콜론이 없는게 포인트이다.
fn add(x: i32, y: i32) -> i32 {
x + y
}
조건문
if 문에 소괄호를 사용하지 않는다.
자바스크립트와는 달리 조건식에 bool 타입이 아닌 숫자나 문자가 들어올 경우 오류가 발생한다.
변수 할당문에도 조건문을 사용할 수 있다.
let foo = if some_condition {
5
} else {
8
}
반복문
loop {
// some code
break;
}
break 문에서 값을 리턴할 수도 있다.
여기선 특이하게 뒤에 세미콜론이 붙는다.
let x = loop {
break 5;
}
while, for 문 또한 사용이 가능하다.
다만, 여기서 for 는 선언식,조건식,증감식 세 가지로 구성된게 아니라, javascript "for in" 형태만 사용이 가능하다.
chapter 3. 러스트 프로그래밍
변수
let
키워드를 사용하고, 상수 선언을const
키워드로 사용한다.const
는 상수니까 당연 안되는거고,let
변수는let mut variable_name
과 같이 사용하면 재할당이 가능하다.변수와 상수의 차이점
변수 가리기
let
키워드를 사용하여 이미 선언한 변수와 동일한 이름의 변수를 또 다시 선언할 수 있다.데이터타입
스칼라 타입
컴파운드 타입
let tup: (i32, f64, u8) = (500, 6.4, 1)
와 같이 선언한다.let (x, y, z) = tup
처럼 destruct도 지원한다.tup.0
으로 n 번째 요소에 접근할 수 있다.let a = [3; 5] // 이 코드는 이것과 같다 -> [3,3,3,3,3]
a[0]
처럼 일반 배열과 같이 n번째 요소에 접근 가능함수
함수의 값 리턴
조건문
반복문