Rust 프로그래밍

간단한 C 코드를 Rust 프로그램으로 바꾸기 (1)

plas 2020. 7. 15. 11:00

러스트 언어는 C/C++ 언어에 뿌리를 두고 있다고 볼 수 있습니다. 새로운 개념이 많아 배우기 어려운 언어지만 그래도 작은 것부터 만들어보면 좋겠지요?

러스트 playground라는 사이트에서 프로그램을 짜서 컴파일러를 돌려볼 수 있습니다. 러스트는 컴파일이 어렵기로 소문이 자자합니다. 워낙 꼼꼼하게 에러를 내고 안전하고 정확한 코드가 아니면 실행을 안 시켜 주기 때문에 컴파일만 잘 되면 실행하다가 죽을 일이 별로 없다는 장점도 가집니다. (컴파일 오류가 런타임 오류보다는 훨씬 다루기 쉽죠?)

그럼 간단한 C/C++ 코드를 대응하는 러스트 프로그램으로 바꾸는 방법을 살펴보겠습니다. 

fn main() {
    let mut a = 10;
    let b = 20;
    let mut c = 30;
    a += b;
    c -= b;
    println!("{} {} {}", a, b, c);
}

/* C/C++
void main()
{
   int a=10, b=20, c=30;
   a += b;
   c -= b;
   printf("%d %d %d\n", a, b, c);
}
*/

이 프로그램에서는 세 개의 변수를 선언하고 a와 b의 값을 바꾸어 출력합니다. 러스트에서는 세 개의 변수에 대해 어느 것이 값이 바뀔 수 있는 것인지 선언할 때 알려주어야 합니다. 그래서 a와 c는 let mut로 선언되었습니다. 반면 b는 값이 바뀌지 않으므로 불변 변수로 선언되었습니다. rust playground link에서 확인하기.

그리고 println 함수는 형식지정자 문자열에서 {}로 값이 들어갈 자리를 표시합니다.

다음은 간단한 입력을 처리하는 프로그램을 살펴보겠습니다. 러스트에서는 숫자 하나를 읽어들이는 것이 정말 복잡합니다. scanf가 가끔 오류를 일으키기도 하고 사용자가 숫자가 아닌 것을 넣기도 하는 상황이 발생하는데 이것을 방지하기 위한 여러 가지 장치가 들어가기 때문입니다.

use std::io;

fn main() {
    let a: u32 = 10;
    let b: u32 = 50;

    let mut guess = String::new();

    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");
        
    let guess: u32 = guess.trim().parse().expect("Please type a number!");

    println!("{} {} {}", a, b, guess);
}
/*
void main()
{
   int a = 10, b = 50, guess;
   scanf("%d", &guess);
   printf("%d %d %d\n", a, b, guess);
}
*/
  • 일단 입력은 한 줄 단위의 스트링으로 해야 합니다. (이것은 파이썬의 방식을 따라간 거네요)
    io::stdin()
            .read_line(&mut guess)
  • 입력받은 한 줄을 숫자로 바꾸어야 합니다.  guess.trim().parse()
  • 입력과 숫자 변환에서 오류가 발생할 것을 대비해 expect를 넣어주어야 합니다.   .expect("에러 메시지")

이것을 입력이 주어진 범위의 값인지 확인하는 프로그램으로 바꿔보겠습니다. 안타깝지만 이 코드는 playground에서 실행이 안 됩니다. 각자 러스트 환경을 설치하여 돌려보시기 바랍니다. (웹에서 콘솔 입력을 실행시킬 수 없나 보네요...)  코드 확인

use std::io;

fn main() {
    let a: u32 = 10;
    let b: u32 = 50;
    println!("{}~{} 사이의 값을 입력하세요..", a, b);

    let mut guess = String::new();

    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");
        
    let guess: u32 = guess.trim().parse().expect("Please type a number!");

    if a <= guess && guess < b {
        println!("{} <= {} < {}", a, guess, b);
    } else {
        println!("You guessed: {}, !{}~{}", guess, a, b);
    }
}
/*
void main()
{
    int a = 10, b = 50, c;
    printf("{}~{} 사이의 값을 입력하세요..\n", a, b);
    scanf("%d", &c);
    if (a <= guess && guess < b) {
        printf("{} <= {} < {}\n", a, guess, b);
    } else {
        printf("You guessed: {}, !{}~{}\n", guess, a, b);
    }
}
*/