챕터 0: 소개 — Rust를 처음 만나는 분들을 위한 안내

챕터 0: 소개 — Rust를 처음 만나는 분들을 위한 안내

도입

출처: Rust 공식문서

본문

참고: 이 책의 이번 판은 인쇄본과 전자책으로 만나보실 수 있는 The Rust Programming Language(No Starch Press 출간)와 같은 내용이에요.

《The Rust Programming Language》에 오신 걸 환영해요. 이 책은 Rust를 처음 배우는 분들을 위한 입문서예요. Rust라는 언어는 더 빠르고 더 믿을 수 있는 소프트웨어를 만들 수 있게 도와줘요. 프로그래밍 언어 설계에서 "높은 수준의 편리함"과 "낮은 수준의 제어"는 종종 서로 충돌하곤 하는데, Rust는 바로 그 충돌 자체에 도전해요. 강력한 기술적 역량과 훌륭한 개발 경험을 동시에 잡는 방식으로, Rust는 메모리 사용 같은 저수준의 세부사항을 제어할 수 있는 선택지를 주면서도, 전통적으로 그런 제어에 따라오던 온갖 번거로움을 없애줘요.

Rust는 누구를 위한 언어인가요?

Rust는 다양한 이유로 많은 사람들에게 아주 적합한 언어예요. 그중 가장 중요한 몇몇 그룹을 함께 살펴볼게요.

개발자 팀

Rust는 시스템 프로그래밍 지식 수준이 제각각인 크고 다양한 개발자 팀이 협업하는 데 아주 생산적인 도구로 자리 잡고 있어요. 저수준 코드는 아주 미묘한 버그에 취약한데, 대부분의 다른 언어에서는 그런 버그를 경험 많은 개발자가 광범위한 테스트와 꼼꼼한 코드 리뷰를 통해서만 잡아낼 수 있어요. 하지만 Rust에서는 컴파일러가 그런 어렵고 애매한 버그(동시성 버그까지 포함해서요)를 가진 코드는 컴파일을 거부하는 방식으로 골키퍼 역할을 해줘요. 컴파일러와 함께 일하다 보면 팀은 버그를 쫓느라 시간을 쓰는 대신 프로그램의 로직에 집중할 수 있게 돼요.

Rust는 또한 최신 개발 도구들을 시스템 프로그래밍 세계에 가져다줘요:

  • Cargo라는 이름의 의존성 관리자 겸 빌드 도구는 의존성을 추가하고 컴파일하고 관리하는 일을 Rust 생태계 전반에서 수월하고 일관되게 만들어줘요.
  • rustfmt 포맷팅 도구는 개발자들 사이에서 일관된 코딩 스타일을 보장해줘요.
  • Rust Language Server는 통합 개발 환경(IDE) 연동을 지원해서 코드 완성과 인라인 오류 메시지를 제공해줘요.

이런 도구들을 비롯한 Rust 생태계의 여러 도구를 쓰다 보면, 시스템 수준 코드를 짜면서도 생산적으로 일할 수 있어요.

학생

Rust는 시스템 개념을 배우고 싶은 학생들이나 관심 있는 분들을 위한 언어예요. 실제로 많은 사람들이 Rust를 통해 운영체제 개발 같은 주제를 배웠어요. 커뮤니티도 굉장히 환영해주고 학생들의 질문에 기꺼이 답해줘요. 이 책 같은 노력을 통해 Rust 팀은 시스템 개념을 더 많은 사람, 특히 프로그래밍을 처음 시작하는 분들에게 더 쉽게 전달하고 싶어 해요.

기업

크고 작은 수백 개의 회사가 다양한 업무에 Rust를 프로덕션에서 사용하고 있어요. 명령줄 도구, 웹 서비스, DevOps 도구, 임베디드 기기, 오디오·비디오 분석과 트랜스코딩, 암호화폐, 생물정보학, 검색 엔진, 사물인터넷(IoT) 애플리케이션, 머신러닝, 그리고 Firefox 웹 브라우저의 주요 부분까지도요.

오픈소스 개발자

Rust는 Rust 프로그래밍 언어 자체, 커뮤니티, 개발자 도구, 그리고 라이브러리를 만들고 싶은 분들을 위한 언어예요. 여러분이 Rust 언어에 기여해주시면 정말 감사해요.

속도와 안정성을 중요하게 생각하는 분들

