Rust는 기본적으로 안전한 프로그래밍을 위한 다양한 기능을 제공합니다.
하지만, 때로는 안전성을 포기하고, 저수준의 시스템 작업을 수행해야 하는 경우가 있습니다.
이 때 unsafe 키워드를 사용합니다.
unsafe는 Rust 컴파일러가 안전성을 보장할 수 없는 코드를 표시하는 키워드입니다.
이를 사용하면 Rust의 안전성 검사를 우회하고, 저수준의 시스템 작업을 수행할 수 있습니다.
주로 외부 함수, 원시 포인터, 정적 변수에 접근하는 등의 작업에 사용됩니다.
unsafe 키워드를 사용하여 함수와 메서드를 정의할 수 있습니다.
이를 사용하면 안전하지 않은 작업을 수행할 수 있습니다.
호출하는 쪽에서도 unsafe 블록 내에서 호출해야 합니다.
unsafe fn dangerous_function() {
    // 안전하지 않은 작업 수행
}
fn main() {
    unsafe {
        dangerous_function();
    }
}
원시 포인터는 메모리 주소를 직접 가리키는 포인터로, 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);
    }
}
외부 함수는 다른 프로그래밍 언어로 작성된 함수를 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를 사용하지 않고, 안전한 코드를 작성하는 것이 좋습니다.
정말 필요한 경우에만 사용하고, 주의해서 사용해야 합니다.