Rust 튜토리얼 #2: Rust의 기본 문법과 데이터 타입
Rust 튜토리얼 #2: Rust의 기본 문법과 데이터 타입
이번 포스팅에서는 Rust의 기본 문법과 주요 데이터 타입에 대해 알아보겠습니다. Rust를 처음 접하는 분들이 언어의 기초를 이해하는 데 도움이 될 것입니다.
1. 변수와 상수
Rust에서는 기본적으로 모든 변수가 불변(immutable)입니다. 변수를 선언할 때는 let
키워드를 사용합니다.
let x = 5; // 불변 변수
let mut y = 5; // 가변 변수
const MAX_POINTS: u32 = 100_000; // 상수
let
으로 선언된 변수는 기본적으로 불변입니다.mut
키워드를 사용하면 가변 변수를 만들 수 있습니다.const
로 선언된 상수는 항상 불변이며, 타입을 명시해야 합니다.
2. 데이터 타입
Rust는 정적 타입 언어로, 컴파일 시 모든 변수의 타입이 확정되어야 합니다. 기본 데이터 타입은 크게 네 가지로 나뉩니다. 첫째, 정수형은 부호 있는 것(i8부터 i128)과 없는 것(u8부터 u128), 그리고 시스템 의존적인 isize와 usize가 있습니다. 둘째, 부동소수점은 f32와 f64 두 가지를 제공합니다. 셋째, 불리언 타입 bool은 true나 false 값을 가집니다. 마지막으로, 문자 타입 char는 유니코드 스칼라 값을 나타냅니다.
기본 데이터 타입
카테고리 | 타입 | 설명 |
---|---|---|
정수형 | i8, i16, i32, i64, i128 | 부호 있는 8비트에서 128비트 정수 |
u8, u16, u32, u64, u128 | 부호 없는 8비트에서 128비트 정수 | |
isize, usize | 시스템 아키텍처에 따라 크기가 달라지는 정수 (32비트 또는 64비트) | |
부동소수점 | f32 | 32비트 부동소수점 |
f64 | 64비트 부동소수점 | |
불리언 | bool | true 또는 false 값 (1바이트) |
문자 | char | 유니코드 스칼라 값 (4바이트) |
이러한 다양한 기본 타입들을 통해 Rust는 정확하고 효율적인 메모리 사용을 가능하게 합니다. 아래 간단한 예시를 참고하세요.
let a: i32 = 42;
let b: f64 = 3.14;
let c: bool = true;
let d: char = 'z';
복합 데이터 타입
Rust의 튜플은 여러 타입의 값을 하나의 복합 타입으로 그룹화하는 고정 길이 데이터 구조입니다. 괄호로 정의되며, 각 요소는 다른 타입일 수 있어 다양한 데이터를 단일 단위로 묶을 수 있습니다. 점 표기법과 인덱스로 요소에 접근하며, 패턴 매칭을 통해 쉽게 분해할 수 있습니다. 함수에서 여러 값을 반환하거나 임시적인 데이터 그룹화에 유용하며, 명시적 타입 선언이 가능합니다. 간단한 데이터 그룹화에 적합하지만, 복잡한 구조에는 구조체가 더 적절할 수 있습니다.
let tup: (i32, f64, u8) = (500, 6.4, 1);
let (x, y, z) = tup; // 구조 해체
Rust의 배열은 동일한 타입의 여러 값을 고정 길이로 그룹화하는 데이터 구조입니다. 대괄호로 정의되며, 컴파일 시 크기가 결정됩니다. 메모리에 연속 저장되어 효율적으로 접근할 수 있고, 인덱스로 요소를 참조합니다. 스택에 할당되어 빠른 성능을 제공하며, 반복문과 슬라이스 사용에 적합합니다. 그러나 크기 변경이 불가능하여, 가변 크기 컬렉션이 필요할 때는 Vec 타입을 사용합니다.
let arr = [1, 2, 3, 4, 5];
let first = arr[0];
3. 함수
Rust에서 함수는 fn
키워드로 선언합니다.
fn main() {
println!("Hello, world!");
another_function(5);
}
fn another_function(x: i32) {
println!("The value of x is: {}", x);
}
- 함수 이름은 snake_case로 작성합니다.
- 매개변수의 타입을 명시해야 합니다.
- 반환 값이 있는 경우
->
뒤에 반환 타입을 명시합니다.
4. 제어문
if 표현식
Rust의 if 문은 조건부 실행을 위한 제어 흐름 구조입니다. 조건이 참일 때 특정 코드 블록을 실행하고, 거짓일 때 다른 블록을 실행할 수 있습니다. Rust에서 if는 표현식이므로 값을 반환할 수 있습니다. 조건 부분에는 명시적인 불리언 표현식이 와야 하며, 괄호는 선택적입니다. else if와 else를 사용하여 다중 조건을 처리할 수 있습니다.
간단한 코드 예제:
fn main() {
let number = 6;
if number % 2 == 0 {
println!("The number is even");
} else {
println!("The number is odd");
}
let result = if number > 5 {
"greater than five"
} else {
"five or less"
};
println!("The number is {}", result);
}
이 예제에서는 숫자의 짝수/홀수 여부를 확인하고, 또한 if 표현식을 사용하여 값을 변수에 할당하는 방법을 보여줍니다.
반복문
Rust의 반복문은 코드 블록을 여러 번 실행하는 데 사용되는 제어 구조입니다. Rust는 주로 세 가지 유형의 반복문을 제공합니다: loop, while, 그리고 for. loop는 무한 반복을, while은 조건에 따른 반복을, for는 컬렉션을 순회하거나 범위에 대해 반복하는 데 사용됩니다. 이들은 break로 중단하거나 continue로 다음 반복으로 넘어갈 수 있으며, 레이블을 사용하여 중첩된 반복문을 제어할 수 있습니다.
간단한 코드 예제:
fn main() {
// loop 예제
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("Loop result: {}", result);
// while 예제
let mut number = 3;
while number != 0 {
println!("{}!", number);
number -= 1;
}
// for 예제
for i in 1..=5 {
println!("For loop number: {}", i);
}
}
이 예제는 각 반복문 유형의 기본적인 사용법을 보여줍니다. loop는 값을 반환하고, while은 조건에 따라 반복하며, for는 범위를 순회합니다.
마무리
이번 포스트에서는 Rust의 기본적인 문법과 데이터 타입에 대해 알아보았습니다. 변수와 상수의 선언, 기본 및 복합 데이터 타입, 함수 정의, 그리고 기본적인 제어문에 대해 살펴보았습니다.
다음 포스트에서는 Rust의 강력한 기능 중 하나인 소유권(Ownership) 개념에 대해 자세히 알아보겠습니다. Rust를 처음 접하는 분들에게는 다소 어려울 수 있는 개념이지만, Rust의 핵심이 되는 중요한 부분이니 기대해 주세요!