Rust로 계산기를 만들어보자! - (Ubuntu 개발환경 설정 및 예제 실행!)

apriljade·2022년 5월 22일
0

주의사항


이 글은 실력있는 rustacean이 작성한 글이 아닙니다. rust를 글 작성한 날 접했으며, 해당 프로젝트 시작과 함께 rust를 접했기에 수준이 아주 낮습니다. 비효율적인 코드가 넘쳐흐를 것이며 rust답지 않은 C style의 코드도 많을 겁니다. rust의 알파이자 오메가인 Owership도 잘 모르겠습니다. 글을 읽었을 때는 이해가 되는데 코드로 할래니까 미치고 팔짝뛰겠습니다. 유의하고 읽어주세요!

시작


Rust라는 프로그래밍 언어를 알고 계시나요? 최근 스택오버플로우에서 인기투표에서 수 년간 1위를 지키고 있는 친구입니다! 왜 이렇게 인기가 많은지 궁금해서 한번 경험해보기로 했습니다.

원래는 정보나 학습한 내용에 대한 글을 잘 공유하지 않는 편이지만 Rust를 하다보니 레퍼런스가 너무 없어서 곤란하더군요...안그래도 초심자에 대한 장벽이 높은 언어라고 소문이 자자한데, 이렇게 레퍼런스마저 없다면 유입되기가 너무 힘들겠죠.

api 문서는 굉장히 잘 되어있습니다. rust건 gtk건 잘 정리되어 있긴 한데, 저는 개발 환경 세팅조차 하기가 너무 힘들더라구요. 보통 a to z로 알려주는데 Rust는 a를 안알려주는 기분이었습니다. 그래서 제가 하나하나 찾아가며 경험해보는 것들을 이곳에 차례차례 글로 정리해보려 합니다!

본격적으로 개발관련 글을 남기기 앞서 제 개발환경을 말씀드리겠습니다. Rust는 어지간한 os에 컴파일러가 있어서 설치만 하면 되니 OS가 개발하는 것 자체에 큰 영향은 주지 않겠지만, 초기 개발환경 세팅할 때에 저랑 다른 OS라면 절차나 결과물이 다를 수 있으니 참고바랍니다.

저는 Pop!_OS라는 운영체제를 사용 중입니다. 얼마전 22.04버전을 설치하였고 Ubuntu의 파생형이라 Ubuntu랑 동일하게 여기셔도 무방합니다. 참고로 텍스트 에디터는 Visual Studio Code를 사용합니다.

일단 이것부터 설치합니다


텍스트 에디터는 자유롭게 사용하시고 가장먼저 우리는 Rust를 시작할 거니까 Rust를 먼저 설치해줍시다! 지금부터는 Ubuntu계열의 운영체제라고 생각하며 진행합니다!
터미널을 키고 아래의 명령어를 실행시켜줍니다.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

그다음 우리는 gtk-rs라는 친구를 사용해서 GUI를 개발할 예정인데요, gtk-rs는 crate로 나중에 쉽게 불러올 수 있습니다. 해당 gtk-rs를 사용하기 위해서는 필수적으로 gtk 라이브러리가 설치되어 있어야하기에 우리는 gtk라이브러리를 설치해주러 갑니다!

sudo apt install libgtk-4-dev -y

이렇게 두 개를 설치하면 필수 설치요소는 모두 설치했습니다.

gtk-rs 예제 코드 실행해보기


Rust 프로젝트 생성하기

프로젝트를 만들 폴더를 적당히 선택해주시고 해당 폴더에서 Rust 프로젝트를 생성합니다. 저는 계산기를 만들생각이라 calculator라고 했습니다만 다른 이름으로 하셔도 무방합니다.

cargo new calculator

그후 다음 명령어를 실행해보세요!

cd calculator
cargo run

Hello, World! 가 잘 출력됐나요?

프로젝트에 gtk-rs 불러오기

바로 아래의 명령어를 입력하여 프로젝트를 vsc로 열어줍니다.

code .

프로젝트를 열어보면 src 디렉토리와 target 디렉토리, .gitignore, Cargo.lock, Cargo.toml파일이 보입니다. 각각에 대해 궁금하신 분은 공식문서에 정말 잘 나와있으니 참고바랍니다! 우리가 필요한건 Cargo.toml입니다. Cargo라는 친구는 여러가지 일을 해주는데, 그중 외부 패키지를 불러올 때는 Cargo.toml의 dependencies에 작성해주면 됩니다.
Cargo.toml을 열고 아래처럼 작성 후 저장해주세요.

[package]
name = "calculator"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
gtk4 = { git = "https://github.com/gtk-rs/gtk4-rs.git" }

그리고 우리는 gtk-rs의 예제 중 하나를 복붙해서 실행시켜볼겁니다.
src/main.rs 파일을 열어봅니다.

fn main() {
    println!("Hello, world!");
}

이런 신기하게 생긴놈이 있습니다. 저는 사실 보고 이해하기에 큰 어려움은 없었으나 println! 이게 도저히 뭔지 모르겠어서 찾아보니 내장 매크로라고 합니다. 매개변수로 전달되는 문자열을 출력하고 개행문자를 추가로 찍어주는 친구입니다. 더 자세하게 알고싶으시다면 구글링!
이 src/main.rs 파일안에 아래의 코드를 복붙해줍니다.

use gtk::prelude::*;
use gtk::{Application, ApplicationWindow};

fn main() {
    let app = Application::builder()
        .application_id("org.example.HelloWorld")
        .build();

    app.connect_activate(|app| {
        // We create the main window.
        let win = ApplicationWindow::builder()
            .application(app)
            .default_width(320)
            .default_height(200)
            .title("Hello, World!")
            .build();

        // Don't forget to make all widgets visible.
        win.show_all();
    });

    app.run();
}

하나하나 따지면 도저히 모르겠지만 일단 실행시킵니다.

cargo run

그럼 cargo가 열심히 일하기시작합니다. 의존 패키지를 다운로드해주고 빌드해주고 링크까지해다가 실행파일을 맹글어서 실행까지 시켜줍니다. 그럼 조그마한 창이하나 뜹니다! 와우!

이대로 끝내기는 아쉬우니 조금만 수정해보겠습니다!

use gtk::prelude::*;
use gtk::{Application, ApplicationWindow};

fn main() {
    let app = Application::builder()
        .application_id("org.example.HelloWorld")
        .build();

    app.connect_activate(|app| {
        // We create the main window.
        let win = ApplicationWindow::builder()
            .application(app)
            .default_width(480)
            .default_height(800)
            .title("Calculator")
            .build();

        // Don't forget to make all widgets visible.
        win.show_all();
    });

    app.run();
}

width, height, title만 수정해줬습니다! 수정 후 실행시켜보면,

길쭉해지고 넓어지고 제목이 바뀌었습니다!

마치며


이렇게보면 어려울게 뭐가 있니 이걸 못하니 싶을 수 있겠지만...네...제가 (잘)못했습니다. 계산기 시리즈가 얼마나 길어질진 모르겠지만 기본적인 연산자 덧셈, 뺄셈, 곱셈, 나눗셈과 괄호가 포함된 복합 연산까지 구현하는 것을 글로 남길 예정입니다!

0개의 댓글