이미 소장하고 있다면 판매해 보세요.
|
지은이·감수자·옮긴이 소개 xvi
옮긴이 머리말 xvii 베타리더 후기 xix 추천사 xxi 추천 서문 xxii 서문 xxiv 감사의 글 xxv 이 책에 대하여 xxvi CHAPTER 1 시작해봅시다 1 1.1 러스트 설치 1 __1.1.1 rustup 설치(리눅스 및 macOS) 2 __1.1.2 rustup 설치(윈도우) 3 __1.1.3 트러블슈팅 3 __1.1.4 업데이트 및 삭제 4 __1.1.5 로컬 문서 4 1.2 Hello, World! 5 __1.2.1 프로젝트 디렉터리 생성하기 5 __1.2.2 러스트 프로그램 작성하고 실행하기 6 __1.2.3 러스트 프로그램 뜯어보기 6 __1.2.4 컴파일과 실행은 별개의 과정입니다 8 1.3 카고를 사용해봅시다 9 __1.3.1 카고로 프로젝트 생성하기 10 __1.3.2 카고로 프로젝트를 빌드하고 실행하기 11 __1.3.3 릴리스 빌드 생성하기 13 __1.3.4 관례로서의 카고 14 정리 14 CHAPTER 2 추리 게임 17 2.1 새로운 프로젝트 준비하기 18 2.2 추릿값 처리하기 19 __2.2.1 변수에 값 저장하기 20 __2.2.2 사용자 입력 받기 21 __2.2.3 Result 타입으로 잠재적 실패 다루기 22 __2.2.4 println! 자리표시자를 이용한 값 출력하기 24 __2.2.5 첫 번째 부분 테스트하기 25 2.3 비밀번호 생성하기 25 __2.3.1 크레이트를 사용하여 더 많은 기능 가져오기 25 __2.3.2 임의의 숫자 생성하기 29 2.4 비밀번호와 추릿값 비교하기 31 2.5 반복문을 이용하여 여러 번의 추리 허용하기 35 __2.5.1 정답을 맞힌 후 종료하기 36 __2.5.2 잘못된 입력값 처리하기 37 정리 40 CHAPTER 3 일반적인 프로그래밍 개념 41 3.1 변수와 가변성 42 __3.1.1 상수 44 __3.1.2 섀도잉 45 3.2 데이터 타입 47 __3.2.1 스칼라 타입 48 __3.2.2 복합 타입 52 3.3 함수 57 __3.3.1 매개변수 58 __3.3.2 구문과 표현식 60 __3.3.3 반환값을 갖는 함수 62 3.4 주석 65 3.5 제어 흐름 66 __3.5.1 if 표현식 66 __3.5.2 반복문을 이용한 반복 71 정리 76 CHAPTER 4 소유권 이해하기 79 4.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 반환값과 스코프 91 4.2 참조와 대여 92 __4.2.1 가변 참조자 95 __4.2.2 댕글링 참조 98 __4.2.3 참조자 규칙 100 4.3 슬라이스 타입 100 __4.3.1 문자열 슬라이스 103 __4.3.2 그 외 슬라이스 108 정리 109 CHAPTER 5 구조체로 연관된 데이터 구조화하기 111 5.1 구조체 정의 및 인스턴스화 111 __5.1.1 필드 초기화 축약법 사용하기 114 __5.1.2 기존 인스턴스를 이용해 새 인스턴스를 만들 때 구조체 업데이트 문법 사용하기 114 __5.1.3 명명된 필드 없는 튜플 구조체를 사용하여 다른 타입 만들기 116 __5.1.4 필드가 없는 유사 유닛 구조체 116 5.2 구조체를 사용한 예제 프로그램 119 __5.2.1 튜플로 리팩터링하기 120 __5.2.2 구조체로 리팩터링하여 코드에 더 많은 의미를 담기 120 __5.2.3 트레이트 파생으로 유용한 기능 추가하기 122 5.3 메서드 문법 126 __5.3.1 메서드 정의하기 126 __5.3.2 더 많은 매개변수를 가진 메서드 129 __5.3.3 연관 함수 130 __5.3.4 여러 개의 impl 블록 131 정리 132 CHAPTER 6 열거형과 패턴 매칭 133 6.1 열거형 정의하기 133 __6.1.1 열거형 값 134 __6.1.2 Option 열거형이 널값보다 좋은 점들 139 6.2 match 제어 흐름 구조 142 __6.2.1 값을 바인딩하는 패턴 144 __6.2.2 Option〈T〉를 이용하는 매칭 145 __6.2.3 match는 철저합니다 147 __6.2.4 포괄 패턴과 _ 자리표시자 148 6.3 if let을 사용한 간결한 제어 흐름 150 정리 152 CHAPTER 7 커져가는 프로젝트를 패키지, 크레이트, 모듈로 관리하기 153 7.1 패키지와 크레이트 154 7.2 모듈을 정의하여 스코프 및 공개 여부 제어하기 158 7.3 경로를 사용하여 모듈 트리의 아이템 참조하기 160 __7.3.1 pub 키워드로 경로 노출하기 163 __7.3.2 super로 시작하는 상대 경로 166 __7.3.3 구조체, 열거형을 공개하기 167 7.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 글롭 연산자 176 7.5 별개의 파일로 모듈 분리하기 177 정리 179 CHAPTER 8 일반적인 컬렉션 181 8.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 벡터가 버려지면 벡터의 요소도 버려집니다 188 8.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 문자열은 그렇게 단순하지 않습니다 198 8.3 해시 맵에 서로 연관된 키와 값 저장하기 198 __8.3.1 새로운 해시 맵 생성하기 199 __8.3.2 해시 맵의 값 접근하기 199 __8.3.3 해시 맵과 소유권 200 __8.3.4 해시 맵 업데이트하기 201 __8.3.5 해시 함수 204 정리 204 CHAPTER 9 에러 처리 207 9.1 panic!으로 복구 불가능한 에러 처리하기 208 __9.1.1 panic! 백트레이스 이용하기 209 9.2 Result로 복구 가능한 에러 처리하기 212 __9.2.1 서로 다른 에러에 대해 매칭하기 214 __9.2.2 에러 전파하기 217 9.3 panic!이냐, panic!이 아니냐, 그것이 문제로다 224 __9.3.1 예제, 프로토타입 코드, 그리고 테스트 225 __9.3.2 여러분이 컴파일러보다 더 많은 정보를 가지고 있을 때 225 __9.3.3 에러 처리를 위한 가이드라인 226 __9.3.4 유효성을 위한 커스텀 타입 생성하기 228 정리 230 CHAPTER 10 제네릭 타입, 트레이트, 라이프타임 231 10.1 함수로 추출하여 중복 없애기 232 10.2 제네릭 데이터 타입 235 __10.2.1 제네릭 함수 정의 235 __10.2.2 제네릭 구조체 정의 238 __10.2.3 제네릭 열거형 정의 240 __10.2.4 제네릭 메서드 정의 241 __10.2.5 제네릭 코드의 성능 243 10.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 트레이트 바운드를 사용해 조건부로 메서드 구현하기 254 10.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 정적 라이프타임 270 10.5 제네릭 타입 매개변수, 트레이트 바운드, 라이프타임을 한 곳에 사용해보기 271 정리 272 CHAPTER 11 자동화 테스트 작성하기 273 11.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〉를 이용한 테스트 291 11.2 테스트 실행 방법 제어하기 292 __11.2.1 테스트를 병렬 혹은 순차적으로 실행하기 292 __11.2.2 함수 출력 표시하기 293 __11.2.3 이름을 지정해 일부 테스트만 실행하기 295 __11.2.4 특별 요청이 없다면 일부 테스트 무시하기 297 11.3 테스트 조직화 299 __11.3.1 유닛 테스트 299 __11.3.2 통합 테스트 301 정리 306 CHAPTER 12 I/O 프로젝트: 커맨드 라인 프로그램 만들기 307 12.1 커맨드 라인 인수 받기 308 __12.1.1 인수 읽기 309 __12.1.2 인수들을 변수에 저장하기 311 12.2 파일 읽기 312 12.3 모듈성과 에러 처리 향상을 위한 리팩터링 313 __12.3.1 바이너리 프로젝트에 대한 관심사 분리 314 __12.3.2 에러 처리 수정 319 __12.3.3 main으로부터 로직 추출하기 323 __12.3.4 라이브러리 크레이트로 코드 쪼개기 326 12.4 테스트 주도 개발로 라이브러리 기능 개발하기 328 __12.4.1 실패하는 테스트 작성하기 328 __12.4.2 테스트를 통과하도록 코드 작성하기 331 12.5 환경 변수 사용하기 334 __12.5.1 대소문자를 구분하지 않는 search 함수에 대한 실패하는 테스트 작성하기 335 __12.5.2 search_case_insensitive 함수 구현하기 336 12.6 표준 출력 대신 표준 에러로 에러 메시지 작성하기 341 __12.6.1 에러가 기록되었는지 검사하기 341 __12.6.2 표준 에러로 에러 출력하기 342 정리 343 CHAPTER 13 함수형 언어의 특성: 반복자와 클로저 345 13.1 클로저: 자신의 환경을 캡처하는 익명 함수 346 __13.1.1 클로저로 환경 캡처하기 346 __13.1.2 클로저 타입 추론과 명시 348 __13.1.3 참조자를 캡처하거나 소유권 이동하기 351 __13.1.4 캡처된 값을 클로저 밖으로 이동하기와 Fn 트레이트 353 13.2 반복자로 일련의 아이템 처리하기 358 __13.2.1 Iterator 트레이트와 next 메서드 359 __13.2.2 반복자를 소비하는 메서드 361 __13.2.3 다른 반복자를 생성하는 메서드 361 __13.2.4 환경을 캡처하는 클로저 사용하기 363 13.3 I/O 프로젝트 개선하기 365 __13.3.1 반복자를 사용하여 clone 제거하기 365 __13.3.2 반복자 어댑터로 더 간결한 코드 만들기 368 __13.3.3 루프와 반복자 중 선택하기 369 13.4 성능 비교하기: 루프 vs. 반복자 370 정리 372 CHAPTER 14 카고와 crates.io 더 알아보기 373 14.1 릴리스 프로필을 통한 빌드 커스터마이징하기 374 14.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에서 버전 사용하지 않게 하기 387 14.3 카고 작업 공간 388 __14.3.1 작업 공간 생성하기 388 __14.3.2 작업 공간에 두 번째 패키지 생성하기 390 14.4 cargo install로 crates.io에 있는 바이너리 설치하기 395 14.5 커스텀 명령어로 카고 확장하기 396 정리 397 CHAPTER 15 스마트 포인터 399 15.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 역참조 강제가 가변성과 상호작용하는 법 414 15.3 Drop 트레이트로 메모리 정리 코드 실행하기 415 __15.3.1 std::mem::drop으로 값을 일찍 버리기 417 15.4 Rc〈T〉, 참조 카운트 스마트 포인터 419 __15.4.1 Rc〈T〉를 사용하여 데이터 공유하기 420 __15.4.2 Rc〈T〉를 클론하는 것은 참조 카운트를 증가시킵니다 422 15.5 RefCell〈T〉와 내부 가변성 패턴 424 __15.5.1 RefCell〈T〉으로 런타임에 대여 규칙 집행하기 424 __15.5.2 내부 가변성: 불변값에 대한 가변 대여 425 __15.5.3 Rc〈T〉와 RefCell〈T〉를 조합하여 가변 데이터의 복수 소유자 만들기 433 15.6 순환 참조는 메모리 누수를 발생시킬 수 있습니다 435 __15.6.1 순환 참조 만들기 435 __15.6.2 순환 참조 방지하기: Rc〈T〉를 Weak〈T〉로 바꾸기 439 정리 444 CHAPTER 16 겁 없는 동시성 447 16.1 스레드를 이용하여 코드를 동시에 실행하기 448 __16.1.1 spawn으로 새로운 스레드 생성하기 449 __16.1.2 join 핸들을 사용하여 모든 스레드가 끝날 때까지 기다리기 450 __16.1.3 스레드에 move 클로저 사용하기 453 16.2 메시지 패싱을 사용하여 스레드 간 데이터 전송하기 456 __16.2.1 채널과 소유권 이동 460 __16.2.2 여러 값 보내기와 수신자가 기다리는지 알아보기 461 __16.2.3 송신자를 복제하여 여러 생산자 만들기 462 16.3 공유 상태 동시성 464 __16.3.1 뮤텍스를 사용하여 한 번에 하나의 스레드에서만 데이터 접근을 허용하기 464 __16.3.2 RefCell〈T〉/Rc〈T〉와 Mutex〈T〉/Arc〈T〉 간의 유사성 471 16.4 Sync와 Send 트레이트를 이용한 확장 가능한 동시성 472 __16.4.1 Send를 사용하여 스레드 사이에 소유권 이동을 허용하기 472 __16.4.2 Sync를 사용하여 여러 스레드로부터의 접근을 허용하기 473 __16.4.3 Send와 Sync를 손수 구현하는 것은 안전하지 않습니다 473 정리 474 CHAPTER 17 러스트의 객체 지향 프로그래밍 기능 475 17.1 객체 지향 언어의 특성 476 __17.1.1 객체는 데이터와 동작을 담습니다 476 __17.1.2 상세 구현을 은닉하는 캡슐화 476 __17.1.3 타입 시스템과 코드 공유로서의 상속 478 17.2 트레이트 객체를 사용하여 다른 타입의 값 허용하기 480 __17.2.1 공통된 동작을 위한 트레이트 정의하기 481 __17.2.2 트레이트 구현하기 483 __17.2.3 트레이트 객체는 동적 디스패치를 수행합니다 486 17.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 정리 502 CHAPTER 18 패턴과 매칭 503 18.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 함수 매개변수 509 18.2 반박 가능성: 패턴이 매칭에 실패할지의 여부 510 18.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 정리 530 CHAPTER 19 고급 기능 531 19.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 코드를 사용하는 경우 544 19.2 고급 트레이트 544 __19.2.1 연관 타입으로 트레이트 정의에서 자리표시자 타입 지정하기 544 __19.2.2 기본 제네릭 타입 매개변수와 연산자 오버로딩 546 __19.2.3 모호성 방지를 위한 완전 정규화 문법: 같은 이름의 메서드 호출하기 549 __19.2.4 슈퍼트레이트를 사용하여 한 트레이트에서 다른 트레이트의 기능을 요구하기 553 __19.2.5 뉴타입 패턴을 사용하여 외부 타입에 외부 트레이트 구현하기 556 19.3 고급 타입 557 __19.3.1 타입 안전성과 추상화를 위한 뉴타입 패턴 사용하기 557 __19.3.2 타입 별칭으로 타입의 동의어 만들기 558 __19.3.3 절대 반환하지 않는 부정 타입 561 __19.3.4 동적 크기 타입과 Sized 트레이트 563 19.4 고급 함수와 클로저 565 __19.4.1 함수 포인터 565 __19.4.2 클로저 반환하기 567 19.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 정리 581 CHAPTER 20 최종 프로젝트: 멀티스레드 웹서버 구축하기 583 20.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 리팩터링 596 20.2 싱글스레드 서버를 멀티스레드 서버로 바꾸기 597 __20.2.1 현재의 서버 구현에서 느린 요청 시뮬레이션 597 __20.2.2 스레드 풀로 처리량 개선하기 599 20.3 우아한 종료와 정리 618 __20.3.1 ThreadPool에 대한 Drop 트레이트 구현하기 618 __20.3.2 작업을 기다리는 스레드에게 정지 신호 보내기 621 정리 628 부록 A. 키워드 630 A.1 현재 사용 중인 키워드 630 A.2 미래에 사용하기 위해 예약된 키워드 632 A.3 원시 식별자 632 부록 B. 연산자와 기호 634 B.1 연산자 634 B.2 비연산자 기호 636 부록 C. 파생 가능한 트레이트 640 C.1 프로그래머 출력을 위한 Debug 641 C.2 동등 비교를 위한 PartialEq 및 Eq 641 C.3 순서 비교를 위한 PartialOrd 및 Ord 642 C.4 값을 복제하기 위한 Clone과 Copy 643 C.5 어떤 값을 고정 크기의 값으로 매핑하기 위한 Hash 644 C.6 기본값을 위한 Default 644 부록 D. 유용한 개발 도구 645 D.1 rustfmt로 자동 포매팅하기 645 D.2 rustfix로 코드 수정하기 646 D.3 Clippy로 더 많은 린트 사용하기 647 D.4 rust-analyzer를 사용한 IDE 통합 648 부록 E. 에디션 649 부록 F. 번역본 651 부록 G. 러스트가 만들어지는 과정과 ‘nightly 러스트’ 653 G.1 정체되지 않는 안정성 653 G.2 칙칙폭폭! 릴리스 채널과 기차 타기 653 G.3 불안정한 기능 656 G.4 rustup과 nightly 러스트의 역할 656 G.5 RFC 과정과 팀 657 찾아보기 658 |
Steve Klabnik
Carol Nichols
|
카고는 러스타시안이라면 대부분 사용하는 러스트 빌드 시스템 및 패키지 매니저입니다. 이 도구는 코드 빌드나, 코드 작성에 필요한 외부 라이브러리를 다운로드할 때나, 라이브러리를 제작할 때 겪는 귀찮은 일들을 상당수 줄여주는 편리한 도구입니다(앞으로 외부 라이브러리는 디펜던시(dependency)라고 지칭하겠습니다). / 여태 우리가 작성해본 간단한 러스트 프로그램에는 디펜던시를 추가하지 않았습니다. 카고를 가지고 ‘Hello, world!’ 프로젝트를 만들었다면, 코드 빌드를 처리하는 카고의 기능 일부만을 사용했을 것입니다. 훗날 복잡한 프로그램을 작성하게 되면 디펜던시를 추가하게 될 것이고, 카고를 사용하여 프로젝트를 시작하면 디펜던시를 추가하는 일이 훨씬 더 쉬워질 것입니다.
--- p.9 소유권(ownership)은 러스트 프로그램의 메모리 관리법을 지배하는 규칙 모음입니다. 모든 프로그램은 작동하는 동안 컴퓨터의 메모리 사용 방법을 관리해야 합니다. 몇몇 언어는 가비지 컬렉션으로 프로그램에서 더 이상 사용하지 않는 메모리를 정기적으로 찾는 방식을 채택했고, 다른 언어는 프로그래머가 직접 명시적으로 메모리를 할당하고 해제하는 방식을 택했습니다. 이때 러스트는 제3의 방식을 택했습니다. 소유권이라는 시스템을 만들고, 컴파일러가 컴파일 중에 검사할 여러 규칙을 정해 메모리를 관리하는 방식이지요. 이 규칙 중 하나라도 위반하면 프로그램은 컴파일되지 않습니다. --- p.79~80 예시로, 레스토랑 기능을 제공하는 라이브러리 크레이트를 작성한다고 가정해보죠. 코드 구조에 집중할 수 있도록 실제 코드로 구현하지는 않고, 본문은 비워둔 함수 시그니처만 정의하겠습니다. / 레스토랑 업계에서는 레스토랑을 크게 접객 부서(front of house)와 지원 부서(back of house)로 나눕니다. 접객 부서는 호스트가 고객을 안내하고, 웨이터가 주문 접수 및 결제를 담당하고, 바텐더가 음료를 만들어주는 곳입니다. 지원 부서는 셰프, 요리사, 주방보조가 일하는 주방과 매니저가 행정 업무를 하는 곳입니다. / 중첩(nested) 모듈 안에 함수를 집어넣어 구성하면 크레이트 구조를 실제 레스토랑이 일하는 방식과 동일하게 구성할 수 있습니다. cargo new --lib restaurant 명령어를 실행하여 restaurant라는 새 라이브러리를 생성하고, 예제 7-1 코드를 src/lib.rs에 작성하여 모듈, 함수 시그니처를 정의합시다. 아래는 접객 부서 쪽 코드입니다. --- p.158 함수 시그니처에 라이프타임 매개변수를 지정한다고 해서, 전달되는 값이나 반환값의 라이프타임이 변경되는 건 아니라는 점을 기억해두세요. 어떤 값이 제약 조건을 지키지 않았을 때 대여 검사기가 불합격 판정을 내릴 수 있도록 명시할 뿐입니다. longest 함수는 x와 y가 얼마나 오래 살지 정확히 알 필요는 없고, 이 시그니처를 만족하는 어떤 스코프를 'a로 대체할 수 있다는 점만 알면 됩니다. (…) 라이프타임 명시는 함수 시그니처의 타입들과 마찬가지로 함수에 대한 계약서의 일부가 됩니다. 함수 시그니처가 라이프타임 계약을 가지고 있다는 것은 러스트 컴파일러가 수행하는 분석이 좀 더 단순해질수 있음을 의미합니다. 만일 함수가 명시된 방법이나 함수가 호출된 방법에 문제가 있다면, 컴파일러 에러가 해당 코드의 위치와 제약을 좀 더 정밀하게 짚어낼 수 있습니다. --- p.262 클로저가 정의된 환경으로부터 나중에 사용할 목적으로 값을 캡처하는 방법을 시험해보겠습니다. 종종 우리 티셔츠 회사는 프로모션으로 메일링 리스트에 있는 사람들에게 독점 공급하는 한정판 티셔츠를 증정합니다. 메일링 리스트에 있는 사람들은 추가로 자신의 프로파일에 제일 좋아하는 색상을 추가할 수 있습니다. 만일 무료 티셔츠에 추첨된 사람이 좋아하는 색상을 설정해두었다면, 그 색상의 티셔츠를 받게 됩니다. 좋아하는 색상을 특정하지 않았다면 회사가 현재 제일 많이 가지고 있는 색상을 받게 됩니다. (…) 예제에서는 Red와 Blue 배리언트가 있는 ShirtColor라는 열거형을 이용해보겠습니다. 회사의 재고는 Inventory 구조체로 표현하는데 여기에는 shirts라는 이름의 필드가 있고, 이 필드는 현재 재고에 있는 셔츠 색상을 나타내는 Vec〈ShirtColor〉 타입입니다. Inventory에 정의된 giveaway 메서드는 무료 티셔츠를 타게 된 사람의 추가 색상 설정값을 얻어와서 그 사람이 받게 될 셔츠 색상을 반환합니다. --- p.346 예제 16-1에서 thread::spawn에 전달된 클로저에는 어떤 인수도 없음에 주목하세요. 생성된 스레드의 코드에서는 메인 스레드로부터 온 어떤 데이터도 이용하고 있지 않습니다. 메인 스레드의 데이터를 생성된 스레드에서 사용하기 위해, 생성된 스레드의 클로저는 자신이 필요로 하는 값을 캡처해야 합니다. (…) 클로저가 v를 사용하므로, v는 캡처되어 클로저 환경의 일부가 됩니다. thread::spawn이 이 클로저를 새로운 스레드에서 실행하므로, v는 새로운 스레드 내에서 접근 가능해야 합니다. 하지만 이 예제를 컴파일하면 아래와 같은 에러를 얻게 됩니다. --- p.453~454 |
|
러스타시안 커뮤니티가 직접 만든 RUST 2021 공식 가이드북 ‘The Book’
러스트는 빠르고 안정적인 소프트웨어를 작성할 수 있는 오픈소스 시스템 프로그래밍 언어로서 개발자들의 뜨거운 사랑을 받고 있다. 그리고 러스트 입문에 필요한 단 한 권의 책으로 평가받는, 러스타시안 커뮤니티에서 소위 ‘The Book’으로 불리는 러스트 공식 가이드북의 러스트 2021 버전의 한국어판이 출간되었다. 러스트 코어 팀에 몸담으며 러스트를 누구보다 잘 이해했던 스티브 클라브닉과 캐럴 니컬스는 커뮤니티의 피드백과 함께 러스트를 최대한 활용하는 방법을 온라인 문서로 정리했고, 이를 바탕으로 종이책 《러스트 프로그래밍 공식 가이드》가 출간될 수 있었다. 초판(러스트 2018)에 비해 본 2판(러스트 2021)은 온라인 문서 한국어 번역을 주도한 권지용(rinthel)의 친절한 구어체 텍스트를 바탕으로 했고, 원서 종이책의 오류를 바로잡아 한층 개선된 모습을 보여준다. 책의 1~3장에서는 러스트 및 카고 설치, 기초 프로그래밍 개념을 다루고, 4~9장은 구조체, 열거형, 제어 흐름, 모듈 시스템, 다양한 데이터 구조, 에러 처리를 다룬다. 10~12장에서는 제네릭, 트레이트, 라이프타임, 테스트를 다루고, 커맨드 라인 도구도 하나 만들어본다. 13~15장은 클로저, 카고, 스마트 포인터, 16~19장은 동시성, 객체 지향, 패턴 매칭, ‘안전하지 않은’ 러스트 등 좀 더 심화된 주제를 다룬다. 20장에서는 마지막 프로젝트 예제로 멀티스레드 웹서버를 구현한다. 저수준의 디테일 제어가 가능하면서도 고수준의 인체공학적 설계를 갖춘 러스트를 이해하고 싶다면 이 공식 가이드가 최적의 선택이다. 기본 개념부터 심화 주제까지 모든 내용을, 컴파일러 주도 개발 스타일의 예제와 함께 러스타시안 친화적인 톤으로 일관되게 엮었다. 러스트를 배울 때 책을 딱 한 권만 꼽으라면 왜 이 책이 꼽히는지, 읽어보면 이유를 알 수 있다. 주요 내용 - 함수 생성, 데이터 구조 선택, 변수 바인딩 등 러스트 기본 개념 - 컴파일러와의 소통에 필요한 소유권과 대여, 라이프타임, 제네릭, 트레이트, 트레이트 객체 - 스마트 포인터, 멀티스레딩, 소유권을 결합해 동시성을 구현하는 법 - 내장 패키지 관리자 카고를 사용한 빌드, 문서화, 디펜던시 관리 - 테스트, 에러 처리, 리팩터링, 패턴 매칭을 활용하는 베스트 프랙티스 |
|
초판을 처음부터 끝까지 다 읽은 사람으로서, 이번 제2판은 제 기대에 부응할 뿐만 아니라 그 이상이었습니다! 독자에게 러스트의 모든 개념을 소개하는 데 도움이 되도록 잘 집필되었고, 형식 또한 잘 갖추어져 있습니다. 모든 프로그래머의 서재에 놓일 가치가 충분할 만큼 훌륭한 책입니다. - 재러드 울프 (Jared Wolff, Circuit Dojo 오너)
|
|
이번 제2판은 더욱 개선되고 다듬어졌으면서도 여전히 러스트를 입문하는 데 필요한 ‘단 한 권의’ 책입니다. 입문자이든 숙련된 러스타시안이든 러스트의 작동 원리를 익힐 수 있는 귀중한 리소스입니다. - 마이클 가토치 (Michael Gattozzi, Fastly 수석 소프트웨어 엔지니어)
|
|
러스트의 기본을 마스터하기 위한 훌륭한 리소스입니다. 러스트는 소유권 규칙부터 패턴 매칭에 이르기까지 다양한 기능을 충분히 숙지해야 하는 언어이며, 이 책은 이를 달성하기 위한 훌륭한 도구입니다. 러스트를 진지하게 배울 생각이라면 이 책을 꼭 읽어보세요. - 애덤 바타니언 (Adam Vartanian, Cord 엔지니어링 매니저)
|
|
평결: 추천. - 폴 플로이드 (Paul Floyd, CVu 매거진)
|