Hello, World!
Hello, World!
이제 Rust를 설치했으니 첫 Rust 프로그램을 작성할 차례예요. 새 언어를 배울 때 전통적으로 화면에 Hello, world! 텍스트를 출력하는 작은 프로그램을 써보곤 하는데요, 여기서도 똑같이 해볼게요!
참고: 이 책은 커맨드라인에 대한 기본적인 친숙함을 전제합니다. Rust는 에디터나 도구, 코드가 어디에 위치할지에 대해 특별한 요구를 하지 않으므로, 커맨드라인 대신 IDE를 쓰고 싶다면 자신이 좋아하는 IDE를 쓰면 돼요. 많은 IDE가 어느 정도 Rust를 지원하며 자세한 내용은 해당 IDE의 문서를 확인하세요. Rust 팀은
rust-analyzer를 통해 훌륭한 IDE 지원을 제공하는 데 집중하고 있어요. 자세한 내용은 Appendix D를 참고하세요.
출처: The Rust Book
본문
프로젝트 디렉터리 만들기
Rust 코드를 저장할 디렉터리를 먼저 만들게요. Rust는 코드가 어디에 있든 상관하지 않지만, 이 책의 연습과 프로젝트를 위해서는 홈 디렉터리에 projects 디렉터리를 만들고 모든 프로젝트를 거기에 두는 걸 권장할게요.
터미널을 열고 다음 명령을 입력해 projects 디렉터리와, projects 안에 "Hello, world!" 프로젝트용 디렉터리를 만들어보세요.
Linux, macOS, Windows의 PowerShell에서는 이렇게 입력하세요.
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
Windows CMD에서는 이렇게요.
> mkdir "%USERPROFILE%\projects"
> cd /d "%USERPROFILE%\projects"
> mkdir hello_world
> cd hello_world
Rust 프로그램의 기본
이제 새 소스 파일을 만들어 main.rs라고 이름을 붙여볼게요. Rust 파일은 항상 .rs 확장자로 끝납니다. 파일명에 단어가 두 개 이상이라면 관례상 밑줄(underscore)로 구분해요. 예를 들어 helloworld.rs보다는 hello_world.rs를 쓰는 식이죠.
방금 만든 main.rs 파일을 열고 Listing 1-1의 코드를 입력하세요.
Filename: main.rs
fn main() {
println!("Hello, world!");
}
파일을 저장하고 ~/projects/hello_world 디렉터리의 터미널 창으로 돌아가세요. Linux나 macOS에서는 다음 명령을 입력해 파일을 컴파일하고 실행합니다.
$ rustc main.rs
$ ./main
Hello, world!
Windows에서는 ./main 대신 .\\main 명령을 입력하세요.
> rustc main.rs
> .\main
Hello, world!
운영체제와 무관하게 Hello, world!라는 문자열이 터미널에 출력되어야 해요. 이 출력이 보이지 않는다면 설치 섹션의 "Troubleshooting" 부분으로 돌아가 도움을 얻을 방법을 확인하세요.
Hello, world!가 출력됐다면 축하해요! 공식적으로 Rust 프로그램을 하나 작성한 거예요. 이제 당신은 Rust 프로그래머가 됐습니다—환영해요!
Rust 프로그램의 해부
"Hello, world!" 프로그램을 자세히 살펴볼게요. 퍼즐의 첫 조각은 이겁니다.
fn main() {
}
이 줄들은 main이라는 함수를 정의해요. main 함수는 특별합니다. 모든 실행 가능한 Rust 프로그램에서 항상 가장 먼저 실행되는 코드이거든요. 여기서 첫 줄은 이름이 main이고 매개변수가 없으며 아무것도 반환하지 않는 함수를 선언합니다. 만약 매개변수가 있다면 괄호(()) 안에 들어갔을 거예요.
함수 본문은 {}로 감쌉니다. Rust는 모든 함수 본문에 중괄호를 요구해요. 여는 중괄호를 함수 선언과 같은 줄에 두고, 그 사이에 공백을 하나 넣는 것이 좋은 스타일입니다.
참고: Rust 프로젝트 전반에 걸쳐 표준 스타일을 지키고 싶다면
rustfmt라는 자동 포맷터를 사용해 특정 스타일로 코드를 정리할 수 있어요 (rustfmt에 대한 더 자세한 내용은 Appendix D에서). Rust 팀은 이 도구를rustc와 마찬가지로 표준 Rust 배포판에 포함시켰기 때문에 컴퓨터에 이미 설치되어 있을 거예요!
main 함수의 본문에는 다음 코드가 들어 있습니다.
#![allow(unused)]
fn main() {
println!("Hello, world!");
}
이 한 줄이 이 작은 프로그램에서 하는 모든 일, 즉 화면에 텍스트를 출력하는 일을 담당합니다. 여기서 주목해야 할 중요한 세부 사항이 있는데요.
첫째, println!은 Rust 매크로를 호출합니다. 만약 함수를 호출하는 거라면 ! 없이 println으로 입력됐을 거예요. Rust 매크로는 Rust 문법을 확장하는 코드를 생성하는 코드를 작성하는 방법이며, 이에 대해 더 자세히는 Chapter 20에서 다룰게요. 지금은 !를 쓰면 일반 함수가 아니라 매크로를 호출하는 것이라는 점, 그리고 매크로가 항상 함수와 같은 규칙을 따르지는 않는다는 점만 알아두면 됩니다.
둘째, "Hello, world!"라는 문자열이 보이죠. 이 문자열을 println!에 인자로 전달하며, 문자열이 화면에 출력됩니다.
셋째, 줄을 세미콜론(;)으로 끝냅니다. 이는 이 표현식(expression)이 끝났고 다음 것이 시작될 준비가 됐다는 의미예요. 대부분의 Rust 코드 줄은 세미콜론으로 끝납니다.
컴파일과 실행
방금 만든 프로그램을 실행해봤으니, 이제 그 과정의 각 단계를 살펴볼게요.
Rust 프로그램을 실행하기 전에 Rust 컴파일러를 써서 컴파일해야 해요. rustc 명령에 소스 파일 이름을 전달하면 됩니다.
$ rustc main.rs
C나 C++ 배경이 있는 분이라면 이게 gcc나 clang과 비슷하다는 걸 눈치채셨을 거예요. 성공적으로 컴파일하면 Rust는 바이너리 실행 파일을 출력합니다.
Linux, macOS, Windows의 PowerShell에서는 셸에서 ls 명령을 입력해 실행 파일을 확인할 수 있어요.
$ ls
main main.rs
Linux와 macOS에서는 두 개의 파일이 보일 거예요. Windows의 PowerShell에서는 CMD를 썼을 때 볼 수 있는 것과 동일한 세 개의 파일이 보입니다. Windows의 CMD에서는 다음과 같이 입력하세요.
> dir /B %= the /B option says to only show the file names =%
main.exe
main.pdb
main.rs
이것은 .rs 확장자를 가진 소스 코드 파일, 실행 파일(Windows에서는 main.exe, 다른 모든 플랫폼에서는 main), 그리고 Windows를 쓸 때는 .pdb 확장자를 가진 디버깅 정보 파일을 보여줍니다. 여기서 main 또는 main.exe 파일을 실행하세요.
$ ./main # or .\main on Windows
main.rs가 "Hello, world!" 프로그램이라면 이 줄은 터미널에 Hello, world!를 출력합니다.
Ruby, Python, JavaScript 같은 동적 언어에 더 익숙하다면 컴파일과 실행을 별도의 단계로 하지 않는 것에 익숙하지 않을 수도 있어요. Rust는 ahead-of-time 컴파일(AOT) 언어입니다. 즉 프로그램을 컴파일하고 실행 파일을 다른 사람에게 주면, 그 사람은 Rust가 설치되어 있지 않아도 그 실행 파일을 실행할 수 있어요. .rb, .py, .js 파일이라면 각각 Ruby, Python, JavaScript 구현이 설치되어 있어야 하죠. 하지만 그 언어들에서는 프로그램을 컴파일하고 실행하는 데 명령 하나면 충분합니다. 언어 설계는 다 트레이드오프인 셈이에요.
단순한 프로그램은 rustc만으로 컴파일해도 문제없지만, 프로젝트가 커질수록 모든 옵션을 관리하고 코드를 공유하기 쉽게 만들어야 해요. 다음에는 실제 세계의 Rust 프로그램을 작성하는 데 도움을 줄 Cargo 도구를 소개할게요.