카테고리 없음

Rust에서 파일 입출력(IO) 다루기

mystory55801 2025. 5. 30. 10:39

Rust에서 파일 입출력이 중요한 이유

Rust는 시스템 프로그래밍 언어로서 안전성과 성능을 모두 추구합니다. 파일 입출력(IO)은 대부분의 응용 프로그램에서 필수적인 요소이며, Rust에서도 이를 안전하고 효율적으로 처리할 수 있는 강력한 기능을 제공합니다.

Rust의 표준 라이브러리는 std::fsstd::io 모듈을 통해 파일 처리 기능을 지원합니다. 이번 글에서는 파일을 읽고 쓰는 기본적인 방법부터 에러 핸들링까지 Rust의 IO를 깊이 있게 다루어 보겠습니다.

Rust에서 파일 쓰기: 파일 생성 및 내용 저장

Rust에서 파일에 데이터를 쓰기 위해서는 std::fs::File 모듈과 std::io::Write 트레이트를 사용합니다. 아래는 간단한 예제입니다.


use std::fs::File;
use std::io::Write;

fn main() -> std::io::Result<()> {
    let mut file = File::create("example.txt")?;
    file.write_all(b"Hello, Rust!")?;
    Ok(())
}

위 코드에서는 File::create를 사용해 새 파일을 만들고, write_all 메서드를 사용해 문자열을 저장합니다. 에러 처리를 위해 Result 타입을 반환하는 것도 중요한 포인트입니다.

Rust에서 파일 읽기: 파일의 내용 불러오기

파일을 읽는 방법은 여러 가지가 있으며, 가장 간단한 방법 중 하나는 std::fs::read_to_string을 사용하는 것입니다.


use std::fs;

fn main() -> std::io::Result<()> {
    let contents = fs::read_to_string("example.txt")?;
    println!("파일 내용: {}", contents);
    Ok(())
}

이 예제는 지정한 파일을 문자열로 읽어들입니다. 텍스트 파일을 다룰 때 간단하게 구현할 수 있다는 장점이 있습니다.

에러 핸들링: 안전한 파일 입출력을 위한 필수 요소

Rust의 에러 처리 시스템은 매우 강력하며, Result 타입을 통해 입출력 도중 발생할 수 있는 다양한 예외 상황을 안전하게 처리할 수 있습니다.

예를 들어, 파일이 존재하지 않거나 접근 권한이 없을 때 unwrap()을 사용할 경우 프로그램이 패닉(panic)을 일으킬 수 있으므로, match 또는 ? 연산자를 사용하는 것이 바람직합니다.

버퍼를 이용한 고성능 파일 입출력

BufReaderBufWriter는 큰 파일을 처리할 때 성능 향상에 도움을 주는 버퍼 기반 IO 도구입니다.


use std::fs::File;
use std::io::{BufReader, BufRead};

fn main() -> std::io::Result<()> {
    let file = File::open("example.txt")?;
    let reader = BufReader::new(file);

    for line in reader.lines() {
        println!("{}", line?);
    }

    Ok(())
}

이 예제는 파일을 줄 단위로 읽어 들이는데 적합하며, 대용량 파일에서도 메모리를 효율적으로 사용할 수 있습니다.

Rust IO에서 자주 사용하는 주요 함수 정리

  • File::create: 새 파일 생성
  • File::open: 기존 파일 열기
  • write_all: 파일에 데이터 쓰기
  • read_to_string: 전체 파일을 문자열로 읽기
  • BufReader::new: 버퍼 기반 파일 읽기

결론: 안전하고 강력한 Rust 파일 IO

Rust에서 파일 입출력을 다루는 것은 다소 복잡해 보일 수 있지만, 안전성과 성능을 모두 보장하기 위해 정교하게 설계된 시스템입니다. std::fsstd::io 모듈을 익히고 활용하면 다양한 응용 프로그램에서 견고한 파일 처리 기능을 구현할 수 있습니다.

이번 포스트에서는 기본적인 파일 쓰기, 읽기부터 에러 처리, 버퍼 사용까지 Rust IO의 핵심 개념을 살펴보았습니다. 앞으로도 더 다양한 Rust 주제로 깊이 있는 내용을 계속 다루어 보겠습니다.