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, 권한: falsechar는 문자 하나를 담고, 작은따옴표 ' '로 써요. 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"); |
연습 문제
섹션 제목: “연습 문제”1. 플레이어 프로필
섹션 제목: “1. 플레이어 프로필”게임 캐릭터를 타입마다 변수 하나씩 써서 표현해 보세요. 이름(&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 | 등급 A2. 문장 만들기
섹션 제목: “2. 문장 만들기”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
더 알아보기
섹션 제목: “더 알아보기”- 데이터 타입 - 러스트 프로그래밍 언어: 모든 스칼라 타입의 크기와 범위, 정수 오버플로, 그리고 복합 타입(튜플과 배열)까지 다뤄요.
- Primitives — Rust by Example (영어): 기본 타입마다 실행 가능한 예제가 있고,
1_000이나0x80같은 리터럴 이야기로 이어져요. i32— 표준 라이브러리 문서 (영어): 가장 작은 값과 가장 큰 값(i32::MIN,i32::MAX), 그리고 숫자가 가진 수많은 메서드를 볼 수 있어요.char— 표준 라이브러리 문서 (영어): 유니코드 스칼라 값이 무엇인지, 왜char는 항상 4바이트인지 설명해요.String— 표준 라이브러리 문서 (영어):String과&str의 관계, 그리고 텍스트를 만들고 바꾸는 모든 메서드를 정리했어요.