Rust는 언어에서 속도와 안정성을 갈망하는 분들을 위한 언어예요. 여기서 "속도"란 Rust 코드가 얼마나 빠르게 실행되는지뿐만 아니라 Rust가 여러분이 프로그램을 얼마나 빠르게 작성할 수 있게 해주는지도 의미해요. Rust 컴파일러의 검사는 기능을 추가하거나 리팩터링할 때도 안정성을 보장해줘요. 이런 검사가 없는 언어의 취약한 레거시 코드는 개발자들이 수정하기 두려워하기 일쑤인데, 그 반대예요. Rust는 zero-cost abstractions(더 높은 수준의 기능을 손으로 직접 짠 코드만큼 빠른 저수준 코드로 컴파일해주는 것)를 추구하면서, 안전한 코드가 곧 빠른 코드가 되도록 만드려고 노력해요.

이 외에도 Rust는 더 많은 사용자들을 지원하려고 해요. 여기 언급한 분들은 가장 큰 이해관계자들의 일부일 뿐이에요. 전반적으로 Rust의 가장 큰 야망은 수십 년 동안 프로그래머들이 당연하게 받아들여 왔던 트레이드오프를 없애는 거예요. 안전 그리고 생산성, 속도 그리고 편리함을 동시에 제공하면서 말이죠. Rust를 직접 한번 써보시고, 그 선택이 여러분에게 맞는지 확인해보세요.

이 책은 누구를 위한 책인가요?

이 책은 여러분이 다른 프로그래밍 언어로 코드를 작성해본 적 있다고 가정하지만, 어떤 특정 언어를 썼는지는 전제하지 않아요. 다양한 프로그래밍 배경을 가진 분들이 폭넓게 접근할 수 있도록 내용을 구성하려고 노력했어요. 프로그래밍이 무엇인지나 어떻게 생각해야 하는지 같은 것에는 많은 지면을 할애하지 않아요. 프로그래밍이 완전히 처음이시라면, 프로그래밍 입문을 전문으로 다루는 책을 읽는 편이 더 나을 거예요.

이 책을 어떻게 사용해야 하나요?

일반적으로 이 책은 앞에서 뒤로 순서대로 읽는 걸 가정해요. 뒤쪽의 챕터들은 앞쪽 챕터의 개념을 기반으로 하고, 앞쪽 챕터는 특정 주제를 깊게 파지 않을 수도 있지만 나중에 다시 다루게 돼요.

이 책에는 두 종류의 챕터가 있어요: 개념 챕터와 프로젝트 챕터예요. 개념 챕터에서는 Rust의 한 측면을 배우게 되고, 프로젝트 챕터에서는 지금까지 배운 내용을 적용해서 작은 프로그램을 함께 만들어봐요. 2장, 12장, 21장이 프로젝트 챕터이고, 나머지는 개념 챕터예요.

1장에서는 Rust를 설치하는 방법, "Hello, world!" 프로그램을 작성하는 방법, 그리고 Rust의 패키지 매니저이자 빌드 도구인 Cargo를 사용하는 방법을 설명해요. 2장은 Rust로 프로그램을 작성하는 것에 대한 실습형 입문으로, 숫자 맞추기 게임을 만들어봐요. 여기서는 개념을 높은 수준에서 다루고 나중의 챕터에서 더 자세히 설명해줘요. 바로 손을 더럽혀보고 싶다면 2장이 딱 맞아요. 아주 꼼꼼한 성격이라 다음으로 넘어가기 전에 모든 세부사항을 배우고 싶은 분이라면 2장을 건너뛰고 3장으로 가는 게 좋을 수 있어요. 3장은 다른 프로그래밍 언어와 비슷한 Rust 기능들을 다루거든요. 그러다 원할 때 2장으로 돌아와서 배운 내용을 적용하는 프로젝트를 진행하면 돼요.

4장에서는 Rust의 소유권 시스템을 배워요. 5장은 struct와 메서드를 다루고, 6장은 enum, match 표현식, 그리고 if letlet...else 제어 흐름 구문을 다뤄요. struct와 enum을 사용해서 커스텀 타입을 만들게 돼요.

7장에서는 Rust의 모듈 시스템과 코드를 구성하고 공개 응용 프로그래밍 인터페이스(API)를 만들기 위한 프라이버시 규칙을 배워요. 8장은 표준 라이브러리가 제공하는 몇 가지 공통 컬렉션 데이터 구조(벡터, 문자열, 해시 맵)를 다뤄요. 9장은 Rust의 오류 처리 철학과 기법을 살펴봐요.

