변수와 기본 타입: 파이썬과 어떻게 다른가
학습 목표: Rust의 핵심 원칙인 '기본 불변성(Immutable-by-default)'을 이해하고, 파이썬의 무한 정수와 대비되는 Rust의 고정 크기 숫자 타입들을 익힙니다. 특히 파이썬 개발자가 가장 생소해하는
String과&str의 차이점을 명확히 정리합니다.
1. 변수 선언과 가변성
파이썬은 모든 변수가 기본적으로 가변적이고 타입이 동적으로 변하지만, Rust는 정반대입니다.
# [Python] 자유로운 재할당과 타입 변경
count = 0
count = "zero" # 가능
#![allow(unused)] fn main() { // [Rust] 불변이 기본, 타입 변경 불가 let count = 0; // i32로 추론, 변경 불가 // count = 1; // ❌ 에러 let mut count = 0; // mut를 붙여야 가변 count = 1; // ✅ 가능 // count = "one"; // ❌ 에러: 타입은 못 바꿈 }
2. 기본 타입 비교
| 파이썬 타입 | Rust 대응 타입 | 비고 |
|---|---|---|
int (무한 정밀도) | i8 ~ i128, u8 ~ u128 | 숫자의 크기를 명시해야 함 |
float (64비트) | f32, f64 | 보통 f64가 파이썬의 float과 매칭 |
bool | bool | 동일 (true, false) |
str (유니코드) | String, &str | 소유 여부에 따라 두 가지로 나뉨 |
3. 문자열의 두 얼굴: String vs &str
파이썬 개발자가 Rust를 배울 때 가장 먼저 부딪히는 벽이 문자열입니다.
&str(문자열 슬라이스): 문자열의 일부를 빌려온(Borrow) 것입니다. 읽기 전용 뷰라고 생각하면 쉽습니다. 파이썬의 일반적인 문자열 사용 사례와 가장 비슷합니다.String(소유한 문자열): 힙(Heap)에 할당된 가변적인 문자열입니다. 데이터를 추가하거나 수정해야 할 때 사용합니다.
#![allow(unused)] fn main() { let s1: &str = "Hello"; // 바이너리에 포함된 고정 문자열 let mut s2: String = s1.into(); // 소유권을 가진 String으로 변환 s2.push_str(" World!"); // 수정 가능 }
4. 출력과 포매팅
파이썬의 f-string과 매우 유사한 방식을 사용합니다.
# [Python] f-string
print(f"Name: {name}, Age: {age}")
#![allow(unused)] fn main() { // [Rust] println! 매크로 println!("Name: {name}, Age: {age}"); // 변수를 직접 넣거나 println!("Name: {} Age: {}", name, age); // 자리를 비워두고 나중에 넣기 }
💡 실무 팁: 디버그 출력 {:?}
파이썬에서 repr()이나 pprint를 사용하는 것처럼, Rust에서는 {:?} 기호를 사용해 구조체나 리스트의 내부 상태를 쉽게 확인할 수 있습니다. 단, 해당 타입에 #[derive(Debug)]가 붙어 있어야 합니다.