Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

들어가며

Note: 이 책의 이번 판은 No Starch Press에서 종이책과 전자책으로 출간된 The Rust Programming Language와 같은 내용입니다.

러스트 프로그래밍 언어 에 오신 것을 환영합니다. 이 책은 러스트를 소개하는 입문서입니다. 러스트 프로그래밍 언어는 더 빠르고 더 신뢰할 수 있는 소프트웨어를 작성하도록 도와줍니다. 보통 프로그래밍 언어를 설계할 때는 고수준의 사용 편의성과 저수준의 세밀한 제어가 서로 충돌합니다. 러스트는 이 충돌에 정면으로 도전합니다. 강력한 기술적 역량과 훌륭한 개발 경험의 균형을 통해, 러스트는 메모리 사용량 같은 저수준 세부 사항을 제어하면서도 그에 따라붙기 마련이던 번거로움은 크게 줄여 줍니다.

러스트는 누구를 위한 언어인가

러스트는 여러 이유로 다양한 사람들에게 잘 맞는 언어입니다. 그중에서도 특히 중요한 몇 부류를 살펴보겠습니다.

개발자 팀

러스트는 시스템 프로그래밍 지식 수준이 서로 다른 대규모 개발자 팀이 협업할 때 생산적인 도구임이 입증되고 있습니다. 저수준 코드는 다양한 미묘한 버그에 취약한데, 대부분의 다른 언어에서는 이런 버그를 광범위한 테스트와 숙련 개발자의 세심한 코드 리뷰를 통해서만 잡아낼 수 있습니다. 러스트에서는 컴파일러가 문지기 역할을 수행하여, 동시성 버그를 포함한 이런 잡기 어려운 버그가 있는 코드는 아예 컴파일하지 않습니다. 팀은 컴파일러와 함께 일함으로써 버그를 쫓는 데 시간을 쓰기 보다 프로그램의 논리에 집중할 수 있습니다.

러스트는 시스템 프로그래밍 세계에 현대적인 개발 도구도 함께 가져왔습니다.

  • 함께 제공되는 의존성 관리자이자 빌드 도구인 Cargo는 의존성 추가, 컴파일, 관리 작업을 러스트 생태계 전반에서 일관되고 수월하게 만들어 줍니다.
  • rustfmt 포매터는 여러 개발자 사이에서 일관된 코딩 스타일을 보장합니다.
  • Rust Language Server는 코드 자동 완성과 인라인 오류 메시지 같은 통합 개발 환경 (IDE) 연동을 가능하게 합니다.

이런 도구들과 러스트 생태계의 다른 도구들을 활용하면, 개발자는 시스템 수준의 코드를 작성하면서도 높은 생산성을 유지할 수 있습니다.

학생

러스트는 학생과 시스템 개념을 배우고 싶은 사람들에게도 잘 맞습니다. 많은 사람이 러스트를 사용하면서 운영체제 개발 같은 주제를 배웠습니다. 커뮤니티는 매우 친절하며 학생들의 질문에 기꺼이 답해 줍니다. 러스트 팀은 이 책과 같은 노력을 통해, 특히 프로그래밍을 처음 접하는 사람들에게 시스템 개념을 더 쉽게 접할 수 있게 만들고자 합니다.

기업

대기업과 소기업을 포함한 수백 개의 회사가 커맨드라인 도구, 웹 서비스, DevOps 도구, 임베디드 장치, 오디오·비디오 분석 및 트랜스코딩, 암호화폐, 생물정보학, 검색 엔진, 사물 인터넷 애플리케이션, 머신 러닝, 심지어 Firefox 웹 브라우저의 핵심 일부에 이르기까지 다양한 분야에서 러스트를 실제 운영 환경에 사용하고 있습니다.

오픈 소스 개발자

러스트는 러스트 언어 자체와 커뮤니티, 개발 도구, 라이브러리를 함께 만들어 가고 싶은 사람들을 위한 언어이기도 합니다. 러스트 언어에 기여해 주신다면 언제든 환영합니다.

속도와 안정성을 중시하는 사람

