콘텐츠로 이동

Rust 데이터 타입

Rust의 모든 값에는 타입(type)이 있어요. 타입은 그 데이터가 어떤 종류인지(정수인지, 소수인지, 텍스트인지, 참/거짓인지 등) 컴파일러에게 알려 주는 꼬리표예요. 타입을 알면 Rust가 프로그램을 실행하기 전에 코드의 실수를 검사할 수 있어요.

변수에서 봤듯이, 보통은 Rust가 타입을 추론해 줘요. 그래도 주요 타입의 이름은 알아 두는 게 좋아요. 에러 메시지나 함수 시그니처에서 계속 보게 될 테니까요.

정수는 42나 -7처럼 소수점이 없는 숫자예요. Rust에는 여러 정수 타입이 있는데, 크기와 음수를 허용하는지에 따라 달라요.

타입 부호 있음? 주로 쓰는 곳
i32 예 (음수 가능) 기본값이에요. 특별한 이유가 없다면 이걸 쓰세요
u32 아니요 (0 이상) 개수, 크기처럼 음수가 될 수 없는 것
i64 / u64 예 / 아니요 아주 큰 숫자
usize 아니요 컬렉션의 인덱스
fn main() {
let temperature = -5; // 기본적으로 i32
let count: u32 = 100; // 부호 없는 타입을 명시
println!("기온 {temperature}도, 개수 {count}개");
}

실행 결과:

기온 -5도, 개수 100개
▶ 직접 실행해 보기

소수점이 있는 숫자에는 부동소수점 타입을 써요. f64(기본값, 배정밀도)와 f32 두 가지가 있어요.

fn main() {
let pi = 3.14159; // 기본적으로 f64
let price: f32 = 9.99;
println!("원주율은 {pi}, 가격은 {price}");
}

실행 결과:

원주율은 3.14159, 가격은 9.99
▶ 직접 실행해 보기

더 작은 f32가 꼭 필요한 경우가 아니라면 f64를 쓰세요. 더 정밀하고, 요즘 하드웨어에서는 속도도 똑같이 빨라요.

불리언(bool)은 가장 단순한 타입이에요. true 아니면 false예요. if 문과 조건식에서 계속 쓰게 될 거예요.

fn main() {
let is_logged_in = true;
let has_permission: bool = false;
println!("로그인: {is_logged_in}, 권한: {has_permission}");
}

실행 결과:

로그인: true, 권한: false
▶ 직접 실행해 보기

char는 문자 하나를 담고, 작은따옴표 ' '로 써요. Rust의 char는 유니코드 스칼라 값 하나라면 무엇이든 될 수 있어요. 그래서 한글 '가'나 대부분의 이모지도 들어가요. 다만 국기처럼 여러 문자를 이어 붙여 만든 복잡한 이모지 몇몇은 char 하나에 들어가지 않아요.

fn main() {
let letter = 'R';
let symbol = '$';
let crab = '🦀';
println!("{letter} {symbol} {crab}");
}

실행 결과:

R $ 🦀
▶ 직접 실행해 보기

Rust에서 텍스트는 큰따옴표로 써요. 앞으로 만나게 될 문자열 타입은 두 가지예요.

  • &str: 문자열 슬라이스예요. 보통 코드에 직접 적은 텍스트(“문자열 리터럴”)가 이 타입이에요.
  • String: 늘릴 수 있고, 소유권을 가지는 텍스트예요. 내용을 바꾸거나 이어 붙여 만들 수 있어요.
fn main() {
let greeting = "안녕하세요"; // &str
let mut name = String::from("꽃게"); // String
name.push_str(" Ferris"); // String은 늘어날 수 있어요
println!("{greeting}, {name}!");
}

실행 결과:

안녕하세요, 꽃게 Ferris!
▶ 직접 실행해 보기

&str과 String의 차이는 아직 신경 쓰지 마세요. 곧 배울 소유권과 관련이 있어요. 지금은 텍스트에는 "..."를 쓰고, 텍스트를 만들거나 수정해야 할 때 String을 쓴다고만 알아 두세요.

대부분은 Rust가 타입을 추론해요. 하지만 가끔은 힌트가 필요해요. 예를 들어 텍스트를 숫자로 변환할 때가 그래요(타입 변환 페이지에서 볼 거예요). 타입은 콜론 뒤에 써요.

let x: i32 = 42;
let y: f64 = 3.5;
let active: bool = true;
타입 담는 값 예시
i32 정수 (기본값) let n = 42;
u32 음수가 아닌 정수 let n: u32 = 42;
f64 소수 (기본값) let pi = 3.14;
bool true 또는 false let ok = true;
char 문자 하나 let c = 'A';
&str 텍스트 리터럴 let s = "hi";
String 늘릴 수 있는 텍스트 let s = String::from("hi");

게임 캐릭터를 타입마다 변수 하나씩 써서 표현해 보세요. 이름(&str), 레벨(i32), 체력 퍼센트(f64), 접속 여부 is_online(bool), 등급 문자(char)예요. 모두 한 줄에 출력하세요. 힌트: char는 작은따옴표, 텍스트는 큰따옴표를 써요.

정답 보기
fn main() {
let name = "Ferris"; // &str
let level = 7; // i32
let health = 82.5; // f64
let is_online = true; // bool
let rank = 'A'; // char
println!("{name} | 레벨 {level} | {health}% | 접속 중: {is_online} | 등급 {rank}");
}

실행 결과:

Ferris | 레벨 7 | 82.5% | 접속 중: true | 등급 A
▶ 직접 실행해 보기

String::from("Rust는")으로 시작해서 " 빠르고"와 " 안전해요"를 차례로 덧붙이고, 결과를 출력해 보세요. 힌트: push_str로 String을 바꾸려면 mut로 선언해야 해요.

정답 보기
fn main() {
let mut sentence = String::from("Rust는");
sentence.push_str(" 빠르고");
sentence.push_str(" 안전해요");
println!("{sentence}");
}

실행 결과:

Rust는 빠르고 안전해요
▶ 직접 실행해 보기
  • 모든 값에는 타입이 있고, 보통은 Rust가 추론해요.
  • 정수는 i32(기본값), 소수는 f64(기본값)예요.
  • bool은 true/false이고, char는 작은따옴표로 쓰는 문자 하나예요.
  • 텍스트는 큰따옴표로 써요. 리터럴은 &str, 늘릴 수 있는 텍스트는 String이에요.

이해도 점검

1. 타입을 지정하지 않았을 때 Rust의 기본 정수 타입은 무엇일까요?

2. Rust는 문자 리터럴과 문자열 리터럴을 어떻게 구분할까요?

3. 늘릴 수 있고 소유권을 가지며, 수정할 수 있는 텍스트 타입은 무엇일까요?

4. Rust의 기본 부동소수점 타입은 무엇일까요?

5. let greeting = "Hello";는 어떤 타입으로 추론될까요?

점수: 0 / 5