러스트 프로그래밍 공식 가이드
러스트 입문에 필요한 단 한 권의 책 ‘The Book’ 러스트 공식 가이드북의 러스트 2021 버전의 한국어판이다. 초판과 달리, 한국 커뮤니티에서 문서 번역을 주도했던 권지용(rinthel)이 새로 번역했다. 함수 생성, 데이터 구조 선택, 변수 바인딩 같은 기본 개념을 확실히 익힌 후에 소유권, 트레이트, 스마트 포인터, 멀티스레딩, 카고, 문서화, 테스트, 패턴 매칭 등 좀 더 고급 개념들도 자세히 살펴본다. 러스트가 왜 개발자들에게 사랑받는지, 그리고 러스트를 배울 때 책을 딱 한 권만 꼽으라면 왜 이 책이 꼽히는지, 읽어보면 이유를 알 수 있다.
모질라의 러스트 커뮤니티 팀 리더로서 공식적인 러스트 커뮤니티 문서를 담당하고 있고 신뢰받는 러스트 커뮤니티 애드버킷이기도 하다. 콘퍼런스에 발표자로 자주 참가하며, 루비 온 레일즈 프로젝트의 최다 기여자 중 한 명이다.
지은이·감수자·옮긴이 소개 xvi옮긴이 머리말 xvii베타리더 후기 xix추천사 xxi추천 서문 xxii서문 xxiv감사의 글 xxv이 책에 대하여 xxviCHAPTER 1 시작해봅시다 11.1 러스트 설치 1__1.1.1 rustup 설치(리눅스 및 macOS) 2__1.1.2 rustup 설치(윈도우) 3__1.1.3 트러블슈팅 3__1.1.4 업데이트 및 삭제 4__1.1.5 로컬 문서 41.2 Hello, World! 5__1.2.1 프로젝트 디렉터리 생성하기 5__1.2.2 러스트 프로그램 작성하고 실행하기 6__1.2.3 러스트 프로그램 뜯어보기 6__1.2.4 컴파일과 실행은 별개의 과정입니다 81.3 카고를 사용해봅시다 9__1.3.1 카고로 프로젝트 생성하기 10__1.3.2 카고로 프로젝트를 빌드하고 실행하기 11__1.3.3 릴리스 빌드 생성하기 13__1.3.4 관례로서의 카고 14정리 14CHAPTER 2 추리 게임 172.1 새로운 프로젝트 준비하기 182.2 추릿값 처리하기 19__2.2.1 변수에 값 저장하기 20__2.2.2 사용자 입력 받기 21__2.2.3 Result 타입으로 잠재적 실패 다루기 22__2.2.4 println! 자리표시자를 이용한 값 출력하기 24__2.2.5 첫 번째 부분 테스트하기 252.3 비밀번호 생성하기 25__2.3.1 크레이트를 사용하여 더 많은 기능 가져오기 25__2.3.2 임의의 숫자 생성하기 292.4 비밀번호와 추릿값 비교하기 312.5 반복문을 이용하여 여러 번의 추리 허용하기 35__2.5.1 정답을 맞힌 후 종료하기 36__2.5.2 잘못된 입력값 처리하기 37정리 40CHAPTER 3 일반적인 프로그래밍 개념 413.1 변수와 가변성 42__3.1.1 상수 44__3.1.2 섀도잉 453.2 데이터 타입 47__3.2.1 스칼라 타입 48__3.2.2 복합 타입 523.3 함수 57__3.3.1 매개변수 58__3.3.2 구문과 표현식 60__3.3.3 반환값을 갖는 함수 623.4 주석 653.5 제어 흐름 66__3.5.1 if 표현식 66__3.5.2 반복문을 이용한 반복 71정리 76CHAPTER 4 소유권 이해하기 794.1 소유권이 뭔가요? 79__4.1.1 소유권 규칙 81__4.1.2 변수의 스코프 81__4.1.3 String 타입 82__4.1.4 메모리와 할당 83__4.1.5 소유권과 함수 90__4.1.6 반환값과 스코프 914.2 참조와 대여 92__4.2.1 가변 참조자 95__4.2.2 댕글링 참조 98__4.2.3 참조자 규칙 1004.3 슬라이스 타입 100__4.3.1 문자열 슬라이스 103__4.3.2 그 외 슬라이스 108정리 109CHAPTER 5 구조체로 연관된 데이터 구조화하기 1115.1 구조체 정의 및 인스턴스화 111__5.1.1 필드 초기화 축약법 사용하기 114__5.1.2 기존 인스턴스를 이용해 새 인스턴스를 만들 때 구조체 업데이트 문법 사용하기 114__5.1.3 명명된 필드 없는 튜플 구조체를 사용하여 다른 타입 만들기 116__5.1.4 필드가 없는 유사 유닛 구조체 1165.2 구조체를 사용한 예제 프로그램 119__5.2.1 튜플로 리팩터링하기 120__5.2.2 구조체로 리팩터링하여 코드에 더 많은 의미를 담기 120__5.2.3 트레이트 파생으로 유용한 기능 추가하기 1225.3 메서드 문법 126__5.3.1 메서드 정의하기 126__5.3.2 더 많은 매개변수를 가진 메서드 129__5.3.3 연관 함수 130__5.3.4 여러 개의 impl 블록 131정리 132CHAPTER 6 열거형과 패턴 매칭 1336.1 열거형 정의하기 133__6.1.1 열거형 값 134__6.1.2 Option 열거형이 널값보다 좋은 점들 1396.2 match 제어 흐름 구조 142__6.2.1 값을 바인딩하는 패턴 144__6.2.2 Option〈T〉를 이용하는 매칭 145__6.2.3 match는 철저합니다 147__6.2.4 포괄 패턴과 _ 자리표시자 1486.3 if let을 사용한 간결한 제어 흐름 150정리 152CHAPTER 7 커져가는 프로젝트를 패키지, 크레이트, 모듈로 관리하기 1537.1 패키지와 크레이트 1547.2 모듈을 정의하여 스코프 및 공개 여부 제어하기 1587.3 경로를 사용하여 모듈 트리의 아이템 참조하기 160__7.3.1 pub 키워드로 경로 노출하기 163__7.3.2 super로 시작하는 상대 경로 166__7.3.3 구조체, 열거형을 공개하기 1677.4 use 키워드로 경로를 스코프 안으로 가져오기 169__7.4.1 보편적인 use 경로 작성법 171__7.4.2 as 키워드로 새로운 이름 제공하기 173__7.4.3 pub use로 다시 내보내기 173__7.4.4 외부 패키지 사용하기 174__7.4.5 중첩 경로를 사용하여 대량의 use 나열을 정리하기 175__7.4.6 글롭 연산자 1767.5 별개의 파일로 모듈 분리하기 177정리 179CHAPTER 8 일반적인 컬렉션 1818.1 벡터에 여러 값의 목록 저장하기 182__8.1.1 새 벡터 만들기 182__8.1.2 벡터 업데이트하기 183__8.1.3 벡터 요소 읽기 183__8.1.4 벡터값에 대해 반복하기 186__8.1.5 열거형을 이용해 여러 타입 저장하기 187__8.1.6 벡터가 버려지면 벡터의 요소도 버려집니다 1888.2 문자열에 UTF - 8 텍스트 저장하기 188__8.2.1 문자열이 뭔가요? 189__8.2.2 새로운 문자열 생성하기 189__8.2.3 문자열 업데이트하기 191__8.2.4 문자열 내부의 인덱싱 193__8.2.5 문자열 슬라이싱하기 196__8.2.6 문자열에 대한 반복을 위한 메서드 197__8.2.7 문자열은 그렇게 단순하지 않습니다 1988.3 해시 맵에 서로 연관된 키와 값 저장하기 198__8.3.1 새로운 해시 맵 생성하기 199__8.3.2 해시 맵의 값 접근하기 199__8.3.3 해시 맵과 소유권 200__8.3.4 해시 맵 업데이트하기 201__8.3.5 해시 함수 204정리 204CHAPTER 9 에러 처리 2079.1 panic!으로 복구 불가능한 에러 처리하기 208__9.1.1 panic! 백트레이스 이용하기 2099.2 Result로 복구 가능한 에러 처리하기 212__9.2.1 서로 다른 에러에 대해 매칭하기 214__9.2.2 에러 전파하기 2179.3 panic!이냐, panic!이 아니냐, 그것이 문제로다 224__9.3.1 예제, 프로토타입 코드, 그리고 테스트 225__9.3.2 여러분이 컴파일러보다 더 많은 정보를 가지고 있을 때 225__9.3.3 에러 처리를 위한 가이드라인 226__9.3.4 유효성을 위한 커스텀 타입 생성하기 228정리 230CHAPTER 10 제네릭 타입, 트레이트, 라이프타임 23110.1 함수로 추출하여 중복 없애기 23210.2 제네릭 데이터 타입 235__10.2.1 제네릭 함수 정의 235__10.2.2 제네릭 구조체 정의 238__10.2.3 제네릭 열거형 정의 240__10.2.4 제네릭 메서드 정의 241__10.2.5 제네릭 코드의 성능 24310.3. 트레이트로 공통된 동작 정의하기 244__10.3.1 트레이트 정의하기 245__10.3.2 특정 타입에 트레이트 구현하기 246__10.3.3 기본 구현 248__10.3.4 매개변수로서의 트레이트 250__10.3.5 트레이트를 구현하는 타입을 반환하기 253__10.3.6 트레이트 바운드를 사용해 조건부로 메서드 구현하기 25410.4 라이프타임으로 참조자의 유효성 검증하기 256__10.4.1 라이프타임으로 댕글링 참조 방지하기 256__10.4.2 대여 검사기 258__10.4.3 함수에서의 제네릭 라이프타임 259__10.4.4 라이프타임 명시 문법 260__10.4.5 함수 시그니처에서 라이프타임 명시하기 261__10.4.6 라이프타임의 측면에서 생각하기 264__10.4.7 구조체 정의에서 라이프타임 명시하기 265__10.4.8 라이프타임 생략 266__10.4.9 메서드 정의에서 라이프타임 명시하기 269__10.4.10 정적 라이프타임 27010.5 제네릭 타입 매개변수, 트레이트 바운드, 라이프타임을 한 곳에 사용해보기 271정리 272CHAPTER 11 자동화 테스트 작성하기 27311.1 테스트 작성 방법 274__11.1.1 테스트 함수 파헤치기 274__11.1.2 assert! 매크로로 결과 검사하기 279__11.1.3 assert_eq!, assert_ne! 매크로를 이용한 동등 테스트 282__11.1.4 커스텀 실패 메시지 추가하기 285__11.1.5 should_panic 매크로로 패닉 발생 검사하기 287__11.1.6 Result〈T, E〉를 이용한 테스트 29111.2 테스트 실행 방법 제어하기 292__11.2.1 테스트를 병렬 혹은 순차적으로 실행하기 292__11.2.2 함수 출력 표시하기 293__11.2.3 이름을 지정해 일부 테스트만 실행하기 295__11.2.4 특별 요청이 없다면 일부 테스트 무시하기 29711.3 테스트 조직화 299__11.3.1 유닛 테스트 299__11.3.2 통합 테스트 301정리 306CHAPTER 12 I/O 프로젝트: 커맨드 라인 프로그램 만들기 30712.1 커맨드 라인 인수 받기 308__12.1.1 인수 읽기 309__12.1.2 인수들을 변수에 저장하기 31112.2 파일 읽기 31212.3 모듈성과 에러 처리 향상을 위한 리팩터링 313__12.3.1 바이너리 프로젝트에 대한 관심사 분리 314__12.3.2 에러 처리 수정 319__12.3.3 main으로부터 로직 추출하기 323__12.3.4 라이브러리 크레이트로 코드 쪼개기 32612.4 테스트 주도 개발로 라이브러리 기능 개발하기 328__12.4.1 실패하는 테스트 작성하기 328__12.4.2 테스트를 통과하도록 코드 작성하기 33112.5 환경 변수 사용하기 334__12.5.1 대소문자를 구분하지 않는 search 함수에 대한 실패하는 테스트 작성하기 335__12.5.2 search_case_insensitive 함수 구현하기 33612.6 표준 출력 대신 표준 에러로 에러 메시지 작성하기 341__12.6.1 에러가 기록되었는지 검사하기 341__12.6.2 표준 에러로 에러 출력하기 342정리 343CHAPTER 13 함수형 언어의 특성: 반복자와 클로저 34513.1 클로저: 자신의 환경을 캡처하는 익명 함수 346__13.1.1 클로저로 환경 캡처하기 346__13.1.2 클로저 타입 추론과 명시 348__13.1.3 참조자를 캡처하거나 소유권 이동하기 351__13.1.4 캡처된 값을 클로저 밖으로 이동하기와 Fn 트레이트 35313.2 반복자로 일련의 아이템 처리하기 358__13.2.1 Iterator 트레이트와 next 메서드 359__13.2.2 반복자를 소비하는 메서드 361__13.2.3 다른 반복자를 생성하는 메서드 361__13.2.4 환경을 캡처하는 클로저 사용하기 36313.3 I/O 프로젝트 개선하기 365__13.3.1 반복자를 사용하여 clone 제거하기 365__13.3.2 반복자 어댑터로 더 간결한 코드 만들기 368__13.3.3 루프와 반복자 중 선택하기 36913.4 성능 비교하기: 루프 vs. 반복자 370정리 372CHAPTER 14 카고와 crates.io 더 알아보기 37314.1 릴리스 프로필을 통한 빌드 커스터마이징하기 37414.2 crates.io에 크레이트 배포하기 375__14.2.1 유용한 문서화 주석 만들기 375__14.2.2 pub use로 편리하게 공개 API 내보내기 379__14.2.3 crates.io 계정 설정하기 384__14.2.4 새 크레이트에 메타데이터 추가하기 384__14.2.5 crates.io에 배포하기 386__14.2.6 이미 존재하는 크레이트의 새 버전 배포하기 387__14.2.7 cargo yank로 crates.io에서 버전 사용하지 않게 하기 38714.3 카고 작업 공간 388__14.3.1 작업 공간 생성하기 388__14.3.2 작업 공간에 두 번째 패키지 생성하기 39014.4 cargo install로 crates.io에 있는 바이너리 설치하기 39514.5 커스텀 명령어로 카고 확장하기 396정리 397CHAPTER 15 스마트 포인터 39915.1 Box〈T〉를 사용하여 힙에 있는 데이터 가리키기 401__15.1.1 Box〈T〉를 사용하여 힙에 데이터 저장하기15.2 Deref 트레이트로 스마트 포인터를 보통의 참조자처럼 취급하기 407__15.2.1 포인터를 따라가서 값 얻기 408__15.2.2 Box〈T〉를 참조자처럼 사용하기 409__15.2.3 자체 스마트 포인터 정의하기 409__15.2.4 Deref 트레이트를 구현하여 임의의 타입을 참조자처럼 다루기 411__15.2.5 함수와 메서드를 이용한 암묵적 역참조 강제 412__15.2.6 역참조 강제가 가변성과 상호작용하는 법 41415.3 Drop 트레이트로 메모리 정리 코드 실행하기 415__15.3.1 std::mem::drop으로 값을 일찍 버리기 41715.4 Rc〈T〉, 참조 카운트 스마트 포인터 419__15.4.1 Rc〈T〉를 사용하여 데이터 공유하기 420__15.4.2 Rc〈T〉를 클론하는 것은 참조 카운트를 증가시킵니다 42215.5 RefCell〈T〉와 내부 가변성 패턴 424__15.5.1 RefCell〈T〉으로 런타임에 대여 규칙 집행하기 424__15.5.2 내부 가변성: 불변값에 대한 가변 대여 425__15.5.3 Rc〈T〉와 RefCell〈T〉를 조합하여 가변 데이터의 복수 소유자 만들기 43315.6 순환 참조는 메모리 누수를 발생시킬 수 있습니다 435__15.6.1 순환 참조 만들기 435__15.6.2 순환 참조 방지하기: Rc〈T〉를 Weak〈T〉로 바꾸기 439정리 444CHAPTER 16 겁 없는 동시성 44716.1 스레드를 이용하여 코드를 동시에 실행하기 448__16.1.1 spawn으로 새로운 스레드 생성하기 449__16.1.2 join 핸들을 사용하여 모든 스레드가 끝날 때까지 기다리기 450__16.1.3 스레드에 move 클로저 사용하기 45316.2 메시지 패싱을 사용하여 스레드 간 데이터 전송하기 456__16.2.1 채널과 소유권 이동 460__16.2.2 여러 값 보내기와 수신자가 기다리는지 알아보기 461__16.2.3 송신자를 복제하여 여러 생산자 만들기 46216.3 공유 상태 동시성 464__16.3.1 뮤텍스를 사용하여 한 번에 하나의 스레드에서만 데이터 접근을 허용하기 464__16.3.2 RefCell〈T〉/Rc〈T〉와 Mutex〈T〉/Arc〈T〉 간의 유사성 47116.4 Sync와 Send 트레이트를 이용한 확장 가능한 동시성 472__16.4.1 Send를 사용하여 스레드 사이에 소유권 이동을 허용하기 472__16.4.2 Sync를 사용하여 여러 스레드로부터의 접근을 허용하기 473__16.4.3 Send와 Sync를 손수 구현하는 것은 안전하지 않습니다 473정리 474CHAPTER 17 러스트의 객체 지향 프로그래밍 기능 47517.1 객체 지향 언어의 특성 476__17.1.1 객체는 데이터와 동작을 담습니다 476__17.1.2 상세 구현을 은닉하는 캡슐화 476__17.1.3 타입 시스템과 코드 공유로서의 상속 47817.2 트레이트 객체를 사용하여 다른 타입의 값 허용하기 480__17.2.1 공통된 동작을 위한 트레이트 정의하기 481__17.2.2 트레이트 구현하기 483__17.2.3 트레이트 객체는 동적 디스패치를 수행합니다 48617.3 객체 지향 디자인 패턴 구현하기 487__17.3.1 Post를 정의하고 초안 상태의 새 인스턴스 생성하기 489__17.3.2 게시물 콘텐츠의 텍스트 저장하기 490__17.3.3 초안 게시물의 내용이 비어 있음을 보장하기 491__17.3.4 게시물에 대한 검토 요청이 게시물의 상태를 변경합니다 491__17.3.5 content의 동작을 변경하는 approve 메서드 추가하기 493__17.3.6 상태 패턴의 장단점 496정리 502CHAPTER 18 패턴과 매칭 50318.1 패턴이 사용될 수 있는 모든 곳 504__18.1.1 match 갈래 504__18.1.2 if let 조건 표현식 505__18.1.3 while let 조건 루프 506__18.1.4 for 루프 507__18.1.5 let 구문 508__18.1.6 함수 매개변수 50918.2 반박 가능성: 패턴이 매칭에 실패할지의 여부 51018.3 패턴 문법 513__18.3.1 리터럴 매칭 513__18.3.2 명명된 변수 매칭 513__18.3.3 다중 패턴 515__18.3.4 ..=을 이용한 값의 범위 매칭 515__18.3.5 값을 해체하여 분리하기 516__18.3.6 패턴에서 값 무시하기 521__18.3.7 매치 가드를 사용한 추가 조건 526__18.3.8 @ 바인딩 528정리 530CHAPTER 19 고급 기능 53119.1 안전하지 않은 러스트 532__19.1.1 안전하지 않은 슈퍼파워 532__19.1.2 원시 포인터 역참조하기 533__19.1.3 안전하지 않은 함수 또는 메서드 호출하기 536__19.1.4 가변 정적 변수의 접근 혹은 수정하기 541__19.1.5 안전하지 않은 트레이트 구현하기 543__19.1.6 유니언 필드에 접근하기 543__19.1.7 unsafe 코드를 사용하는 경우 54419.2 고급 트레이트 544__19.2.1 연관 타입으로 트레이트 정의에서 자리표시자 타입 지정하기 544__19.2.2 기본 제네릭 타입 매개변수와 연산자 오버로딩 546__19.2.3 모호성 방지를 위한 완전 정규화 문법: 같은 이름의 메서드 호출하기 549__19.2.4 슈퍼트레이트를 사용하여 한 트레이트에서 다른 트레이트의 기능을 요구하기 553__19.2.5 뉴타입 패턴을 사용하여 외부 타입에 외부 트레이트 구현하기 55619.3 고급 타입 557__19.3.1 타입 안전성과 추상화를 위한 뉴타입 패턴 사용하기 557__19.3.2 타입 별칭으로 타입의 동의어 만들기 558__19.3.3 절대 반환하지 않는 부정 타입 561__19.3.4 동적 크기 타입과 Sized 트레이트 56319.4 고급 함수와 클로저 565__19.4.1 함수 포인터 565__19.4.2 클로저 반환하기 56719.5 매크로 568__19.5.1 매크로와 함수의 차이 569__19.5.2 일반적인 메타프로그래밍을 위한 macro_rules!를 사용한 선언적 매크로 569__19.5.3 속성에서 코드를 생성하기 위한 절차적 매크로 572__19.5.4 커스텀 파생 매크로 작성 방법 573__19.5.5 속성형 매크로 579__19.5.6 함수형 매크로 580정리 581CHAPTER 20 최종 프로젝트: 멀티스레드 웹서버 구축하기 58320.1 싱글스레드 웹서버 구축하기 584__20.1.1 TCP 연결 수신 대기하기 585__20.1.2 요청 읽기 587__20.1.3 HTTP 요청 자세히 살펴보기 590__20.1.4 응답 작성하기 591__20.1.5 실제 HTML 반환하기 592__20.1.6 요청의 유효성 검사와 선택적 응답 594__20.1.7 리팩터링 59620.2 싱글스레드 서버를 멀티스레드 서버로 바꾸기 597__20.2.1 현재의 서버 구현에서 느린 요청 시뮬레이션 597__20.2.2 스레드 풀로 처리량 개선하기 59920.3 우아한 종료와 정리 618__20.3.1 ThreadPool에 대한 Drop 트레이트 구현하기 618__20.3.2 작업을 기다리는 스레드에게 정지 신호 보내기 621정리 628부록 A. 키워드 630A.1 현재 사용 중인 키워드 630A.2 미래에 사용하기 위해 예약된 키워드 632A.3 원시 식별자 632부록 B. 연산자와 기호 634B.1 연산자 634B.2 비연산자 기호 636부록 C. 파생 가능한 트레이트 640C.1 프로그래머 출력을 위한 Debug 641C.2 동등 비교를 위한 PartialEq 및 Eq 641C.3 순서 비교를 위한 PartialOrd 및 Ord 642C.4 값을 복제하기 위한 Clone과 Copy 643C.5 어떤 값을 고정 크기의 값으로 매핑하기 위한 Hash 644C.6 기본값을 위한 Default 644부록 D. 유용한 개발 도구 645D.1 rustfmt로 자동 포매팅하기 645D.2 rustfix로 코드 수정하기 646D.3 Clippy로 더 많은 린트 사용하기 647D.4 rust-analyzer를 사용한 IDE 통합 648부록 E. 에디션 649부록 F. 번역본 651부록 G. 러스트가 만들어지는 과정과 ‘nightly 러스트’ 653G.1 정체되지 않는 안정성 653G.2 칙칙폭폭! 릴리스 채널과 기차 타기 653G.3 불안정한 기능 656G.4 rustup과 nightly 러스트의 역할 656G.5 RFC 과정과 팀 657찾아보기 658
[1].png)