러스트는 언어에서 속도와 안정성을 모두 원하는 사람을 위한 언어입니다. 여기서 말하는 속도는 러스트 코드가 얼마나 빠르게 실행되는가뿐 아니라, 러스트가 얼마나 빠르게 프로그램을 작성하게 해 주는가도 포함합니다. 러스트 컴파일러의 검사는 기능 추가와 리팩터링 과정에서도 안정성을 보장합니다. 이런 검사가 없는 언어의 낡고 깨지기 쉬운 레거시 코드와는 대조적이며, 그런 코드들은 개발자가 수정 자체를 두려워하는 경우가 많습니다. 러스트는 수동으로 작성한 저수준 코드만큼 빠르게 컴파일되는 고수준 기능, 즉 zero-cost abstraction을 지향함으로써 안전한 코드가 곧 빠른 코드가 되도록 노력합니다.

러스트는 여기서 언급한 사람들 외에도 훨씬 더 많은 사용자를 지원하고자 합니다. 지금 소개한 부류는 그중 일부의 대표적인 이해관계자일 뿐입니다. 전체적으로 보면, 러스트의 가장 큰 야망은 프로그래머가 수십 년 동안 당연하게 받아들여 온 절충을 없애는 데 있습니다. 안전성 그리고 생산성, 속도 그리고 사용 편의성을 함께 제공하겠다는 것입니다. 러스트를 직접 써 보고, 이런 선택이 여러분에게도 잘 맞는지 확인해 보세요.

이 책은 누구를 위한 책인가

이 책은 여러분이 다른 프로그래밍 언어로 코드를 작성해 본 적은 있다고 가정하지만, 그 언어가 무엇인지는 가정하지 않습니다. 다양한 배경을 가진 독자가 폭넓게 접근할 수 있도록 내용을 구성하려 했습니다. 프로그래밍이 무엇인지, 혹은 프로그래밍을 어떻게 사고해야 하는지에 대해서는 많은 시간을 쓰지 않습니다. 만약 여러분이 프로그래밍을 완전히 처음 접한다면, 프로그래밍 자체를 소개하는 입문서를 먼저 읽는 편이 더 나을 수 있습니다.

이 책을 사용하는 방법

대체로 이 책은 앞에서 뒤로 순서대로 읽는 것을 전제로 합니다. 뒤의 장들은 앞선 장들의 개념을 바탕으로 하며, 앞 장에서 어떤 주제를 자세히 다루지 않더라도 뒤 장에 가서 다시 그 주제를 깊게 다루는 경우가 있습니다.

이 책에는 두 종류의 장이 있습니다. 개념 장과 프로젝트 장입니다. 개념 장에서는 러스트의 특정 측면을 배우고, 프로젝트 장에서는 지금까지 배운 내용을 적용해 작은 프로그램을 함께 만들어 봅니다. 2장, 12장, 21장은 프로젝트 장이고, 나머지는 개념 장입니다.

1장에서는 러스트 설치 방법, “Hello, world!” 프로그램 작성 방법, 그리고 러스트의 패키지 관리자이자 빌드 도구인 Cargo 사용법을 설명합니다. 2장은 러스트로 프로그램을 작성하는 실습형 입문 장으로, 숫자 맞히기 게임을 만들어 봅니다. 여기서는 개념을 높은 수준에서 다루고, 자세한 내용은 뒤 장들에서 보강합니다. 손을 바로 움직여 보고 싶다면 2장이 좋은 출발점입니다. 반대로 모든 세부를 익힌 뒤 다음으로 넘어가고 싶은 꼼꼼한 학습자라면, 다른 프로그래밍 언어와 비슷한 러스트 기능을 설명하는 3장으로 먼저 가도 됩니다. 그런 다음 배운 내용을 프로젝트에 적용해 보고 싶을 때 2장으로 돌아오면 됩니다.

4장에서는 러스트의 소유권 시스템을 배웁니다. 5장에서는 구조체와 메서드를 다루고, 6장에서는 열거형, match 식, if letlet...else 제어 흐름 구문을 다룹니다. 여러분은 구조체와 열거형을 사용해 자신만의 타입을 만들게 됩니다.

