러스트 프로그래밍 공식 가이드 : 러스타시안 커뮤니티가 직접 만든 RUST 2021 공식 가이드북 (제2판)
스티브클라브닉,캐롤니콜스
저자:스티브클라브닉(SteveKlabnik)
모질라의러스트커뮤니티팀리더로서공식적인러스트커뮤니티문서를담당하고있고신뢰받는러스트커뮤니티애드버킷이기도하다.콘퍼런스에발표자로자주참가하며,루비온레일즈프로젝트의최다기여자중한명이다.
저자:캐럴니컬스(CarolNichols)
러스트커뮤니티팀의멤버이고,이전에는러스트코어팀의멤버였다.루비커뮤니티에서도활발히활동중이며,2012~2014년스틸시티루비콘퍼런스의핵심주최자였다.
역자:권지용
넥슨코리아개발자.연세대학교컴퓨터과학과에서컴퓨터그래픽스로박사학위를받은후,수원대학교정보미디어학과에서조교수로,그리고단국대학교영화콘텐츠전문대학원에서연구교수로잠시재직했다.이후실시간비디오처리관련스타트업에서8년간CTO로일했다.캐릭터애니메이션,3D그래픽스,컴퓨터비전,이미지/비디오처리기술에관심이있고,최근에는생성AI에도흥미를느끼고있다.보고듣는모든콘텐츠를사랑하며,(이제는손가락이안따라가지만)오래전부터리듬게임을플레이했다.고양이를좋아한다.
지은이·감수자·옮긴이소개xvi
옮긴이머리말xvii
베타리더후기xix
추천사xxi
추천서문xxii
서문xxiv
감사의글xxv
이책에대하여xxvi
CHAPTER1시작해봅시다1
1.1러스트설치1
__1.1.1rustup설치(리눅스및macOS)2
__1.1.2rustup설치(윈도우)3
__1.1.3트러블슈팅3
__1.1.4업데이트및삭제4
__1.1.5로컬문서4
1.2Hello,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
CHAPTER2추리게임17
2.1새로운프로젝트준비하기18
2.2추릿값처리하기19
__2.2.1변수에값저장하기20
__2.2.2사용자입력받기21
__2.2.3Result타입으로잠재적실패다루기22
__2.2.4println!자리표시자를이용한값출력하기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
CHAPTER3일반적인프로그래밍개념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.1if표현식66
__3.5.2반복문을이용한반복71
정리76
CHAPTER4소유권이해하기79
4.1소유권이뭔가요?79
__4.1.1소유권규칙81
__4.1.2변수의스코프81
__4.1.3String타입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
CHAPTER5구조체로연관된데이터구조화하기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
CHAPTER6열거형과패턴매칭133
6.1열거형정의하기133
__6.1.1열거형값134
__6.1.2Option열거형이널값보다좋은점들139
6.2match제어흐름구조142
__6.2.1값을바인딩하는패턴144
__6.2.2Option를이용하는매칭145
__6.2.3match는철저합니다147
__6.2.4포괄패턴과_자리표시자148
6.3iflet을사용한간결한제어흐름150
정리152
CHAPTER7커져가는프로젝트를패키지,크레이트,모듈로관리하기153
7.1패키지와크레이트154
7.2모듈을정의하여스코프및공개여부제어하기158
7.3경로를사용하여모듈트리의아이템참조하기160
__7.3.1pub키워드로경로노출하기163
__7.3.2super로시작하는상대경로166
__7.3.3구조체,열거형을공개하기167
7.4use키워드로경로를스코프안으로가져오기169
__7.4.1보편적인use경로작성법171
__7.4.2as키워드로새로운이름제공하기173
__7.4.3pubuse로다시내보내기173
__7.4.4외부패키지사용하기174
__7.4.5중첩경로를사용하여대량의use나열을정리하기175
__7.4.6글롭연산자176
7.5별개의파일로모듈분리하기177
정리179
CHAPTER8일반적인컬렉션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
CHAPTER9에러처리207
9.1panic!으로복구불가능한에러처리하기208
__9.1.1panic!백트레이스이용하기209
9.2Result로복구가능한에러처리하기212
__9.2.1서로다른에러에대해매칭하기214
__9.2.2에러전파하기217
9.3panic!이냐,panic!이아니냐,그것이문제로다224
__9.3.1예제,프로토타입코드,그리고테스트225
__9.3.2여러분이컴파일러보다더많은정보를가지고있을때225
__9.3.3에러처리를위한가이드라인226
__9.3.4유효성을위한커스텀타입생성하기228
정리230
CHAPTER10제네릭타입,트레이트,라이프타임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
CHAPTER11자동화테스트작성하기273
11.1테스트작성방법274
__11.1.1테스트함수파헤치기274
__11.1.2assert!매크로로결과검사하기279
__11.1.3assert_eq!,assert_ne!매크로를이용한동등테스트282
__11.1.4커스텀실패메시지추가하기285
__11.1.5should_panic매크로로패닉발생검사하기287
__11.1.6Result를이용한테스트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
CHAPTER12I/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.3main으로부터로직추출하기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.2search_case_insensitive함수구현하기336
12.6표준출력대신표준에러로에러메시지작성하기341
__12.6.1에러가기록되었는지검사하기341
__12.6.2표준에러로에러출력하기342
정리343
CHAPTER13함수형언어의특성:반복자와클로저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.1Iterator트레이트와next메서드359
__13.2.2반복자를소비하는메서드361
__13.2.3다른반복자를생성하는메서드361
__13.2.4환경을캡처하는클로저사용하기363
13.3I/O프로젝트개선하기365
__13.3.1반복자를사용하여clone제거하기365
__13.3.2반복자어댑터로더간결한코드만들기368
__13.3.3루프와반복자중선택하기369
13.4성능비교하기:루프vs.반복자370
정리372
CHAPTER14카고와crates.io더알아보기373
14.1릴리스프로필을통한빌드커스터마이징하기374
14.2crates.io에크레이트배포하기375
__14.2.1유용한문서화주석만들기375
__14.2.2pubuse로편리하게공개API내보내기379
__14.2.3crates.io계정설정하기384
__14.2.4새크레이트에메타데이터추가하기384
__14.2.5crates.io에배포하기386
__14.2.6이미존재하는크레이트의새버전배포하기387
__14.2.7cargoyank로crates.io에서버전사용하지않게하기387
14.3카고작업공간388
__14.3.1작업공간생성하기388
__14.3.2작업공간에두번째패키지생성하기390
14.4cargoinstall로crates.io에있는바이너리설치하기395
14.5커스텀명령어로카고확장하기396
정리397
CHAPTER15스마트포인터399
15.1Box를사용하여힙에있는데이터가리키기401
__15.1.1Box를사용하여힙에데이터저장하기
15.2Deref트레이트로스마트포인터를보통의참조자처럼취급하기407
__15.2.1포인터를따라가서값얻기408
__15.2.2Box를참조자처럼사용하기409
__15.2.3자체스마트포인터정의하기409
__15.2.4Deref트레이트를구현하여임의의타입을참조자처럼다루기411
__15.2.5함수와메서드를이용한암묵적역참조강제412
__15.2.6역참조강제가가변성과상호작용하는법414
15.3Drop트레이트로메모리정리코드실행하기415
__15.3.1std::mem::drop으로값을일찍버리기417
15.4Rc,참조카운트스마트포인터419
__15.4.1Rc를사용하여데이터공유하기420
__15.4.2Rc를클론하는것은참조카운트를증가시킵니다422
15.5RefCell와내부가변성패턴424
__15.5.1RefCell으로런타임에대여규칙집행하기424
__15.5.2내부가변성:불변값에대한가변대여425
__15.5.3Rc와RefCell를조합하여가변데이터의복수소유자만들기433
15.6순환참조는메모리누수를발생시킬수있습니다435
__15.6.1순환참조만들기435
__15.6.2순환참조방지하기:Rc를Weak로바꾸기439
정리444
CHAPTER16겁없는동시성447
16.1스레드를이용하여코드를동시에실행하기448
__16.1.1spawn으로새로운스레드생성하기449
__16.1.2join핸들을사용하여모든스레드가끝날때까지기다리기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.2RefCell/Rc와Mutex/Arc간의유사성471
16.4Sync와Send트레이트를이용한확장가능한동시성472
__16.4.1Send를사용하여스레드사이에소유권이동을허용하기472
__16.4.2Sync를사용하여여러스레드로부터의접근을허용하기473
__16.4.3Send와Sync를손수구현하는것은안전하지않습니다473
정리474
CHAPTER17러스트의객체지향프로그래밍기능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.1Post를정의하고초안상태의새인스턴스생성하기489
__17.3.2게시물콘텐츠의텍스트저장하기490
__17.3.3초안게시물의내용이비어있음을보장하기491
__17.3.4게시물에대한검토요청이게시물의상태를변경합니다491
__17.3.5content의동작을변경하는approve메서드추가하기493
__17.3.6상태패턴의장단점496
정리502
CHAPTER18패턴과매칭503
18.1패턴이사용될수있는모든곳504
__18.1.1match갈래504
__18.1.2iflet조건표현식505
__18.1.3whilelet조건루프506
__18.1.4for루프507
__18.1.5let구문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
CHAPTER19고급기능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.7unsafe코드를사용하는경우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
CHAPTER20최종프로젝트:멀티스레드웹서버구축하기583
20.1싱글스레드웹서버구축하기584
__20.1.1TCP연결수신대기하기585
__20.1.2요청읽기587
__20.1.3HTTP요청자세히살펴보기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.1ThreadPool에대한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프로그래머출력을위한Debug641
C.2동등비교를위한PartialEq및Eq641
C.3순서비교를위한PartialOrd및Ord642
C.4값을복제하기위한Clone과Copy643
C.5어떤값을고정크기의값으로매핑하기위한Hash644
C.6기본값을위한Default644
부록D.유용한개발도구645
D.1rustfmt로자동포매팅하기645
D.2rustfix로코드수정하기646
D.3Clippy로더많은린트사용하기647
D.4rust-analyzer를사용한IDE통합648
부록E.에디션649
부록F.번역본651
부록G.러스트가만들어지는과정과‘nightly러스트’653
G.1정체되지않는안정성653
G.2칙칙폭폭!릴리스채널과기차타기653
G.3불안정한기능656
G.4rustup과nightly러스트의역할656
G.5RFC과정과팀657
찾아보기658
러스타시안커뮤니티가직접만든RUST2021공식가이드북‘TheBook’
러스트는빠르고안정적인소프트웨어를작성할수있는오픈소스시스템프로그래밍언어로서개발자들의뜨거운사랑을받고있다.그리고러스트입문에필요한단한권의책으로평가받는,러스타시안커뮤니티에서소위‘TheBook’으로불리는러스트공식가이드북의러스트2021버전의한국어판이출간되었다.러스트코어팀에몸담으며러스트를누구보다잘이해했던스티브클라브닉과캐럴니컬스는커뮤니티의피드백과함께러스트를최대한활용하는방법을온라인문서로정리했고,이를바탕으로종이책《러스트프로그래밍공식가이드》가출간될수있었다.초판(러스트2018)에비해본2판(러스트2021)은온라인문서한국어번역을주도한권지용(rinthel)의친절한구어체텍스트를바탕으로했고,원서종이책의오류를바로잡아한층개선된모습을보여준다.
책의1~3장에서는러스트및카고설치,기초프로그래밍개념을다루고,4~9장은구조체,열거형,제어흐름,모듈시스템,다양한데이터구조,에러처리를다룬다.10~12장에서는제네릭,트레이트,라이프타임,테스트를다루고,커맨드라인도구도하나만들어본다.13~15장은클로저,카고,스마트포인터,16~19장은동시성,객체지향,패턴매칭,‘안전하지않은’러스트등좀더심화된주제를다룬다.20장에서는마지막프로젝트예제로멀티스레드웹서버를구현한다.저수준의디테일제어가가능하면서도고수준의인체공학적설계를갖춘러스트를이해하고싶다면이공식가이드가최적의선택이다.기본개념부터심화주제까지모든내용을,컴파일러주도개발스타일의예제와함께러스타시안친화적인톤으로일관되게엮었다.러스트를배울때책을딱한권만꼽으라면왜이책이꼽히는지,읽어보면이유를알수있다.
주요내용
-함수생성,데이터구조선택,변수바인딩등러스트기본개념
-컴파일러와의소통에필요한소유권과대여,라이프타임,제네릭,트레이트,트레이트객체
-스마트포인터,멀티스레딩,소유권을결합해동시성을구현하는법
-내장패키지관리자카고를사용한빌드,문서화,디펜던시관리
-테스트,에러처리,리팩터링,패턴매칭을활용하는베스트프랙티스