러스트를 시작해보자!
다음 main.rs의 코드를 보자.
fn main ()
: main함수는 항상 모든 실행 가능한 Rust 프로그램에서 실행되는 첫 번째 코드이다.
println!("Hello, world!");
: Rust 스타일은 탭이 아닌 4개의 공백으로 들여쓰기 하는 것이다.
println!은 Rust 매크로를 호출한다. 대신 함수를 호출하면 println으로 입력된다.
! 는 일반적인 함수 대신 매크로를 호출하는 수단을 사용한다. 매크로가 항상 동일한 큐칙을 따르지는 않는다.
이제 이 코드를 실행시켜 보자.
우선 main.rs의 파일이 있는 디렉토리로 들어가서 명령창에 rustc main.rs 를 입력해보자.
나는 윈도우를 사용하고 있기 때문에 다음과 같은 파일들이 생성되었다.
이제 이 파일을 실행해보면 다음과 같이 출력되는 것을 알 수 있다.
이때 main.rs를 실행하기 위해서는 이전의
rustc main.rs
명령어을 입력해 소스 파일의 이름을 전달하여 Rust 컴파일러를 사용하여 컴파일 해야 한다.
컴파일 후에 러스트는 바이너리 실행 파일(Windows의 경우는 main.exe)을 출력한다.
이처럼 러스트는 프로그램을 별도의 단계로 컴파일하고 실행하는 과정이 필요하다.
main.rs를 실행시키기 위해 cargo를 사용한 또 다른 방법도 있다. cargo는 러스트 빌드 시스템이자 패키지 관리자이다.
우선 cargo를 사용하여 새 프로젝트를 만든다.
cargo new 디렉토리 이름
그럼 다음과 같은 구조의 폴더가 만들어진다.
{디렉토리}
|- Cargo.toml
|- src
|- main.rs
Cargo.toml는 폴더 내의 메타데이터와 디펜던시를 관리해주는 메니페스트 파일이다.
이제 실행을 시켜보자. 명령창에 다음 명령어를 입력한다.
cargo build
이 명령은 현재 디렉터리가 아닌 target/debug/에 실행파일을 만든다.
cargo run
다음의 명령어로 실행파일을 실행시킬 수 있다.
cargo check
라는 명령어도 있는데, 컴파일 후 실행파일을 생성하지 않아, 속도가 빠르다는 장점이 있다.
[번외 - 사용자 입력/출력]
다음의 코드도 보자.
사용자의 입력을 얻어 결과를 출력하려면 std::io 라이브러리를 가져와야 한다.
사용자의 입력을 저장할 String 변수 a를 생성한다.
Rust에서 변수는 기본적으로 변경이 불가능하기 때문에, 변수를 변경 가능하게 하려면 mut 을 붙여줘야 한다.
사용자의 입력 값을 읽어와 a에 저장한다. 이때 read_line은 Result라는 값을 반환하는데, io::Result가 Ok 가 아닌 Err 인스턴스라면 expect 함수는 메시지를 띄우고 프로그램을 종료시킨다.
만약 expect 함수를 사용하지 않을 경우, 컴파일은 되지만 컴파일시 경고 문구가 뜨게 된다.
위에서 에러가 나지 않았다면 다음 문구를 출력한다. 중괄표 표시는 변수의 값을 출력한다.
[번외 - crates사용]
난수를 생성해보자. 우리는 다른 사람들이 미리 만들어 둔 코드(크레이트)를 사용할 수 있다.
위 링크에서
저 Install 부분의 내용을 복사해서 Cargo.tomi의 [dependency] 부분 아래에 붙여 넣자.
[package]
name = ""
version = "0.1.0"
edition = "2021"
[dependencies]
rand = "0.8.5"
그리고 cmd 창에서 디렉토리까지 이동 후, 빌드를 하자.
cargo build
만약 새로 추가하고 싶은 라이브러리가 있다면, [dependency]에 라이브러리 이름과 버전을 명시하고 build를 다시 실행하면 된다.
또한 기존 크레이트를 업데이트하고 싶을 때는 cargo update를 실행하도록 하자.
[코드 모음]
- main.rs
fn main() {
println!("Hello, world!");
}
- 사용자 입력/출력
use std::io;
fn main() {
let mut a = String::new();
io::stdin()
.read_line(&mut a)
.expect("Failed to read line");
println!("Hello, {}", a);
}