10장은 여러 타입에 적용되는 코드를 정의할 힘을 주는 제네릭, 트레이트, 라이프타임을 파고들어요. 11장은 테스트에 관한 내용인데, Rust의 안전성 보장이 있어도 프로그램의 로직이 올바른지 확인하는 데는 필요해요. 12장에서는 파일 안의 텍스트를 검색하는 grep 명령줄 도구의 기능 일부를 직접 구현해봐요. 이를 위해 앞 챕터에서 다룬 많은 개념을 사용하게 돼요.

13장은 클로저와 이터레이터(함수형 프로그래밍 언어에서 온 Rust의 기능)를 탐구해요. 14장에서는 Cargo를 더 깊이 살펴보고 여러분의 라이브러리를 다른 사람들과 공유하는 모범 사례를 이야기해요. 15장은 표준 라이브러리가 제공하는 스마트 포인터와 그 기능을 가능하게 하는 트레이트를 다뤄요.

16장에서는 다양한 동시성 프로그래밍 모델을 살펴보고 Rust가 어떻게 여러 스레드에서 두려움 없이 프로그래밍하게 해주는지 이야기해요. 17장에서는 거기에 더해 Rust의 async와 await 문법, 그리고 tasks, futures, streams와 그것들이 가능하게 하는 가벼운 동시성 모델을 탐구해요.

18장은 Rust의 관용구가 여러분이 익숙할 객체 지향 프로그래밍 원칙과 어떻게 비교되는지 살펴봐요. 19장은 패턴과 패턴 매칭에 관한 레퍼런스인데, Rust 프로그램 전체에서 아이디어를 표현하는 강력한 방법이에요. 20장은 unsafe Rust, 매크로, 그리고 라이프타임·트레이트·타입·함수·클로저에 대한 더 많은 내용을 포함한 고급 주제의 모음이에요.

21장에서는 저수준 멀티스레드 웹 서버를 구현하는 프로젝트를 완성해요!

마지막으로, 일부 부록에는 언어에 관한 유용한 정보가 더 레퍼런스에 가까운 형식으로 담겨 있어요. 부록 A는 Rust의 키워드를, 부록 B는 Rust의 연산자와 기호를, 부록 C는 표준 라이브러리가 제공하는 파생 가능한 트레이트를, 부록 D는 몇 가지 유용한 개발 도구를, 부록 E는 Rust 에디션을 다뤄요. 부록 F에서는 책의 번역본을 찾을 수 있고, 부록 G에서는 Rust가 어떻게 만들어지는지와 nightly Rust가 무엇인지 다뤄요.

이 책을 읽는 데 틀린 방법은 없어요. 건너뛰고 싶으면 건너뛰어도 돼요! 헷갈리는 게 생기면 이전 챕터로 돌아가야 할 수도 있지만, 여러분에게 맞는 방식으로 읽으면 돼요.

Rust를 배우는 과정에서 아주 중요한 부분 하나는 컴파일러가 표시하는 오류 메시지를 읽는 법을 배우는 거예요. 그 메시지들이 여러분을 동작하는 코드로 안내해주거든요. 그래서 우리는 컴파일되지 않는 예제를 많이 제공하고, 각 상황에서 컴파일러가 보여줄 오류 메시지도 함께 제시해요. random한 예제를 그냥 입력해서 실행하면 컴파일되지 않을 수도 있다는 걸 알아두세요! 실행하려는 예제가 오류를 의도한 건지 아닌지 주변 텍스트를 꼭 읽어보세요. 대부분의 상황에서 우리는 컴파일되지 않는 코드의 올바른 버전으로 여러분을 안내해줄 거예요. Ferris도 동작을 의도하지 않은 코드를 구분하는 데 도움을 줘요:

  • Ferris 의미: "이 코드는 컴파일되지 않아요!", "이 코드는 panic이 나요!", "이 코드는 원하는 동작을 만들지 못해요."

대부분의 상황에서 우리는 컴파일되지 않는 코드의 올바른 버전으로 여러분을 안내해줄 거예요.

더 알아보기

이 책이 생성되는 원본 소스 파일은 GitHub에서 찾아볼 수 있어요.