Rust는 현대적인 시스템 프로그래밍 언어로, 안전성과 성능을 동시에 추구하며, 정적 타입 시스템을 통해 코드의 오류를 사전에 방지합니다. Rust의 데이터 타입은 개발자가 프로그램의 안정성을 극대화하면서도 유연한 설계를 할 수 있도록 설계되었습니다. 정수와 문자열 같은 기본 타입부터, 복합적인 데이터를 처리할 수 있는 튜플, 배열, 그리고 사용자 정의 타입인 구조체와 열거형까지, Rust는 다양한 데이터 표현 방식을 지원합니다.
이 글에서는 Rust의 데이터 타입에 대해 체계적으로 정리하며, 각각의 타입이 제공하는 기능과 활용법을 살펴보겠습니다. 초보 개발자부터 고급 프로그래머까지, Rust 데이터 타입의 강력한 기능을 활용해보고 싶은 모든 독자들에게 유용한 자료가 될 것입니다. Rust의 독창적인 데이터 타입을 이해함으로써 여러분의 코드가 더욱 견고하고 효율적으로 발전할 수 있도록 돕겠습니다.
1. 기본 데이터 타입
Rust의 기본 데이터 타입은 스칼라(Scalar) 타입 과 복합(Compound) 타입 으로 나뉩니다.
1.1 스칼라 타입 (Scalar Types)
스칼라 타입은 단일 값을 나타냅니다.
- 정수(Integer) :
정수는 부호가 있는 타입(i8
,i16
,i32
,i64
,i128
,isize
)과 부호가 없는 타입(u8
,u16
,u32
,u64
,u128
,usize
)으로 구분됩니다.
let signed: i32 = -42;
let unsigned: u32 = 42;
- 부동 소수점(Floating-Point Numbers) :
부동 소수점은f32
와f64
두 가지 타입을 지원하며, 기본적으로f64
를 사용합니다.
let pi: f64 = 3.1415;
let gravity: f32 = 9.8;
- 불리언(Boolean) :
bool
타입은true
또는false
값을 가집니다.
let is_rust_great: bool = true;
- 문자(Character) :
Rust의 문자 타입char
는 유니코드 문자를 지원하며, 단일 문자만 저장할 수 있습니다.
let letter: char = 'A';
let emoji: char = '😊';
1.2 복합 타입 (Compound Types)
복합 타입은 여러 값을 하나로 묶습니다.
- 튜플(Tuple) :
튜플은 서로 다른 타입의 값을 함께 저장할 수 있습니다.
let person: (&str, u32, bool) = ("Alice", 30, true);
println!("Name: {}, Age: {}, Is Rustacean: {}", person.0, person.1, person.2);
- 배열(Array) :
배열은 동일한 타입의 값을 고정된 크기로 저장합니다.
let numbers: [i32; 5] = [1, 2, 3, 4, 5];
println!("First number: {}", numbers[0]);
2. 문자열(String) 타입
Rust의 문자열 타입은 두 가지로 나뉩니다.
- String :
힙에 저장되며 가변적 크기를 가집니다.
let mut greeting = String::from("Hello");
greeting.push_str(", Rust!");
println!("{}", greeting);
- &str :
문자열 슬라이스로, 고정된 크기의 불변 문자열입니다.
let greeting: &str = "Hello, Rust!";
println!("{}", greeting);
3. 컬렉션 데이터 타입
Rust는 다양한 컬렉션 타입을 제공합니다.
- 벡터(Vector) :
가변 길이의 동적 배열입니다.
let mut vec = vec![1, 2, 3];
vec.push(4);
println!("{:?}", vec);
- 해시맵(HashMap) :
키-값 쌍을 저장합니다.
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert("Alice", 90);
scores.insert("Bob", 80);
println!("{:?}", scores);
4. 사용자 정의 데이터 타입
Rust는 사용자 정의 데이터 타입을 통해 코드의 가독성과 재사용성을 높일 수 있습니다.
4.1 구조체(Struct)
구조체는 여러 필드를 가진 복합 데이터 타입입니다.
struct Point {
x: f64,
y: f64,
}
let origin = Point { x: 0.0, y: 0.0 };
println!("Point at ({}, {})", origin.x, origin.y);
4.2 열거형(Enum)
열거형은 한정된 가능한 값을 정의합니다.
enum TrafficLight {
Red,
Yellow,
Green,
}
let light = TrafficLight::Red;
match light {
TrafficLight::Red => println!("Stop!"),
TrafficLight::Yellow => println!("Slow down!"),
TrafficLight::Green => println!("Go!"),
}
5. 고급 데이터 타입
Rust는 보다 복잡한 데이터 구조를 처리하기 위한 고급 데이터 타입도 제공합니다.
- 옵션(Option) :
값이 있거나 없음을 나타냅니다.
let some_number: Option<i32> = Some(42);
let no_number: Option<i32> = None;
- 결과(Result) :
연산의 성공 또는 실패를 나타냅니다.
let result: Result<i32, &str> = Ok(42);
match result {
Ok(value) => println!("Success: {}", value),
Err(e) => println!("Error: {}", e),
}
결론
Rust의 데이터 타입은 정적 타입 시스템을 바탕으로 높은 안전성과 성능을 제공합니다. 정수와 문자열 같은 기본 타입에서부터, 구조체와 열거형 같은 사용자 정의 타입, 그리고 Option과 Result와 같은 고급 타입까지, Rust는 다양한 데이터 표현 방식을 지원합니다.
Rust의 데이터를 이해하고 적절히 활용한다면 코드의 품질이 한층 더 높아질 것입니다. 다양한 데이터 타입을 능숙하게 다루며 Rust의 강력한 기능을 활용해 보세요.
참고 문헌
- The Rust Programming Language: https://doc.rust-lang.org/book/
- Rustbook Ch03.2: https://doc.rust-lang.org/book/ch03-02-data-types.html