Rust의 가장 큰 특징 중 하나는 소유권 시스템입니다. 이는 메모리 관리를 안전하게 할 수 있게 도와줍니다. 기본적으로, 변수를 다른 변수에 할당하면 이동(move)이 일어나고, 더 이상 원본 변수를 사용할 수 없게 됩니다. 예를 들어:
let x = String::from("Hello");
let y = x; // x가 y로 이동
// println!("{}", x); // 오류 발생: x는 더 이상 유효하지 않음
반면에, 참조(borrowing)를 사용하면 소유권을 이동시키지 않고 다른 변수에서 참조만 할 수 있습니다.
let x = String::from("Hello");
let y = &x; // x를 참조함 (소유권 이동 아님)
println!("{}", x); // 정상적으로 x를 사용할 수 있음
Result와 OptionRust는 오류 처리를 위해 Result와 Option 타입을 사용합니다.
Result: 연산의 성공과 실패를 나타냅니다. 예를 들어, read_line()은 사용자 입력을 읽을 때 성공하면 Ok 값을 반환하고, 오류가 발생하면 Err 값을 반환합니다.Option: 값이 있을 수도 있고 없을 수도 있는 경우에 사용됩니다.Rust는 패턴 매칭을 통해 Result나 Option의 값을 처리할 수 있습니다. 예를 들어, read_line()에서 오류를 처리할 때 다음과 같이 할 수 있습니다:
match io::stdin().read_line(&mut guess) {
Ok(_) => println!("입력 받음: {}", guess),
Err(e) => println!("입력 오류: {}", e),
}
이와 같이, Rust는 안전한 메모리 관리, 오류 처리, 병렬 처리 등을 강력하게 지원하며, 이를 통해 안정적이고 효율적인 코드를 작성할 수 있습니다.