Rust에는 풍부한원시 타입(Primitives)이 내장되어 있으며, 크게 스칼라 타입과 복합 타입 두 종류로 나뉩니다.
(하나) 스칼라 타입(Scalar Types)
단독 독립적인 하나의 값을 표현하며 총 6가지 종류가 있습니다:
- 부호 있는 정수형:
i8、i16、i32、i64、i128、isize(크기가 시스템 포인터 크기에 맞춰짐) - 부호 없는 정수형:
u8、u16、u32、u64、u128、usize(크기가 시스템 포인터 크기에 맞춰짐) - 부동 소수점형:
f32、f64 - 문자형 char:유니코드 스칼라 값 저장(예:
'a'、'α'、'∞'), 문자 하나당 4바이트 차지 - 불리언 bool:오직 두 가지 값
true、false만 가짐 - 유닛 타입 ():유일한 값은 빈 튜플
()이다. 겉보기는 튜플이지만 단일 값만 담기 때문에 복합 타입에 속하지 않는다.
(둘) 복합 타입(Compound Types) (뒤에서 학습)
여러 개의 값을 조합해서 만들어진 타입:
- 배열:예시
[1, 2, 3] - 튜플:예시
(1, true)
1) 변수 타입 표기 방식
모든 변수에 직접 타입을 지정할 수 있습니다. 숫자 타입은 추가로접미사 표기를 지원하며, 표기를 생략하면 기본 타입이 적용됩니다:
- 정수 기본 타입:
i32 - 부동 소수점 기본 타입:
f64
Rust는 코드 문맥에 따라자동으로 타입 추론하는 기능도 제공합니다.
2) 변수 타입
1. 명시적 타입 표기
변수 이름 뒤에 : 타입 형식으로 직접 타입을 선언하며 모든 변수에 사용 가능합니다.
fn main() {
let isOpen: bool = true;
let price: f64 = 1.0;
}Code language: JavaScript (javascript)
위 예시에서 isOpen과 price는 변수이고, 뒤쪽의 : 타입명은 변수 뒤에 명시적으로 타입을 지정하는 문법입니다.
2. 숫자 접미사 타입 표기
숫자 값 뒤에타입 접미사를 붙여 숫자의 타입을 지정하며 오직 숫자에만 사용합니다.
fn main() {
let an_integer = 5i32;
}Code language: JavaScript (javascript)
이번에는 :로 변수 타입을 지정하지 않고, 할당하는 숫자 뒤에 i32를 붙여 32비트 정수 타입임을 명시했습니다.
3. 타입 기본 규칙
아무 표기나 접미사도 적지 않으면 컴파일러가 기본 타입을 사용합니다:
- 정수 리터럴 → 기본
i32 - 부동 소수점 리터럴 → 기본
f64
fn main() {
let default_float = 3.0; // 자동으로 f64
let default_integer = 7; // 자동으로 i32
}Code language: JavaScript (javascript)
4. 문맥 기반 타입 추론
컴파일러가 뒤따르는 코드를 보고 변수의 실제 타입을자동 추론하므로 직접 적을 필요가 없습니다.
fn main() {
let mut inferred_type = 12;
inferred_type = 4294967296i64; // 이 줄을 통해 타입이 i64로 추론됨
}Code language: JavaScript (javascript)
가변 변수 & 변수 특징
1 가변 변수
mut 키워드로 수식한 변수는값을 수정할 수 있습니다.
fn main() {
let mut mutable = 12;
mutable = 21; // 정상, 값 수정
}Code language: JavaScript (javascript)
2 타입은 변경 불가
변수는한 번 타입이 정해지면 프로그램 실행 내내 바꿀 수 없으며, 다른 타입 값을 할당하면 즉시 컴파일 오류가 발생합니다.
fn main() {
let mut mutable = 12;
mutable = 21; // 정상, 값 수정
mutable = true; // 오류: 원본 타입이 i32이므로 bool 할당 불가
}Code language: JavaScript (javascript)
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0308]: mismatched types
--> hello.rs:5:12
|
3 | let mut mutable = 12;
| -- expected due to this value
4 | mutable = 21; // 정상, 값 수정
5 | mutable = true; // 오류: 원본 타입이 i32이므로 bool 할당 불가
| ^^^^ expected integer, found `bool`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.Code language: JavaScript (javascript)
주의사항
Rust에서 변수의 값은 기본적으로 수정 불가능하며, 값을 바꾸고 싶다면 mut 키워드를 붙여야 합니다. 이 점은 다른 언어와 차이가 있습니다.
아래 코드는 다른 언어에서는 자주 쓰이지만 Rust에서는 오류가 발생합니다
fn main() {
let mutable:i32 = 12;
mutable = 21; // 정상, 값 수정
}Code language: JavaScript (javascript)
컴파일 오류
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0384]: cannot assign twice to immutable variable `mutable`
--> hello.rs:4:2
|
3 | let mutable:i32 = 12;
| ------- first assignment to `mutable`
4 | mutable = 21; // 정상, 값 수정
| ^^^^^^^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
3 | let mut mutable:i32 = 12;
| +++
warning: variable `mutable` is assigned to, but never used
--> hello.rs:3:6
|
3 | let mutable:i32 = 12;
| ^^^^^^^
|
= note: consider using `_mutable` instead
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
warning: value assigned to `mutable` is never read
--> hello.rs:4:2
|
4 | mutable = 21; // 정상, 값 수정
| ^^^^^^^^^^^^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
error: aborting due to 1 previous error; 2 warnings emitted
For more information about this error, try `rustc --explain E0384`.Code language: JavaScript (javascript)
3 변수 섀도잉(Shadowing)
동일한 이름 변수를 let로 다시 선언하면 기존 변수가섀도(가려짐) 처리됩니다. 두 변수는 완전히 분리된 존재이므로 타입을 다르게 쓸 수 있습니다.
fn main() {
let mutable = 12;
let mutable = true; // 위쪽 i32 변수를 섀도, 새 변수 타입은 bool
}Code language: JavaScript (javascript)
복합 타입:배열 & 튜플
1. 배열
- 문법 형식:
[요소타입; 길이],타입과 길이가 고정이며 모든 요소는 같은 타입이어야 한다.
let my_array: [i32; 5] = [1, 2, 3, 4, 5];Code language: JavaScript (javascript)
2. 튜플
()로 감싸며 여러 가지 다른 타입의 값을 보관할 수 있다.
let my_tuple = (5u32, 1u8, true, -5.04f32);Code language: JavaScript (javascript)