Rust 기초 문법과 환경 설정

들어가며

Rust 학습 로드맵의 첫 번째 단계인 기초 문법과 환경 설정에 대해 다룹니다. Rust를 시작하기 위해 필요한 도구를 설치하고, 간단한 프로그램을 작성하며 언어의 기본적인 구성 요소를 익혀봅시다.

1. Rust 설치 및 환경 설정

Rust를 설치하는 가장 표준적인 방법은 rustup 도구를 사용하는 것입니다. rustup은 Rust 버전 관리 및 툴체인 설치를 담당합니다.

설치 (macOS/Linux)

터미널에서 다음 명령어를 실행합니다.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

설치가 완료되면 쉘을 재시작하거나 환경 변수를 로드해야 합니다.

source $HOME/.cargo/env

설치 확인

설치가 정상적으로 되었는지 확인합니다.

rustc --version
cargo --version
  • rustc: Rust 컴파일러
  • cargo: Rust의 패키지 관리자이자 빌드 시스템

2. Hello World와 Cargo

Rust 생태계에서 cargo는 프로젝트 생성, 의존성 관리, 빌드, 테스트 등을 수행하는 핵심 도구입니다.

프로젝트 생성

cargo를 사용하여 새 프로젝트를 생성합니다.

cargo new hello_rust
cd hello_rust

디렉토리 구조

생성된 프로젝트의 구조는 다음과 같습니다.

hello_rust
├── Cargo.toml
└── src
    └── main.rs
  • Cargo.toml: 프로젝트의 메타데이터와 의존성(dependencies)을 정의하는 파일입니다. (Node.js의 package.json과 유사)
  • src/main.rs: 소스 코드 파일입니다.

실행

src/main.rs에는 기본적으로 Hello World 코드가 작성되어 있습니다.

fn main() {
    println!("Hello, world!");
}

프로젝트를 빌드하고 실행하려면 다음 명령어를 사용합니다.

cargo run

3. 기본 문법

변수와 가변성 (Variables and Mutability)

Rust의 변수는 기본적으로 불변(immutable)입니다. 값을 변경하려면 mut 키워드를 사용해야 합니다.

fn main() {
    let x = 5;
    println!("The value of x is: {x}");
    // x = 6; // 컴파일 에러 발생! 불변 변수에 값을 재할당할 수 없음

    let mut y = 5;
    println!("The value of y is: {y}");
    y = 6; // 가능
    println!("The value of y is: {y}");
}

데이터 타입 (Data Types)

Rust는 정적 타입 언어이지만, 컴파일러가 타입을 추론할 수 있는 경우가 많습니다.

  • 스칼라 타입: 정수형(Integer), 부동소수점(Float), 불리언(Boolean), 문자(Char)
  • 복합 타입: 튜플(Tuple), 배열(Array)

함수 (Functions)

fn 키워드로 함수를 선언합니다. 매개변수의 타입과 반환 타입을 명시해야 합니다.

fn main() {
    let result = add(5, 10);
    println!("Result: {result}");
}

fn add(x: i32, y: i32) -> i32 {
    x + y // 세미콜론이 없으면 표현식(Expression)으로 간주되어 반환값이 됨
}

흐름 제어 (Control Flow)

if 표현식

fn main() {
    let number = 3;

    if number < 5 {
        println!("condition was true");
    } else {
        println!("condition was false");
    }

    // if는 표현식이므로 변수에 할당 가능
    let condition = true;
    let number = if condition { 5 } else { 6 };
}

반복문 (Loop, While, For)

  • loop: 무한 루프
  • while: 조건부 루프
  • for: 컬렉션 순회
fn main() {
    // loop
    let mut counter = 0;
    let result = loop {
        counter += 1;
        if counter == 10 {
            break counter * 2; // 값을 반환하며 루프 종료
        }
    };

    // while
    let mut number = 3;
    while number != 0 {
        println!("{number}!");
        number -= 1;
    }

    // for
    let a = [10, 20, 30, 40, 50];
    for element in a {
        println!("the value is: {element}");
    }

    // Range 사용
    for number in (1..4).rev() {
        println!("{number}!");
    }
}

마무리

이번 글에서는 Rust 개발 환경을 설정하고, 가장 기초적인 문법 요소들을 살펴보았습니다. 다음 단계에서는 Rust의 가장 독특하고 중요한 특징인 소유권(Ownership) 시스템에 대해 깊이 있게 다뤄보겠습니다.