Rust 튜토리얼 목차

unsafe 코드

Rust는 기본적으로 안전한 프로그래밍을 위한 다양한 기능을 제공합니다.

하지만, 때로는 안전성을 포기하고, 저수준의 시스템 작업을 수행해야 하는 경우가 있습니다.

이 때 unsafe 키워드를 사용합니다.

a. unsafe의 개념 및 필요성

unsafe는 Rust 컴파일러가 안전성을 보장할 수 없는 코드를 표시하는 키워드입니다.

이를 사용하면 Rust의 안전성 검사를 우회하고, 저수준의 시스템 작업을 수행할 수 있습니다.

주로 외부 함수, 원시 포인터, 정적 변수에 접근하는 등의 작업에 사용됩니다.

b. unsafe 함수 및 메서드

unsafe 키워드를 사용하여 함수와 메서드를 정의할 수 있습니다.

이를 사용하면 안전하지 않은 작업을 수행할 수 있습니다.

호출하는 쪽에서도 unsafe 블록 내에서 호출해야 합니다.

unsafe fn dangerous_function() {
    // 안전하지 않은 작업 수행
}

fn main() {
    unsafe {
        dangerous_function();
    }
}

c. 원시 포인터(Raw Pointers) 사용하기

원시 포인터는 메모리 주소를 직접 가리키는 포인터로, Rust의 안전성을 보장하지 않습니다.

*const T*mut T 형식으로 사용할 수 있습니다.

원시 포인터는 unsafe 블록 내에서 사용해야 합니다.

fn main() {
    let mut num = 5;
    let r1 = &num as *const i32;
    let r2 = &mut num as *mut i32;

    unsafe {
        println!("r1 가리키는 값: {}", *r1);
        println!("r2 가리키는 값: {}", *r2);
    }
}

d. 외부 함수 및 FFI(Foreign Function Interface) 사용하기

외부 함수는 다른 프로그래밍 언어로 작성된 함수를 Rust에서 호출할 수 있도록 해주는 인터페이스입니다.

외부 함수를 사용하려면 extern 키워드와 unsafe를 사용해야 합니다.

// C 언어의 함수를 호출하는 예시
extern "C" {
    fn abs(input: i32) -> i32;
}

fn main() {
    let x = -3;
    let result = unsafe { abs(x) };
    println!("{}의 절댓값은 {}입니다.", x, result);
}

이렇게 unsafe를 사용하여 Rust의 안전성 검사를 우회할 수 있습니다.

하지만 가능한 한 unsafe를 사용하지 않고, 안전한 코드를 작성하는 것이 좋습니다.

정말 필요한 경우에만 사용하고, 주의해서 사용해야 합니다.