7장에서는 러스트의 모듈 시스템과, 코드와 공개 애플리케이션 프로그래밍 인터페이스(API)를 구성하기 위한 공개 범위 규칙을 배웁니다. 8장에서는 표준 라이브러리가 제공하는 대표적인 컬렉션 자료구조인 벡터, 문자열, 해시 맵을 다룹니다. 9장에서는 러스트의 에러 처리 철학과 기법을 살펴봅니다.

10장에서는 여러 타입에 적용되는 코드를 정의할 수 있게 해 주는 제네릭, 트레이트, 라이프타임을 깊이 있게 다룹니다. 11장은 테스트에 관한 내용으로, 러스트의 안전성 보장이 있더라도 프로그램의 논리가 올바른지 확인하려면 테스트가 필요하다는 점을 보여 줍니다. 12장에서는 파일 안의 텍스트를 검색하는 grep 명령줄 도구 기능의 일부를 직접 구현해 봅니다. 여기서는 앞 장에서 다룬 많은 개념을 활용합니다.

13장에서는 함수형 프로그래밍 언어에서 온 러스트 기능인 클로저와 반복자를 살펴봅니다. 14장에서는 Cargo를 더 깊이 들여다보고, 라이브러리를 다른 사람과 공유할 때의 모범 사례를 이야기합니다. 15장에서는 표준 라이브러리가 제공하는 스마트 포인터와, 그 기능을 가능하게 하는 트레이트를 다룹니다.

16장에서는 다양한 동시성 프로그래밍 모델을 둘러보고, 러스트가 여러 스레드를 겁 없이 다룰 수 있게 어떻게 도와주는지 설명합니다. 17장에서는 그 내용을 바탕으로 러스트의 async, await 문법과 태스크, 퓨처, 스트림, 그리고 그것들이 가능하게 하는 경량 동시성 모델을 탐구합니다.

18장에서는 여러분이 익숙할 수 있는 객체 지향 프로그래밍 원칙과 러스트식 관용 표현을 비교해 봅니다. 19장은 패턴과 패턴 매칭에 대한 참고서 같은 장으로, 러스트 프로그램 전반에서 아이디어를 강력하게 표현하는 방법을 다룹니다. 20장에는 unsafe Rust, 매크로, 그리고 라이프타임, 트레이트, 타입, 함수, 클로저에 대한 추가 논의를 포함해 다양한 고급 주제가 담겨 있습니다.

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

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

이 책을 읽는 데 정답은 없습니다. 앞부분을 건너뛰고 싶다면 그렇게 해도 됩니다. 다만 헷갈리는 부분이 생기면 앞 장으로 다시 돌아와야 할 수도 있습니다. 결국 여러분에게 가장 잘 맞는 방식으로 읽으면 됩니다.

러스트를 배우는 과정에서 매우 중요한 부분 중 하나는 컴파일러가 보여 주는 오류 메시지를 읽는 법을 익히는 것입니다. 이 메시지들은 여러분을 올바르게 동작하는 코드로 이끌어 줍니다. 그래서 이 책에는 컴파일되지 않는 예제와, 그 상황에서 컴파일러가 실제로 보여 줄 오류 메시지를 함께 많이 실었습니다. 눈에 띄는 예제를 아무거나 입력해서 실행하면 컴파일되지 않을 수도 있다는 점을 기억하세요! 실행하려는 예제가 원래 오류를 내도록 의도된 것인지 주변 설명을 꼭 읽어 보아야 합니다. 대부분의 경우 컴파일되지 않는 코드에 대해서는 올바른 버전까지 함께 안내할 것입니다. Ferris는 원래 동작하지 않도록 의도된 코드를 구분하는 데도 도움을 줍니다.

Ferris의미
물음표와 함께 있는 Ferris이 코드는 컴파일되지 않습니다!
두 손을 들어 올린 Ferris이 코드는 패닉이 발생합니다!
한쪽 집게발을 들고 어깨를 으쓱하는 Ferris이 코드는 원하는 동작을 만들어 내지 못합니다.

대부분의 경우, 컴파일되지 않는 코드는 올바른 버전까지 함께 안내할 것입니다.

소스 코드

이 책을 생성하는 데 사용된 원본 파일은 GitHub에서 찾을 수 있습니다.