DaleSchool

데이터 타입

입문15분

학습 목표

  • Rust의 기본 스칼라 타입 4종류를 나열할 수 있다
  • 변수에 타입을 명시적으로 지정할 수 있다
  • 타입이 맞지 않을 때 발생하는 에러를 이해할 수 있다

동작하는 코드

아래 코드를 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는 명확하게 "이 타입으로 바꿔줘"라고 알려줘야 해요. 덕분에 예상 못 한 변환으로 생기는 버그를 막을 수 있어요.

  1. 자기 이름의 첫 글자를 char 타입 변수에 저장하고, 나이를 i32 타입 변수에 저장한 뒤, 두 값을 한 줄에 출력해보세요.
  2. 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