동작하는 코드
아래 코드를 Rust Playground에서 실행해보세요!
fn main() {
let age: i32 = 20; // 정수
let height: f64 = 175.5; // 실수
let is_student: bool = true; // 불리언
let grade: char = 'A'; // 문자
println!("나이: {age}");
println!("키: {height}cm");
println!("학생인가요? {is_student}");
println!("등급: {grade}");
}
Rust에는 4가지 기본 스칼라 타입(scalar type) 이 있어요.
| 종류 | 예시 | 설명 |
| ------ | ------ | --------------------------- |
| 정수 | i32 | 소수점 없는 숫자 |
| 실수 | f64 | 소수점 있는 숫자 |
| 불리언 | bool | true 또는 false |
| 문자 | char | 작은따옴표로 감싼 글자 하나 |
사실 타입을 안 써도 Rust가 알아서 추론해줘요.
fn main() {
let age = 20; // i32로 추론
let height = 175.5; // f64로 추론
let is_happy = true; // bool로 추론
let emoji = '🦀'; // char로 추론
println!("{age}, {height}, {is_happy}, {emoji}");
}
타입을 직접 쓰지 않아도 Rust 컴파일러가 값을 보고 타입을 알아내요. 이걸 타입 추론(type inference) 이라고 해요.
직접 수정하기
아래 코드에서 타입 표기(: i32, : f64 등)를 지워보세요. 결과가 달라지나요?
fn main() {
let x: i32 = 42;
let y: f64 = 3.14;
let z: bool = false;
println!("{x}, {y}, {z}");
}
타입을 빼도 같은 결과가 나와요. Rust가 알아서 추론해주거든요. 하지만 타입을 써두면 코드를 읽는 사람이 더 쉽게 이해할 수 있어요.
"왜?" — 타입이 왜 필요할까요?
컴퓨터는 숫자 42와 소수 3.14를 저장하는 방식이 달라요. 정수는 정수 방식으로, 실수는 실수 방식으로 메모리에 저장되거든요. 컴파일러가 타입을 알아야 값을 메모리에 올바르게 저장하고, 연산도 정확하게 할 수 있어요.
Rust는 서로 다른 타입끼리 연산하는 것을 허용하지 않아요. 이것 덕분에 의도하지 않은 실수를 미리 잡을 수 있어요.
fn main() {
let a: i32 = 10;
let b: f64 = 3.0;
// 이렇게 하면 에러!
// let result = a + b;
// 타입을 맞춰줘야 해요
let result = a as f64 + b;
println!("결과: {result}");
}
as 키워드로 타입을 변환할 수 있어요. 지금은 "타입이 다르면 맞춰줘야 한다"는 것만 기억하세요.
심화 학습
정수 타입의 종류
Rust에는 다양한 정수 타입이 있어요.
| 부호 있음 | 부호 없음 | 크기 |
| --------- | --------- | ------ |
| i8 | u8 | 8비트 |
| i16 | u16 | 16비트 |
| i32 | u32 | 32비트 |
| i64 | u64 | 64비트 |
i는 음수도 가능하고, u는 0 이상의 숫자만 가능해요. 숫자가 클수록 더 넓은 범위를 저장해요.
지금은 정수에 i32, 실수에 f64만 기억하면 돼요. 나머지는 필요할 때 배워도 늦지 않아요!
정수와 실수를 그냥 더하면 에러가 나요.
fn main() {
let x = 5;
let y = 2.0;
let sum = x + y;
println!("{sum}");
}
에러 메시지:
error[E0277]: cannot add `{float}` to `{integer}`
--> src/main.rs:4:19
|
4 | let sum = x + y;
| ^ no implementation for `{integer} + {float}`
해석: "정수와 실수를 바로 더할 수 없어요"라는 뜻이에요. let sum = x as f64 + y;처럼 타입을 맞춰주면 해결돼요.
다른 언어에서는 자동으로 변환해주기도 하지만, Rust는 명확하게 "이 타입으로 바꿔줘"라고 알려줘야 해요. 덕분에 예상 못 한 변환으로 생기는 버그를 막을 수 있어요.
- 자기 이름의 첫 글자를
char타입 변수에 저장하고, 나이를i32타입 변수에 저장한 뒤, 두 값을 한 줄에 출력해보세요. i32변수 두 개를 만들어서 더하기, 빼기, 곱하기, 나누기 결과를 각각 출력해보세요. (/는 나누기,%는 나머지 연산이에요.)
Q1. Rust에서 소수점이 있는 숫자의 기본 타입은 무엇일까요?
- A)
float - B)
f32 - C)
f64 - D)
double
Q2. 아래 코드는 정상적으로 실행될까요?
fn main() {
let x: i32 = 10;
let y: f64 = 3.0;
let z = x + y;
println!("{z}");
}
- A)
13.0이 출력된다 - B)
13이 출력된다 - C) 컴파일 에러가 발생한다
- D)
10이 출력된다
Q3. let flag = true;에서 flag의 타입은 무엇일까요?
- A)
i32 - B)
string - C)
char - D)
bool