스칼라(Scalar) 타입
- 하나의 값을 표현
- Integer, Float, Char, Boolean
Integer
- Signed Integer
i8, i16, i32, i64, i128, isize
- 음수, 양수 표현
- Unsigned Integer
u8, u16, u32, u64, u128, usize
- 양수만 표현
- 알파벳으로 부호를 표현하고, 그 뒤 숫자로 bit 표현
- 예를 들어,
u8은 8bit 메모리 공간에서 0~7까지의 양수를 저장할 수 있음
isize, usize는 프로그램이 동작하는 컴퓨터 환경에 따라 결정
- 64-bit 아키텍쳐면 64bit, 32-bit 아키텍쳐면 32bit 가짐
- 기본값은
i32
- 정수형 간의 연산
- 기본적으로 서로 다른 타입끼리 연산 불가
- 두 변수 중 하나의 변수만 타입이 명시되어 있다면 나머지 변수는 안전한 쪽으로 타입이 지정됨 (컴파일러의 타입 추론)
- 예를 들어, 두 정수형 변수를 연산할 때 변수 a는
i8로 타입을 명시하고 변수 b는 타입을 명시하지 않았다면 b의 타입은 a의 타입으로 지정됨. 단, b의 값이 i8(a의 타입)에 저장될 수 있어야 함.
let default_int = 50; println!("type of default_int = {}\n", any::type_name_of_val(&default_int)); // type of default_int = i32
let first: u8 = 10; // u8 타입 지정
let second = 20; // 타입 미지정
let result = first + second; // succes, 변수 b의 타입이 컴파일러에 의해 u8로 지정되어 연산됨 (타입 추론)
let my_int1 = 9u8; // 숫자의 경우 타입을 값 바로 왼쪽에 적어도 됨
let my_int2 = -1_i8; // 언더바(_)도 허용
let my_int3= 1_000_000_u32; // 타입뿐만 아니라 숫자 사이에도 언더바 적용 가능
Float
- 실수형은
f36, f64 두 가지
- 기본값은
f64
- 타입을 지정하지 않으면
f64로 지정됨
- 현대의 CPU에서
f64가 f32와 비슷한 속도를 내면서도 더 정밀함
- 정수형과 마찬가지로 다른 타입끼리 연산 불가
let default_float = 8.0;
println!("type of default_float = {}\n", any::type_name_of_val(&default_float)); // type of default_float = f64
Char
- 작은따옴표('')로 표현
- 4Bytes 저장공간 사용
- 유니코드에 정의된 모든 값 표현 가능
let first_letter = 'A';
let space = ' ';
let cat_face = '😺'; // Emojis are chars too
Type casting
let my_char = 'A';
println!("'A' cast to Integer : {}", my_char as i8); // 65, 유니코드 문자를 정수형으로 변환
let my_int: i8 = 30;
let casted_my_int = my_int as u32;
println!("my_int's type: {}", std::any::type_name_of_val(&casted_my_int)); // u32
'A' cast to Integer : 65 // my_int's type: u32