카테고리 없음

Rust 튜토리얼 #2: Rust의 기본 문법과 데이터 타입

codeai 2024. 7. 7. 12:44

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의 핵심이 되는 중요한 부분이니 기대해 주세요!

참고 링크

  1. Rust 공식 문서 - 기본 개념
  2. Rust by Example - 기본 타입
  3. Rust 언어 레퍼런스 - 타입