diff --git a/ch11-02-running-tests.html b/ch11-02-running-tests.html index 83ff566843..126aeca776 100644 --- a/ch11-02-running-tests.html +++ b/ch11-02-running-tests.html @@ -200,7 +200,7 @@
만일 여러분이 테스트들을 병렬적으로 실행하고 싶지 않을 경우, 혹은 여러분이 사용되는 스레드의 개수에
-대한 더 정밀한 제어를 하고 싶을 경우, 여러분은 --test-threads
플리그와 테스트 바이너리에서
+대한 더 정밀한 제어를 하고 싶을 경우, 여러분은 --test-threads
플래그 테스트 바이너리에서
사용하고 싶은 스레드 개수를 넘길 수 있습니다. 다음 예제를 봅시다:
$ cargo test -- --test-threads=1
diff --git a/print.html b/print.html
index ebfaf1989e..96ec23ef09 100644
--- a/print.html
+++ b/print.html
@@ -8945,7 +8945,7 @@ 만일 여러분이 테스트들을 병렬적으로 실행하고 싶지 않을 경우, 혹은 여러분이 사용되는 스레드의 개수에
-대한 더 정밀한 제어를 하고 싶을 경우, 여러분은 --test-threads
플리그와 테스트 바이너리에서
+대한 더 정밀한 제어를 하고 싶을 경우, 여러분은 --test-threads
플래그 테스트 바이너리에서
사용하고 싶은 스레드 개수를 넘길 수 있습니다. 다음 예제를 봅시다:
$ cargo test -- --test-threads=1
diff --git a/searchindex.js b/searchindex.js
index 99dce8d697..756fd3cd4c 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Object.assign(window.search, {"doc_urls":["foreword.html#들어가기에-앞서","ch00-00-introduction.html#소개","ch00-00-introduction.html#러스트는-누구를-위한-것인가요","ch00-00-introduction.html#개발자-팀","ch00-00-introduction.html#학생","ch00-00-introduction.html#회사","ch00-00-introduction.html#오픈-소스-개발자","ch00-00-introduction.html#속도와-안정성을-소중하게-생각하는-사람","ch00-00-introduction.html#이-책은-누구를-위한-것인가요","ch00-00-introduction.html#이-책을-이용하는-방법","ch00-00-introduction.html#소스-코드","ch01-00-getting-started.html#시작하기","ch01-01-installation.html#설치하기","ch01-01-installation.html#커맨드-라인-표기법","ch01-01-installation.html#linux와-macos에서-rustup-설치하기","ch01-01-installation.html#windows에서-rustup-설치하기","ch01-01-installation.html#rustup-없이-커스텀-설치하기","ch01-01-installation.html#업데이트-및-설치-제거하기","ch01-01-installation.html#문제-해결하기","ch01-01-installation.html#로컬-문서","ch01-02-hello-world.html#hello-world","ch01-02-hello-world.html#프로젝트-디렉토리-만들기","ch01-02-hello-world.html#러스트-프로그램을-작성하고-실행하기","ch01-02-hello-world.html#러스트-프로그램-해부하기","ch01-02-hello-world.html#컴파일과-실행은-개별적인-단계입니다","ch01-03-hello-cargo.html#hello-cargo","ch01-03-hello-cargo.html#cargo를-사용하여-프로젝트-생성하기","ch01-03-hello-cargo.html#cargo-프로젝트를-빌드하고-실행하기","ch01-03-hello-cargo.html#릴리즈-빌드","ch01-03-hello-cargo.html#관례로서의-cargo","ch01-03-hello-cargo.html#정리","ch02-00-guessing-game-tutorial.html#추리-게임","ch02-00-guessing-game-tutorial.html#새로운-프로젝트를-준비하기","ch02-00-guessing-game-tutorial.html#추리값을-처리하기","ch02-00-guessing-game-tutorial.html#값을-변수에-저장하기","ch02-00-guessing-game-tutorial.html#result-타입으로-잠재된-실패-다루기","ch02-00-guessing-game-tutorial.html#println-변경자placeholder를-이용한-값-출력","ch02-00-guessing-game-tutorial.html#첫번째-부분을-테스트하기","ch02-00-guessing-game-tutorial.html#비밀번호를-생성하기","ch02-00-guessing-game-tutorial.html#크레이트crate를-사용하여-더-많은-기능-가져오기","ch02-00-guessing-game-tutorial.html#임의의-숫자를-생성하기","ch02-00-guessing-game-tutorial.html#비밀번호와-추리값을-비교하기","ch02-00-guessing-game-tutorial.html#반복문을-이용하여-여러-번의-추리-허용","ch02-00-guessing-game-tutorial.html#정답-이후에-종료하기","ch02-00-guessing-game-tutorial.html#잘못된-입력값-처리하기","ch02-00-guessing-game-tutorial.html#요약","ch03-00-common-programming-concepts.html#보편적인-프로그래밍-개념","ch03-00-common-programming-concepts.html#keywords","ch03-01-variables-and-mutability.html#변수와-가변성","ch03-01-variables-and-mutability.html#변수와-상수-간의-차이점들","ch03-01-variables-and-mutability.html#shadowing","ch03-02-data-types.html#데이터-타입들","ch03-02-data-types.html#스칼라-타입들","ch03-02-data-types.html#복합-타입들","ch03-03-how-functions-work.html#함수-동작-원리","ch03-03-how-functions-work.html#함수-매개변수","ch03-03-how-functions-work.html#함수-본문","ch03-03-how-functions-work.html#구문과-표현식","ch03-03-how-functions-work.html#반환-값을-갖는-함수","ch03-04-comments.html#주석","ch03-05-control-flow.html#제어문","ch03-05-control-flow.html#if표현식","ch03-05-control-flow.html#반복문과-반복","ch03-05-control-flow.html#결론","ch04-00-understanding-ownership.html#소유권-이해하기","ch04-01-what-is-ownership.html#소유권이-뭔가요","ch04-01-what-is-ownership.html#스택과-힙","ch04-01-what-is-ownership.html#소유권-규칙","ch04-01-what-is-ownership.html#변수의-스코프","ch04-01-what-is-ownership.html#string-타입","ch04-01-what-is-ownership.html#메모리와-할당","ch04-01-what-is-ownership.html#소유권과-함수","ch04-01-what-is-ownership.html#반환-값과-스코프","ch04-02-references-and-borrowing.html#참조자references와-빌림borrowing","ch04-02-references-and-borrowing.html#가변-참조자mutable-references","ch04-02-references-and-borrowing.html#댕글링-참조자dangling-references","ch04-02-references-and-borrowing.html#참조자의-규칙","ch04-03-slices.html#슬라이스slices","ch04-03-slices.html#스트링-슬라이스","ch04-03-slices.html#그-밖의-슬라이스들","ch04-03-slices.html#정리","ch05-00-structs.html#연관된-데이터들을-구조체로-다루기","ch05-01-defining-structs.html#구조체를-정의하고-초기화하기","ch05-01-defining-structs.html#변수명이-필드명과-같을-때-간단하게-필드-초기화하기","ch05-01-defining-structs.html#구조체-갱신법을-이용하여-기존-구조체-인스턴스로-새-구조체-인스턴스-생성하기","ch05-01-defining-structs.html#이름이-없고-필드마다-타입은-다르게-정의-가능한-튜플-구조체","ch05-01-defining-structs.html#필드가-없는-유사-유닛-구조체","ch05-01-defining-structs.html#구조체-데이터의-소유권ownership","ch05-02-example-structs.html#구조체를-이용한-예제-프로그램","ch05-02-example-structs.html#튜플을-이용한-리팩터링","ch05-02-example-structs.html#구조체를-이용한-리팩터링-의미를-더-추가하기","ch05-02-example-structs.html#파생-트레잇derived-trait으로-유용한-기능-추가하기","ch05-03-method-syntax.html#메소드-문법","ch05-03-method-syntax.html#메소드-정의하기","ch05-03-method-syntax.html#--연산자는-어디로-갔나요","ch05-03-method-syntax.html#더-많은-파라미터를-가진-메소드","ch05-03-method-syntax.html#연관-함수","ch05-03-method-syntax.html#정리","ch06-00-enums.html#열거형과-패턴-매칭","ch06-01-defining-an-enum.html#열거형-정의하기","ch06-01-defining-an-enum.html#열거형-값","ch06-01-defining-an-enum.html#option-열거형과-null-값-보다-좋은-점들","ch06-02-match.html#match-흐름-제어-연산자","ch06-02-match.html#값들을-바인딩하는-패턴들","ch06-02-match.html#option를-이용하는-매칭","ch06-02-match.html#매치는-하나도-빠뜨리지-않습니다","ch06-02-match.html#_-변경자placeholder","ch06-03-if-let.html#if-let을-사용한-간결한-흐름-제어","ch06-03-if-let.html#정리","ch07-00-modules.html#모듈을-사용하여-코드를-재사용하고-조직화하기","ch07-01-mod-and-the-filesystem.html#mod와-파일-시스템","ch07-01-mod-and-the-filesystem.html#모듈-정의","ch07-01-mod-and-the-filesystem.html#모듈을-다른-파일로-옮기기","ch07-01-mod-and-the-filesystem.html#모듈-파일-시스템의-규칙","ch07-02-controlling-visibility-with-pub.html#pub으로-가시성visibility-제어하기","ch07-02-controlling-visibility-with-pub.html#함수를-공개로-만들기","ch07-02-controlling-visibility-with-pub.html#비공개-규칙privacy-rules","ch07-02-controlling-visibility-with-pub.html#비공개-예제privacy-examples","ch07-03-importing-names-with-use.html#이름-가져오기-importing-names","ch07-03-importing-names-with-use.html#use를-이용한-간결한-가져오기","ch07-03-importing-names-with-use.html#를-이용한-모두glob-가져오기","ch07-03-importing-names-with-use.html#super를-사용하여-부모-모듈에-접근하기","ch07-03-importing-names-with-use.html#정리","ch08-00-common-collections.html#일반적인-컬렉션","ch08-01-vectors.html#벡터","ch08-01-vectors.html#새-벡터-만들기","ch08-01-vectors.html#벡터-갱신하기","ch08-01-vectors.html#벡터를-드롭하는-것은-벡터의-요소들을-드롭시킵니다","ch08-01-vectors.html#벡터의-요소들-읽기","ch08-01-vectors.html#벡터-내의-값들에-대한-반복처리","ch08-01-vectors.html#열거형을-사용하여-여러-타입을-저장하기","ch08-02-strings.html#스트링","ch08-02-strings.html#스트링이-뭔가요","ch08-02-strings.html#새로운-스트링-생성하기","ch08-02-strings.html#스트링-갱신하기","ch08-02-strings.html#스트링-내부의-인덱싱","ch08-02-strings.html#스트링-슬라이싱하기","ch08-02-strings.html#스트링-내에서-반복적으로-실행되는-메소드","ch08-02-strings.html#스트링은-그렇게-단순하지-않습니다","ch08-03-hash-maps.html#해쉬맵hash-map","ch08-03-hash-maps.html#새로운-해쉬맵-생성하기","ch08-03-hash-maps.html#해쉬맵과-소유권","ch08-03-hash-maps.html#해쉬맵-내의-값-접근하기","ch08-03-hash-maps.html#해쉬맵-갱신하기","ch08-03-hash-maps.html#해쉬-함수","ch08-03-hash-maps.html#정리","ch09-00-error-handling.html#에러-처리","ch09-01-unrecoverable-errors-with-panic.html#panic과-함께하는-복구-불가능한-에러","ch09-01-unrecoverable-errors-with-panic.html#panic에-응하여-스택을-되감거나-그만두기","ch09-01-unrecoverable-errors-with-panic.html#panic-백트레이스-사용하기","ch09-02-recoverable-errors-with-result.html#result와-함께하는-복구-가능한-에러","ch09-02-recoverable-errors-with-result.html#서로-다른-에러에-대해-매칭하기","ch09-02-recoverable-errors-with-result.html#에러가-났을-때-패닉을-위한-숏컷-unwrap과-expect","ch09-02-recoverable-errors-with-result.html#에러-전파하기","ch09-02-recoverable-errors-with-result.html#에러를-전파하기-위한-숏컷-","ch09-02-recoverable-errors-with-result.html#는-result를-반환하는-함수에서만-사용될-수-있습니다","ch09-03-to-panic-or-not-to-panic.html#panic이냐-panic이-아니냐-그것이-문제로다","ch09-03-to-panic-or-not-to-panic.html#예제-프로토타입-코드-그리고-테스트는-전부-패닉을-일으켜도-완전-괜찮은-곳입니다","ch09-03-to-panic-or-not-to-panic.html#컴파일러보다-여러분이-더-많은-정보를-가지고-있을-때","ch09-03-to-panic-or-not-to-panic.html#에러-처리를-위한-가이드라인","ch09-03-to-panic-or-not-to-panic.html#유효성을-위한-커스텀-타입-생성하기","ch09-03-to-panic-or-not-to-panic.html#정리","ch10-00-generics.html#제네릭-타입-트레잇-그리고-라이프타임","ch10-00-generics.html#함수를-추출하여-중복-없애기","ch10-01-syntax.html#제네릭-데이터-타입","ch10-01-syntax.html#함수-정의-내에서-제네릭-데이터-타입을-이용하기","ch10-01-syntax.html#구조체-정의-내에서-제네릭-데이터-타입-사용하기","ch10-01-syntax.html#열거형-정의-내에서-제네릭-데이터-타입-사용하기","ch10-01-syntax.html#메소드-정의-내에서-제네릭-데이터-타입-사용하기","ch10-01-syntax.html#제네릭을-이용한-코드의-성능","ch10-02-traits.html#트레잇-공유-동작을-정의하기","ch10-02-traits.html#트레잇-정의하기","ch10-02-traits.html#특정-타입에-대한-트레잇-구현하기","ch10-02-traits.html#기본-구현","ch10-02-traits.html#트레잇-바운드","ch10-02-traits.html#트레잇-바운드를-사용하여-largest-함수-고치기","ch10-03-lifetime-syntax.html#라이프타임을-이용한-참조자-유효화","ch10-03-lifetime-syntax.html#라이프타임은-댕글링-참조자를-방지합니다","ch10-03-lifetime-syntax.html#함수에서의-제네릭-라이프타임","ch10-03-lifetime-syntax.html#라이프타임-명시-문법","ch10-03-lifetime-syntax.html#함수-시그니처-내의-라이프타임-명시","ch10-03-lifetime-syntax.html#라이프타임의-측면에서-생각하기","ch10-03-lifetime-syntax.html#구조체-정의-상에서의-라이프타임-명시","ch10-03-lifetime-syntax.html#라이프타임-생략","ch10-03-lifetime-syntax.html#메소드-정의-내에서의-라이프타임-명시","ch10-03-lifetime-syntax.html#정적-라이프타임static-lifetime","ch10-03-lifetime-syntax.html#제네릭-타입-파라미터-트레잇-바운드-라이프타임을-함께-써보기","ch10-03-lifetime-syntax.html#정리","ch11-00-testing.html#자동화된-테스트-작성하기","ch11-01-writing-tests.html#테스트를-작성하는-방법","ch11-01-writing-tests.html#테스트-함수의-해부","ch11-01-writing-tests.html#assert-매크로를-이용하여-결과-확인하기","ch11-01-writing-tests.html#aseert_eq와-assert_ne를-이용한-동치equality-테스트","ch11-01-writing-tests.html#커스텀-실패-메세지-추가하기","ch11-01-writing-tests.html#should_panic을-이용한-패닉에-대한-체크","ch11-02-running-tests.html#테스트의-실행-방식-제어하기","ch11-02-running-tests.html#테스트를-병렬-혹은-연속으로-실행하기","ch11-02-running-tests.html#함수-결과-보여주기","ch11-02-running-tests.html#이름으로-테스트의-일부분만-실행하기","ch11-02-running-tests.html#특별한-요청이-없는-한-몇몇-테스트들-무시하기","ch11-03-test-organization.html#테스트-조직화","ch11-03-test-organization.html#단위-테스트","ch11-03-test-organization.html#통합-테스트","ch11-03-test-organization.html#정리","ch12-00-an-io-project.html#io-프로젝트-커맨드-라인-프로그램-만들기","ch12-01-accepting-command-line-arguments.html#커맨드라인-인자-허용하기","ch12-01-accepting-command-line-arguments.html#인자값-읽어들이기","ch12-01-accepting-command-line-arguments.html#변수에-인자-값들-저장하기","ch12-02-reading-a-file.html#파일-읽기","ch12-03-improving-error-handling-and-modularity.html#모듈성과-에러처리의-향상을-위한-리팩토링","ch12-03-improving-error-handling-and-modularity.html#바이너리-프로젝트를-위한-관심사의-분리","ch12-03-improving-error-handling-and-modularity.html#인자-파서의-추출","ch12-03-improving-error-handling-and-modularity.html#clone-사용의-기회비용","ch12-03-improving-error-handling-and-modularity.html#에러-처리-수정하기","ch12-03-improving-error-handling-and-modularity.html#run-함수-추출하기","ch12-03-improving-error-handling-and-modularity.html#라이브러리-크레이트로-코드를-나누기","ch12-04-testing-the-librarys-functionality.html#테스트-주도-개발로-라이브러리의-기능-개발하기","ch12-04-testing-the-librarys-functionality.html#실패-테스트-작성하기","ch12-04-testing-the-librarys-functionality.html#테스트를-통과하는-코드-작성","ch12-05-working-with-environment-variables.html#환경-변수들을-활용하기","ch12-05-working-with-environment-variables.html#대소문자를-구분하는-search-함수의-실패-케이스-작성하기","ch12-05-working-with-environment-variables.html#search_case_insensitive-함수-구현하기","ch12-06-writing-to-stderr-instead-of-stdout.html#표준출력-대신-표준에러로-에러메시지-출력하기","ch12-06-writing-to-stderr-instead-of-stdout.html#에러가-어디에-출력될지-검사","ch12-06-writing-to-stderr-instead-of-stdout.html#에러를-표준에러로-출력하기","ch12-06-writing-to-stderr-instead-of-stdout.html#종합","ch13-00-functional-features.html#함수형-언어의-특성들-반복자들과-클로저들","ch13-01-closures.html#클로저-환경을-캡처할-수-있는-익명-함수","ch13-01-closures.html#클로저로-행위를-추상화-하기","ch13-01-closures.html#클로저-타입-추론과-어노테이션","ch13-01-closures.html#제너릭-파라미터와-fn-트레잇을-사용하여-클로저-저장하기","ch13-01-closures.html#cacher-구현의-제약사항","ch13-01-closures.html#클로저로-환경-캡처-하기","ch13-02-iterators.html#반복자로-일련의-항목들-처리하기","ch13-02-iterators.html#iterator트레잇과-next-메서드","ch13-02-iterators.html#반복자를-소비하는-메서드들","ch13-02-iterators.html#다른-반복자를-생성하는-메서드들","ch13-02-iterators.html#환경을-캡쳐하는-클로저-사용하기","ch13-02-iterators.html#iterator-트레잇으로-자신만의-반복자-만들기","ch13-03-improving-our-io-project.html#io-프로젝트-개선하기","ch13-03-improving-our-io-project.html#반복자를-사용하여-clone-제거하기","ch13-03-improving-our-io-project.html#반복자-어댑터로-더-간결한-코드-만들기","ch13-04-performance.html#성능-비교하기-루프-vs-반복자","ch13-04-performance.html#요약","ch14-00-more-about-cargo.html#cargo-와-cratesio-더-알아보기","ch14-01-release-profiles.html#릴리즈-프로필을-이용해-빌드-커스터마이징하기","ch14-02-publishing-to-crates-io.html#cratesio-에-크레이트-배포하기","ch14-02-publishing-to-crates-io.html#유용한-문서화-주석-만들기","ch14-02-publishing-to-crates-io.html#pub-use-를-이용해-공개-api-를-편리한-형태로-export-하기","ch14-02-publishing-to-crates-io.html#cartesio-계정-설정하기","ch14-02-publishing-to-crates-io.html#새-크레이트에-metadata-추가하기","ch14-02-publishing-to-crates-io.html#cratesio-에-배포하기","ch14-02-publishing-to-crates-io.html#이미-배포한-크레이트의-버전-업데이트하기","ch14-02-publishing-to-crates-io.html#cargo-yank-를-이용해-cratesio-에서-버전-제거하기","ch14-03-cargo-workspaces.html#cargo-작업공간","ch14-03-cargo-workspaces.html#작업공간-생성","ch14-03-cargo-workspaces.html#작업공간에-두번째-크레이트-만들기","ch14-04-installing-binaries.html#cargo-install-을-이용해-cratesio-에서-바이너리-설치하기","ch14-05-extending-cargo.html#커스텀-명령어로-cargo-확장하기","ch14-05-extending-cargo.html#정리","ch15-00-smart-pointers.html#스마트-포인터","ch15-01-box.html#box는-힙에-있는-데이터를-가리키고-알려진-크기를-갖습니다","ch15-01-box.html#box을-사용하여-힙에-데이터를-저장하기","ch15-01-box.html#박스는-재귀적-타입을-가능하게-합니다","ch15-02-deref.html#deref-트레잇을-가지고-스마트-포인터를-평범한-참조자와-같이-취급하기","ch15-02-deref.html#와-함께-포인터를-따라가서-값을-얻기","ch15-02-deref.html#box를-참조자처럼-사용하기","ch15-02-deref.html#우리만의-스마트-포인터-정의하기","ch15-02-deref.html#deref-트레잇을-구현하여-임의의-타입을-참조자처럼-다루기","ch15-02-deref.html#함수와-메소드를-이용한-암묵적-역참조-강제","ch15-02-deref.html#역참조-강제가-가변성과-상호작용-하는-법","ch15-03-drop.html#drop-트레잇은-메모리-정리-코드를-실행시킵니다","ch15-03-drop.html#stdmemdrop을-이용하여-값을-일찍-버리기","ch15-04-rc.html#rc-참조-카운팅-스마트-포인터","ch15-04-rc.html#rc를-사용하여-데이터-공유하기","ch15-04-rc.html#rc의-클론-생성은-참조-카운트를-증가시킵니다","ch15-05-interior-mutability.html#refcell와-내부-가변성-패턴","ch15-05-interior-mutability.html#refcell을-가지고-런타임에-빌림-규칙을-집행하기","ch15-05-interior-mutability.html#내부-가변성-불변값에-대한-가변-빌림","ch15-05-interior-mutability.html#rc와-refcell를-조합하여-가변-데이터의-복수-소유자-만들기","ch15-06-reference-cycles.html#순환-참조는-메모리-릭을-발생시킬-수-있습니다","ch15-06-reference-cycles.html#순환-참조-만들기","ch15-06-reference-cycles.html#참조-순환-방지하기-rc를-weak로-바꾸기","ch15-06-reference-cycles.html#정리","ch16-00-concurrency.html#겁없는-동시성","ch16-01-threads.html#스레드를-이용하여-코드를-동시에-실행하기","ch16-01-threads.html#spawn으로-새로운-스레드-생성하기","ch16-01-threads.html#join-핸들을-사용하여-모든-스레드들이-끝날때까지-기다리기","ch16-01-threads.html#스레드에-move-클로저-사용하기","ch16-02-message-passing.html#메세지-패싱을-사용하여-스레드-간에-데이터-전송하기","ch16-02-message-passing.html#채널과-소유권-전달","ch16-02-message-passing.html#복수의-값들을-보내고-수신자가-기다리는지-보기","ch16-02-message-passing.html#송신자를-복제하여-여러-생성자-만들기","ch16-03-shared-state.html#공유-상태-동시성","ch16-03-shared-state.html#뮤텍스를-사용하여-한번에-한-스레드에서의-데이터-접근을-허용하기","ch16-03-shared-state.html#refcellrc와-mutexarc-간의-유사성","ch16-04-extensible-concurrency-sync-and-send.html#sync와-send-트레잇을-이용한-확장-가능한-동시성","ch16-04-extensible-concurrency-sync-and-send.html#send를-사용하여-스레드-사이에-소유권-이전을-허용하기","ch16-04-extensible-concurrency-sync-and-send.html#sync를-사용하여-여러-스레드로부터의-접근을-허용하기","ch16-04-extensible-concurrency-sync-and-send.html#send와-sync를-손수-구현하는-것은-안전하지-않습니다","ch16-04-extensible-concurrency-sync-and-send.html#정리","ch17-00-oop.html#러스트의-객체-지향-프로그래밍-기능들","ch17-01-what-is-oo.html#객체-지향-언어의-특성","ch17-01-what-is-oo.html#객체는-데이터와-동작을-담습니다","ch17-01-what-is-oo.html#상세-구현을-은닉하는-캡슐화","ch17-01-what-is-oo.html#타입-시스템과-코드-공유로서의-상속","ch17-01-what-is-oo.html#다형성","ch17-02-trait-objects.html#트레잇-객체를-사용하여-다른-타입-간의-값-허용하기","ch17-02-trait-objects.html#공통된-동작을-위한-트레잇-정의하기","ch17-02-trait-objects.html#트레잇-구현하기","ch17-02-trait-objects.html#트레잇-객체는-동적-디스패치를-수행합니다","ch17-02-trait-objects.html#트레잇-객체에-대하여-객체-안전성이-요구됩니다","ch17-03-oo-design-patterns.html#객체-지향-디자인-패턴-구현하기","ch17-03-oo-design-patterns.html#post를-정의하고-초안-상태의-새-인스턴스-생성하기","ch17-03-oo-design-patterns.html#게시물-콘텐츠의-글을-저장하기","ch17-03-oo-design-patterns.html#초안-게시물의-내용이-비어있음을-보장하기","ch17-03-oo-design-patterns.html#게시물에-대한-리뷰-요청이-그의-상태를-변경합니다","ch17-03-oo-design-patterns.html#content의-동작을-변경하는-approve-메소드-추가하기","ch17-03-oo-design-patterns.html#상태-패턴의-기회비용","ch17-03-oo-design-patterns.html#정리","ch18-00-patterns.html#패턴과-매칭","ch18-01-all-the-places-for-patterns.html#패턴이-사용될-수-있는-모든-곳","ch18-01-all-the-places-for-patterns.html#match-갈래","ch18-01-all-the-places-for-patterns.html#if-let-조건-표현","ch18-01-all-the-places-for-patterns.html#while-let-조건-루프","ch18-01-all-the-places-for-patterns.html#for-루프","ch18-01-all-the-places-for-patterns.html#let-구문","ch18-01-all-the-places-for-patterns.html#함수의-매개변수","ch18-02-refutability.html#반증-가능성refutability-패턴이-매칭에-실패할지의-여부","ch18-03-pattern-syntax.html#패턴-문법의-모든-것","ch18-03-pattern-syntax.html#리터럴-매칭","ch18-03-pattern-syntax.html#명명-변수-매칭","ch18-03-pattern-syntax.html#다중-패턴","ch18-03-pattern-syntax.html#-를-이용한-값의-범위-매칭","ch18-03-pattern-syntax.html#값을-해체하여-분리하기","ch18-03-pattern-syntax.html#패턴-내에서-값-무시하기","ch18-03-pattern-syntax.html#ref-와-ref-mut-를-이용해-패턴-내에서-참조자-생성하기","ch18-03-pattern-syntax.html#매치-가드를-이용한-추가-조건","ch18-03-pattern-syntax.html#-바인딩","ch18-03-pattern-syntax.html#정리","ch19-00-advanced-features.html#고급-기능들","ch19-01-unsafe-rust.html#안전하지-않은-러스트","ch19-01-unsafe-rust.html#안전하지-않은-슈퍼파워","ch19-01-unsafe-rust.html#로우-포인터를-역참조하기","ch19-01-unsafe-rust.html#안전하지-않은-함수-혹은-메소드-호출하기","ch19-01-unsafe-rust.html#가변-정적-변수의-접근-혹은-수정하기","ch19-01-unsafe-rust.html#안전하지-않은-트레잇-구현하기","ch19-01-unsafe-rust.html#언제-안전하지-않은-코드를-이용할까요","ch19-02-advanced-lifetimes.html#고급-라이프타임","ch19-02-advanced-lifetimes.html#라이프타임-서브타이핑은-하나의-라이프타임이-다른-것보다-오래-사는-것을-보장합니다","ch19-02-advanced-lifetimes.html#제네릭-타입에-대한-참조자-상의-라이프타임-바운드","ch19-02-advanced-lifetimes.html#트레잇-객체-라이프타임의-추론","ch19-03-advanced-traits.html#고급-트레잇","ch19-03-advanced-traits.html#연관-타입은-트레잇-정의-내에서-플레이스홀더-타입을-명시합니다","ch19-03-advanced-traits.html#기본-제네릭-타입-파라미터와-연산자-오버로딩","ch19-03-advanced-traits.html#모호성-방지를-위한-완전-정규화-fully-qualified-문법-동일한-이름의-메소드-호출하기","ch19-03-advanced-traits.html#슈퍼트레잇-supertrait-을-사용하여-어떤-트레잇-내에서-다른-트레잇의-기능-요구하기","ch19-03-advanced-traits.html#외부-타입에-대해-외부-트레잇을-구현하기-위한-뉴타입-패턴-newtype-pattern","ch19-04-advanced-types.html#고급-타입","ch19-04-advanced-types.html#타입-안전성과-추상화를-위한-뉴타입-패턴-사용하기","ch19-04-advanced-types.html#타입-별칭은-타입의-동의어를-만듭니다","ch19-04-advanced-types.html#결코-반환하지-않는--부정-타입","ch19-04-advanced-types.html#동적인-크기의-타입과-sized","ch19-05-advanced-functions-and-closures.html#고급-함수와-클로저","ch19-05-advanced-functions-and-closures.html#함수-포인터","ch19-05-advanced-functions-and-closures.html#클로저-반환하기","ch19-05-advanced-functions-and-closures.html#정리","ch20-00-final-project-a-web-server.html#마지막-프로젝트-멀티-스레드-웹-서버-만들기","ch20-01-single-threaded.html#싱글스레드-기반-웹-서버-만들기","ch20-01-single-threaded.html#tcp-연결에-대한-처리","ch20-01-single-threaded.html#요청-데이터-읽기","ch20-01-single-threaded.html#http-요청을-자세히-살펴보기","ch20-01-single-threaded.html#응답-작성하기","ch20-01-single-threaded.html#실제-html로-응답하기","ch20-01-single-threaded.html#요청을-확인하고-선택적으로-응답하기","ch20-01-single-threaded.html#리팩토링","ch20-02-multithreaded.html#서버를-싱글-스레드에서-멀티-스레드로-바꾸기","ch20-02-multithreaded.html#현재-서버에서-느린-요청을-시뮬레이팅하기","ch20-02-multithreaded.html#스레드-풀을-이용한-처리량-증진","ch20-03-graceful-shutdown-and-cleanup.html#우아한-종료와-정리","ch20-03-graceful-shutdown-and-cleanup.html#threadpool-에-drop-트레잇-구현하기","ch20-03-graceful-shutdown-and-cleanup.html#스레드가-작업-리스닝을-중지하도록-신호하기","ch20-03-graceful-shutdown-and-cleanup.html#마치며","appendix-00.html#부록","appendix-01-keywords.html#부록-a-키워드","appendix-01-keywords.html#현재-사용되고-있는-키워드","appendix-01-keywords.html#추후-이용하도록-예약된-키워드들","appendix-02-operators.html#부록-b-연산자-및-기호","appendix-02-operators.html#연산자","appendix-02-operators.html#연산자-이외의-기호","appendix-03-derivable-traits.html#부록-c-derive-가능한-트레잇","appendix-03-derivable-traits.html#프로그래머-출력을-위한-debug","appendix-03-derivable-traits.html#동치-비교를-위한-partialeq-와-eq","appendix-03-derivable-traits.html#순서-비교를-위한-partialord-와-ord","appendix-03-derivable-traits.html#값-복제를-위한-clone-와-copy","appendix-03-derivable-traits.html#값을-고정된-크기의-값으로-매핑하기-위한-hash","appendix-03-derivable-traits.html#기본-값을-위한-default","appendix-04-macros.html#부록-d-매크로","appendix-04-macros.html#매크로와-함수의-차이","appendix-04-macros.html#일반적인-메타프로그래밍을-위한-macro_rules-를-사용하는-선언적-매크로","appendix-04-macros.html#커스텀-derive-를-위한-절차적-매크로","appendix-04-macros.html#향후의-매크로","appendix-05-translation.html#부록-e-본-책의-번역본-목록","appendix-06-newest-features.html#부록-f-새로운-기능","appendix-06-newest-features.html#더-짧은-필드-초기화","appendix-06-newest-features.html#loop-에서-반환하기","appendix-06-newest-features.html#중복된-use-선언-합치기","appendix-06-newest-features.html#포괄적인-범위-표현","appendix-06-newest-features.html#128-비트-정수","appendix-07-nightly-rust.html#부록-g-러스트가-만들어지는-과정과-rust-nightly","appendix-07-nightly-rust.html#막힘-없이-안정된-발전-stability-without-stagnation","appendix-07-nightly-rust.html#릴리즈-채널-열차가-달려갑니다","appendix-07-nightly-rust.html#불안정한-기능","appendix-07-nightly-rust.html#rustup-과-rust-nightly-의-역할","appendix-07-nightly-rust.html#rfc-과정과-러스트-rfc-팀","appendix-08-glossary.html#부록-h---번역-용어-정리"],"index":{"documentStore":{"docInfo":{"0":{"body":5,"breadcrumbs":0,"title":0},"1":{"body":0,"breadcrumbs":0,"title":0},"10":{"body":1,"breadcrumbs":0,"title":0},"100":{"body":228,"breadcrumbs":0,"title":0},"101":{"body":117,"breadcrumbs":2,"title":2},"102":{"body":78,"breadcrumbs":2,"title":1},"103":{"body":79,"breadcrumbs":1,"title":0},"104":{"body":69,"breadcrumbs":2,"title":1},"105":{"body":28,"breadcrumbs":1,"title":0},"106":{"body":33,"breadcrumbs":3,"title":2},"107":{"body":99,"breadcrumbs":0,"title":0},"108":{"body":4,"breadcrumbs":0,"title":0},"109":{"body":9,"breadcrumbs":0,"title":0},"11":{"body":6,"breadcrumbs":0,"title":0},"110":{"body":36,"breadcrumbs":2,"title":1},"111":{"body":99,"breadcrumbs":1,"title":0},"112":{"body":303,"breadcrumbs":1,"title":0},"113":{"body":24,"breadcrumbs":1,"title":0},"114":{"body":85,"breadcrumbs":3,"title":2},"115":{"body":117,"breadcrumbs":1,"title":0},"116":{"body":0,"breadcrumbs":3,"title":2},"117":{"body":58,"breadcrumbs":3,"title":2},"118":{"body":22,"breadcrumbs":3,"title":2},"119":{"body":65,"breadcrumbs":2,"title":1},"12":{"body":2,"breadcrumbs":0,"title":0},"120":{"body":18,"breadcrumbs":2,"title":1},"121":{"body":121,"breadcrumbs":2,"title":1},"122":{"body":1,"breadcrumbs":1,"title":0},"123":{"body":10,"breadcrumbs":0,"title":0},"124":{"body":1,"breadcrumbs":0,"title":0},"125":{"body":42,"breadcrumbs":0,"title":0},"126":{"body":19,"breadcrumbs":0,"title":0},"127":{"body":14,"breadcrumbs":0,"title":0},"128":{"body":99,"breadcrumbs":0,"title":0},"129":{"body":28,"breadcrumbs":0,"title":0},"13":{"body":0,"breadcrumbs":0,"title":0},"130":{"body":29,"breadcrumbs":0,"title":0},"131":{"body":7,"breadcrumbs":0,"title":0},"132":{"body":21,"breadcrumbs":0,"title":0},"133":{"body":90,"breadcrumbs":0,"title":0},"134":{"body":171,"breadcrumbs":0,"title":0},"135":{"body":98,"breadcrumbs":0,"title":0},"136":{"body":20,"breadcrumbs":0,"title":0},"137":{"body":22,"breadcrumbs":0,"title":0},"138":{"body":4,"breadcrumbs":0,"title":0},"139":{"body":9,"breadcrumbs":2,"title":2},"14":{"body":23,"breadcrumbs":3,"title":3},"140":{"body":56,"breadcrumbs":0,"title":0},"141":{"body":27,"breadcrumbs":0,"title":0},"142":{"body":44,"breadcrumbs":0,"title":0},"143":{"body":96,"breadcrumbs":0,"title":0},"144":{"body":8,"breadcrumbs":0,"title":0},"145":{"body":23,"breadcrumbs":0,"title":0},"146":{"body":9,"breadcrumbs":0,"title":0},"147":{"body":1,"breadcrumbs":2,"title":1},"148":{"body":60,"breadcrumbs":2,"title":1},"149":{"body":219,"breadcrumbs":2,"title":1},"15":{"body":12,"breadcrumbs":2,"title":2},"150":{"body":156,"breadcrumbs":2,"title":1},"151":{"body":84,"breadcrumbs":1,"title":0},"152":{"body":97,"breadcrumbs":3,"title":2},"153":{"body":90,"breadcrumbs":1,"title":0},"154":{"body":97,"breadcrumbs":1,"title":0},"155":{"body":53,"breadcrumbs":2,"title":1},"156":{"body":8,"breadcrumbs":4,"title":2},"157":{"body":7,"breadcrumbs":2,"title":0},"158":{"body":23,"breadcrumbs":2,"title":0},"159":{"body":15,"breadcrumbs":2,"title":0},"16":{"body":4,"breadcrumbs":1,"title":1},"160":{"body":126,"breadcrumbs":2,"title":0},"161":{"body":7,"breadcrumbs":2,"title":0},"162":{"body":14,"breadcrumbs":0,"title":0},"163":{"body":165,"breadcrumbs":0,"title":0},"164":{"body":0,"breadcrumbs":0,"title":0},"165":{"body":160,"breadcrumbs":0,"title":0},"166":{"body":148,"breadcrumbs":0,"title":0},"167":{"body":39,"breadcrumbs":0,"title":0},"168":{"body":154,"breadcrumbs":0,"title":0},"169":{"body":33,"breadcrumbs":0,"title":0},"17":{"body":7,"breadcrumbs":0,"title":0},"170":{"body":4,"breadcrumbs":0,"title":0},"171":{"body":30,"breadcrumbs":0,"title":0},"172":{"body":173,"breadcrumbs":0,"title":0},"173":{"body":139,"breadcrumbs":0,"title":0},"174":{"body":72,"breadcrumbs":0,"title":0},"175":{"body":173,"breadcrumbs":1,"title":1},"176":{"body":3,"breadcrumbs":0,"title":0},"177":{"body":106,"breadcrumbs":0,"title":0},"178":{"body":90,"breadcrumbs":0,"title":0},"179":{"body":21,"breadcrumbs":0,"title":0},"18":{"body":17,"breadcrumbs":0,"title":0},"180":{"body":153,"breadcrumbs":0,"title":0},"181":{"body":63,"breadcrumbs":0,"title":0},"182":{"body":33,"breadcrumbs":0,"title":0},"183":{"body":91,"breadcrumbs":0,"title":0},"184":{"body":43,"breadcrumbs":0,"title":0},"185":{"body":12,"breadcrumbs":2,"title":2},"186":{"body":29,"breadcrumbs":0,"title":0},"187":{"body":5,"breadcrumbs":0,"title":0},"188":{"body":27,"breadcrumbs":0,"title":0},"189":{"body":3,"breadcrumbs":0,"title":0},"19":{"body":6,"breadcrumbs":0,"title":0},"190":{"body":272,"breadcrumbs":0,"title":0},"191":{"body":240,"breadcrumbs":1,"title":1},"192":{"body":151,"breadcrumbs":3,"title":3},"193":{"body":91,"breadcrumbs":0,"title":0},"194":{"body":290,"breadcrumbs":1,"title":1},"195":{"body":21,"breadcrumbs":0,"title":0},"196":{"body":9,"breadcrumbs":0,"title":0},"197":{"body":149,"breadcrumbs":0,"title":0},"198":{"body":146,"breadcrumbs":0,"title":0},"199":{"body":107,"breadcrumbs":0,"title":0},"2":{"body":0,"breadcrumbs":0,"title":0},"20":{"body":10,"breadcrumbs":4,"title":2},"200":{"body":8,"breadcrumbs":0,"title":0},"201":{"body":67,"breadcrumbs":0,"title":0},"202":{"body":319,"breadcrumbs":0,"title":0},"203":{"body":1,"breadcrumbs":0,"title":0},"204":{"body":31,"breadcrumbs":2,"title":1},"205":{"body":11,"breadcrumbs":1,"title":0},"206":{"body":61,"breadcrumbs":1,"title":0},"207":{"body":48,"breadcrumbs":1,"title":0},"208":{"body":133,"breadcrumbs":1,"title":0},"209":{"body":24,"breadcrumbs":1,"title":0},"21":{"body":35,"breadcrumbs":2,"title":0},"210":{"body":18,"breadcrumbs":1,"title":0},"211":{"body":128,"breadcrumbs":1,"title":0},"212":{"body":88,"breadcrumbs":2,"title":1},"213":{"body":247,"breadcrumbs":1,"title":0},"214":{"body":154,"breadcrumbs":2,"title":1},"215":{"body":138,"breadcrumbs":1,"title":0},"216":{"body":11,"breadcrumbs":1,"title":0},"217":{"body":189,"breadcrumbs":1,"title":0},"218":{"body":206,"breadcrumbs":1,"title":0},"219":{"body":1,"breadcrumbs":1,"title":0},"22":{"body":39,"breadcrumbs":2,"title":0},"220":{"body":69,"breadcrumbs":2,"title":1},"221":{"body":291,"breadcrumbs":2,"title":1},"222":{"body":4,"breadcrumbs":1,"title":0},"223":{"body":11,"breadcrumbs":1,"title":0},"224":{"body":50,"breadcrumbs":1,"title":0},"225":{"body":4,"breadcrumbs":1,"title":0},"226":{"body":2,"breadcrumbs":0,"title":0},"227":{"body":0,"breadcrumbs":0,"title":0},"228":{"body":231,"breadcrumbs":0,"title":0},"229":{"body":80,"breadcrumbs":0,"title":0},"23":{"body":21,"breadcrumbs":2,"title":0},"230":{"body":217,"breadcrumbs":1,"title":1},"231":{"body":66,"breadcrumbs":1,"title":1},"232":{"body":144,"breadcrumbs":0,"title":0},"233":{"body":34,"breadcrumbs":0,"title":0},"234":{"body":64,"breadcrumbs":2,"title":2},"235":{"body":34,"breadcrumbs":0,"title":0},"236":{"body":69,"breadcrumbs":0,"title":0},"237":{"body":80,"breadcrumbs":0,"title":0},"238":{"body":227,"breadcrumbs":1,"title":1},"239":{"body":4,"breadcrumbs":2,"title":1},"24":{"body":50,"breadcrumbs":2,"title":0},"240":{"body":204,"breadcrumbs":2,"title":1},"241":{"body":63,"breadcrumbs":1,"title":0},"242":{"body":60,"breadcrumbs":2,"title":1},"243":{"body":2,"breadcrumbs":1,"title":0},"244":{"body":8,"breadcrumbs":4,"title":2},"245":{"body":84,"breadcrumbs":2,"title":0},"246":{"body":6,"breadcrumbs":4,"title":1},"247":{"body":142,"breadcrumbs":3,"title":0},"248":{"body":241,"breadcrumbs":7,"title":4},"249":{"body":17,"breadcrumbs":4,"title":1},"25":{"body":16,"breadcrumbs":4,"title":2},"250":{"body":95,"breadcrumbs":4,"title":1},"251":{"body":37,"breadcrumbs":4,"title":1},"252":{"body":7,"breadcrumbs":3,"title":0},"253":{"body":23,"breadcrumbs":6,"title":3},"254":{"body":3,"breadcrumbs":4,"title":1},"255":{"body":56,"breadcrumbs":3,"title":0},"256":{"body":444,"breadcrumbs":3,"title":0},"257":{"body":49,"breadcrumbs":8,"title":3},"258":{"body":14,"breadcrumbs":4,"title":1},"259":{"body":3,"breadcrumbs":3,"title":0},"26":{"body":91,"breadcrumbs":3,"title":1},"260":{"body":27,"breadcrumbs":0,"title":0},"261":{"body":7,"breadcrumbs":2,"title":1},"262":{"body":27,"breadcrumbs":2,"title":1},"263":{"body":285,"breadcrumbs":1,"title":0},"264":{"body":8,"breadcrumbs":2,"title":1},"265":{"body":52,"breadcrumbs":1,"title":0},"266":{"body":34,"breadcrumbs":2,"title":1},"267":{"body":71,"breadcrumbs":1,"title":0},"268":{"body":69,"breadcrumbs":2,"title":1},"269":{"body":145,"breadcrumbs":1,"title":0},"27":{"body":110,"breadcrumbs":3,"title":1},"270":{"body":22,"breadcrumbs":1,"title":0},"271":{"body":84,"breadcrumbs":2,"title":1},"272":{"body":133,"breadcrumbs":2,"title":1},"273":{"body":16,"breadcrumbs":2,"title":1},"274":{"body":160,"breadcrumbs":2,"title":1},"275":{"body":99,"breadcrumbs":2,"title":1},"276":{"body":7,"breadcrumbs":2,"title":1},"277":{"body":28,"breadcrumbs":2,"title":1},"278":{"body":386,"breadcrumbs":1,"title":0},"279":{"body":115,"breadcrumbs":3,"title":2},"28":{"body":9,"breadcrumbs":2,"title":0},"280":{"body":5,"breadcrumbs":0,"title":0},"281":{"body":246,"breadcrumbs":0,"title":0},"282":{"body":388,"breadcrumbs":2,"title":2},"283":{"body":6,"breadcrumbs":0,"title":0},"284":{"body":13,"breadcrumbs":0,"title":0},"285":{"body":19,"breadcrumbs":0,"title":0},"286":{"body":77,"breadcrumbs":1,"title":1},"287":{"body":208,"breadcrumbs":1,"title":1},"288":{"body":207,"breadcrumbs":1,"title":1},"289":{"body":117,"breadcrumbs":0,"title":0},"29":{"body":14,"breadcrumbs":3,"title":1},"290":{"body":62,"breadcrumbs":0,"title":0},"291":{"body":52,"breadcrumbs":0,"title":0},"292":{"body":64,"breadcrumbs":0,"title":0},"293":{"body":3,"breadcrumbs":0,"title":0},"294":{"body":442,"breadcrumbs":0,"title":0},"295":{"body":19,"breadcrumbs":2,"title":2},"296":{"body":3,"breadcrumbs":4,"title":2},"297":{"body":23,"breadcrumbs":3,"title":1},"298":{"body":22,"breadcrumbs":3,"title":1},"299":{"body":7,"breadcrumbs":4,"title":2},"3":{"body":9,"breadcrumbs":0,"title":0},"30":{"body":7,"breadcrumbs":2,"title":0},"300":{"body":3,"breadcrumbs":2,"title":0},"301":{"body":10,"breadcrumbs":0,"title":0},"302":{"body":3,"breadcrumbs":0,"title":0},"303":{"body":26,"breadcrumbs":0,"title":0},"304":{"body":117,"breadcrumbs":0,"title":0},"305":{"body":10,"breadcrumbs":0,"title":0},"306":{"body":3,"breadcrumbs":0,"title":0},"307":{"body":31,"breadcrumbs":0,"title":0},"308":{"body":128,"breadcrumbs":0,"title":0},"309":{"body":210,"breadcrumbs":0,"title":0},"31":{"body":7,"breadcrumbs":0,"title":0},"310":{"body":12,"breadcrumbs":0,"title":0},"311":{"body":60,"breadcrumbs":0,"title":0},"312":{"body":49,"breadcrumbs":0,"title":0},"313":{"body":65,"breadcrumbs":1,"title":1},"314":{"body":47,"breadcrumbs":0,"title":0},"315":{"body":34,"breadcrumbs":0,"title":0},"316":{"body":111,"breadcrumbs":0,"title":0},"317":{"body":222,"breadcrumbs":2,"title":2},"318":{"body":245,"breadcrumbs":0,"title":0},"319":{"body":0,"breadcrumbs":0,"title":0},"32":{"body":67,"breadcrumbs":0,"title":0},"320":{"body":15,"breadcrumbs":0,"title":0},"321":{"body":0,"breadcrumbs":0,"title":0},"322":{"body":11,"breadcrumbs":1,"title":1},"323":{"body":67,"breadcrumbs":0,"title":0},"324":{"body":27,"breadcrumbs":0,"title":0},"325":{"body":36,"breadcrumbs":0,"title":0},"326":{"body":80,"breadcrumbs":0,"title":0},"327":{"body":50,"breadcrumbs":0,"title":0},"328":{"body":72,"breadcrumbs":1,"title":1},"329":{"body":0,"breadcrumbs":0,"title":0},"33":{"body":53,"breadcrumbs":0,"title":0},"330":{"body":16,"breadcrumbs":0,"title":0},"331":{"body":84,"breadcrumbs":0,"title":0},"332":{"body":19,"breadcrumbs":0,"title":0},"333":{"body":48,"breadcrumbs":0,"title":0},"334":{"body":358,"breadcrumbs":0,"title":0},"335":{"body":284,"breadcrumbs":0,"title":0},"336":{"body":90,"breadcrumbs":3,"title":3},"337":{"body":149,"breadcrumbs":0,"title":0},"338":{"body":58,"breadcrumbs":0,"title":0},"339":{"body":1,"breadcrumbs":0,"title":0},"34":{"body":74,"breadcrumbs":0,"title":0},"340":{"body":6,"breadcrumbs":0,"title":0},"341":{"body":2,"breadcrumbs":0,"title":0},"342":{"body":17,"breadcrumbs":0,"title":0},"343":{"body":77,"breadcrumbs":0,"title":0},"344":{"body":280,"breadcrumbs":0,"title":0},"345":{"body":58,"breadcrumbs":0,"title":0},"346":{"body":41,"breadcrumbs":0,"title":0},"347":{"body":4,"breadcrumbs":0,"title":0},"348":{"body":2,"breadcrumbs":0,"title":0},"349":{"body":377,"breadcrumbs":0,"title":0},"35":{"body":52,"breadcrumbs":1,"title":1},"350":{"body":110,"breadcrumbs":0,"title":0},"351":{"body":45,"breadcrumbs":0,"title":0},"352":{"body":1,"breadcrumbs":0,"title":0},"353":{"body":90,"breadcrumbs":0,"title":0},"354":{"body":144,"breadcrumbs":0,"title":0},"355":{"body":328,"breadcrumbs":2,"title":2},"356":{"body":137,"breadcrumbs":1,"title":1},"357":{"body":67,"breadcrumbs":2,"title":2},"358":{"body":4,"breadcrumbs":0,"title":0},"359":{"body":21,"breadcrumbs":0,"title":0},"36":{"body":18,"breadcrumbs":2,"title":2},"360":{"body":182,"breadcrumbs":0,"title":0},"361":{"body":97,"breadcrumbs":0,"title":0},"362":{"body":69,"breadcrumbs":1,"title":1},"363":{"body":0,"breadcrumbs":0,"title":0},"364":{"body":84,"breadcrumbs":0,"title":0},"365":{"body":52,"breadcrumbs":0,"title":0},"366":{"body":0,"breadcrumbs":0,"title":0},"367":{"body":14,"breadcrumbs":0,"title":0},"368":{"body":17,"breadcrumbs":0,"title":0},"369":{"body":88,"breadcrumbs":1,"title":1},"37":{"body":25,"breadcrumbs":0,"title":0},"370":{"body":104,"breadcrumbs":0,"title":0},"371":{"body":42,"breadcrumbs":1,"title":1},"372":{"body":68,"breadcrumbs":0,"title":0},"373":{"body":92,"breadcrumbs":1,"title":1},"374":{"body":141,"breadcrumbs":0,"title":0},"375":{"body":69,"breadcrumbs":0,"title":0},"376":{"body":0,"breadcrumbs":0,"title":0},"377":{"body":68,"breadcrumbs":0,"title":0},"378":{"body":1227,"breadcrumbs":0,"title":0},"379":{"body":10,"breadcrumbs":0,"title":0},"38":{"body":3,"breadcrumbs":0,"title":0},"380":{"body":166,"breadcrumbs":2,"title":2},"381":{"body":516,"breadcrumbs":0,"title":0},"382":{"body":0,"breadcrumbs":0,"title":0},"383":{"body":0,"breadcrumbs":1,"title":0},"384":{"body":0,"breadcrumbs":1,"title":0},"385":{"body":36,"breadcrumbs":1,"title":0},"386":{"body":16,"breadcrumbs":1,"title":0},"387":{"body":0,"breadcrumbs":3,"title":1},"388":{"body":149,"breadcrumbs":2,"title":0},"389":{"body":163,"breadcrumbs":2,"title":0},"39":{"body":154,"breadcrumbs":1,"title":1},"390":{"body":18,"breadcrumbs":5,"title":2},"391":{"body":4,"breadcrumbs":4,"title":1},"392":{"body":23,"breadcrumbs":5,"title":2},"393":{"body":40,"breadcrumbs":5,"title":2},"394":{"body":33,"breadcrumbs":5,"title":2},"395":{"body":13,"breadcrumbs":4,"title":1},"396":{"body":22,"breadcrumbs":4,"title":1},"397":{"body":3,"breadcrumbs":3,"title":1},"398":{"body":18,"breadcrumbs":2,"title":0},"399":{"body":77,"breadcrumbs":3,"title":1},"4":{"body":0,"breadcrumbs":0,"title":0},"40":{"body":122,"breadcrumbs":0,"title":0},"400":{"body":329,"breadcrumbs":3,"title":1},"401":{"body":2,"breadcrumbs":2,"title":0},"402":{"body":13,"breadcrumbs":3,"title":1},"403":{"body":1,"breadcrumbs":3,"title":1},"404":{"body":33,"breadcrumbs":2,"title":0},"405":{"body":18,"breadcrumbs":3,"title":1},"406":{"body":32,"breadcrumbs":3,"title":1},"407":{"body":18,"breadcrumbs":2,"title":0},"408":{"body":14,"breadcrumbs":3,"title":1},"409":{"body":2,"breadcrumbs":7,"title":3},"41":{"body":307,"breadcrumbs":0,"title":0},"410":{"body":3,"breadcrumbs":7,"title":3},"411":{"body":69,"breadcrumbs":4,"title":0},"412":{"body":18,"breadcrumbs":4,"title":0},"413":{"body":47,"breadcrumbs":7,"title":3},"414":{"body":16,"breadcrumbs":6,"title":2},"415":{"body":294,"breadcrumbs":3,"title":1},"42":{"body":121,"breadcrumbs":0,"title":0},"43":{"body":59,"breadcrumbs":0,"title":0},"44":{"body":144,"breadcrumbs":0,"title":0},"45":{"body":5,"breadcrumbs":0,"title":0},"46":{"body":5,"breadcrumbs":0,"title":0},"47":{"body":6,"breadcrumbs":1,"title":1},"48":{"body":103,"breadcrumbs":0,"title":0},"49":{"body":12,"breadcrumbs":0,"title":0},"5":{"body":3,"breadcrumbs":0,"title":0},"50":{"body":88,"breadcrumbs":1,"title":1},"51":{"body":27,"breadcrumbs":0,"title":0},"52":{"body":206,"breadcrumbs":0,"title":0},"53":{"body":165,"breadcrumbs":0,"title":0},"54":{"body":49,"breadcrumbs":0,"title":0},"55":{"body":90,"breadcrumbs":0,"title":0},"56":{"body":1,"breadcrumbs":0,"title":0},"57":{"body":90,"breadcrumbs":0,"title":0},"58":{"body":119,"breadcrumbs":0,"title":0},"59":{"body":26,"breadcrumbs":0,"title":0},"6":{"body":0,"breadcrumbs":0,"title":0},"60":{"body":0,"breadcrumbs":0,"title":0},"61":{"body":261,"breadcrumbs":0,"title":0},"62":{"body":164,"breadcrumbs":0,"title":0},"63":{"body":4,"breadcrumbs":0,"title":0},"64":{"body":1,"breadcrumbs":0,"title":0},"65":{"body":1,"breadcrumbs":0,"title":0},"66":{"body":13,"breadcrumbs":0,"title":0},"67":{"body":2,"breadcrumbs":0,"title":0},"68":{"body":22,"breadcrumbs":0,"title":0},"69":{"body":25,"breadcrumbs":1,"title":1},"7":{"body":0,"breadcrumbs":0,"title":0},"70":{"body":215,"breadcrumbs":0,"title":0},"71":{"body":47,"breadcrumbs":0,"title":0},"72":{"body":67,"breadcrumbs":0,"title":0},"73":{"body":88,"breadcrumbs":2,"title":2},"74":{"body":119,"breadcrumbs":2,"title":2},"75":{"body":78,"breadcrumbs":2,"title":2},"76":{"body":1,"breadcrumbs":0,"title":0},"77":{"body":116,"breadcrumbs":1,"title":1},"78":{"body":201,"breadcrumbs":0,"title":0},"79":{"body":14,"breadcrumbs":0,"title":0},"8":{"body":0,"breadcrumbs":0,"title":0},"80":{"body":1,"breadcrumbs":0,"title":0},"81":{"body":5,"breadcrumbs":0,"title":0},"82":{"body":120,"breadcrumbs":0,"title":0},"83":{"body":54,"breadcrumbs":0,"title":0},"84":{"body":90,"breadcrumbs":0,"title":0},"85":{"body":24,"breadcrumbs":0,"title":0},"86":{"body":5,"breadcrumbs":0,"title":0},"87":{"body":54,"breadcrumbs":1,"title":1},"88":{"body":39,"breadcrumbs":0,"title":0},"89":{"body":44,"breadcrumbs":0,"title":0},"9":{"body":37,"breadcrumbs":0,"title":0},"90":{"body":60,"breadcrumbs":0,"title":0},"91":{"body":121,"breadcrumbs":2,"title":2},"92":{"body":5,"breadcrumbs":0,"title":0},"93":{"body":76,"breadcrumbs":0,"title":0},"94":{"body":53,"breadcrumbs":0,"title":0},"95":{"body":117,"breadcrumbs":0,"title":0},"96":{"body":30,"breadcrumbs":0,"title":0},"97":{"body":0,"breadcrumbs":0,"title":0},"98":{"body":7,"breadcrumbs":0,"title":0},"99":{"body":25,"breadcrumbs":0,"title":0}},"docs":{"0":{"body":"항상 그렇게 명확지는 않았지만, 러스트 프로그래밍 언어는 근본적으로 권한 분산 에 관한 것입니다: 여러분이 어떠한 종류의 코드를 작성하는 중이던 간에, 러스트는 여러분에게 더 멀리 뻗어갈 권한을 주어, 다양한 분야에서 여러분이 전에 했던 것보다 자신감을 가지고 프로그래밍 할 수 있도록 해줍니다. 예를 들어, 메모리 관리, 데이터 표현, 그리고 동시성에 대한 저수준의 디테일을 다루는 “시스템 레벨”의 일을 해보세요. 전통적으로, 이 프로그래밍 영역은 신비로운 것으로 보이고, 이 영역의 악명높은 함정에 빠지지 않기 위해 필요한 수 년의 시간을 배우는데 헌신한 몇몇의 선택받은 자들만이 접근할 수 있는 것으로 여겨졌습니다. 그리고 이 분야를 연마해온 그들조차도 그들의 코드가 이용당하거나, 망가지거나, 붕괴되지 않도록 조심스럽게 작업을 합니다. 러스트는 여러분이 길을 잃지 않도록 하기 위해, 오래된 함정들을 제거하고 친근하면서도 세련된 도구 세트를 제공함으로써 이 장벽들을 부숩니다. 저수준의 제어에 “살짝만 발을 담글” 필요가 있는 프로그래머들은, 변덕스러운 툴체인의 미세한 지점들을 학습할 필요없이 러스트를 통해 그렇게 할 수 있습니다. 그 정도가 아니라, 이 언어는 속도와 메모리 사용 측면에서 효율적이면서도 안정적인 코드를 작성해 나갈 수 있도록 여러분들을 자연스럽게 안내하도록 설계되었습니다. 이미 저수준의 코드를 가지고 일하고 있는 프로그래머들은 러스트를 사용하여 그들의 야망을 더 키울 수 있습니다. 예를 들면, 러스트에서 소개하는 병렬성은 상대적으로 저위험성 연산입니다: 컴파일러가 여러분을 위해 고전적인 실수를 잡아줄 것입니다. 그리고 여러분은 뜻하지 않게 프로그램이 망가지거나 악용되지 않으리라는 자신감을 가지고 여러분의 코드에 대하여 더 공격적인 최적화에 몰두할 수 있습니다. 하지만 러스트는 저수준의 시스템 프로그래밍에 한정되지 않습니다. 이 언어는 CLI 앱, 웹 서버, 그리고 작성하기에 꽤나 즐거운 종류의 다른 코드들을 만들기에 충분할 정도로 표현력이 풍부하고 인간 공학적입니다 - 여러분은 이 책의 뒷 부분에서 이에 대한 단순한 예제들을 보게될 것입니다. 러스트로 일하는 것은 여러분이 어떤 영역에서 또다른 영역으로 옮기는 기술을 만들수 있게 해줍니다; 여러분은 웹 앱을 작성하는 것으로 러스트를 배울 수 있고, 그 다음 여러분의 라즈베리 파이를 대상으로 동일한 기술을 적용할 수 있습니다. 이 책은 러스트 사용자에게 권한을 주기 위해 러스트의 잠재력을 모두 담아내었습니다. 이 책은 러스트에 대한 여러분의 지식을 향상시키는 것 뿐만 아니라, 일반적인 프로그래머로서의 도약과 자신감을 향상시키는 것을 돕기 위한 의도로 친절하고 이해하기 쉬운 텍스트로 되어있습니다. 그러니 뛰어 들어서 배울 준비를 하세요-러스트 커뮤니티에 오신 것을 환영합니다! Nicholas Matsakis와 Aaron Turon","breadcrumbs":"들어가기에 앞서 » 들어가기에 앞서","id":"0","title":"들어가기에 앞서"},"1":{"body":"러스트 프로그래밍 언어 , 러스트 입문서에 오신 것을 환영합니다. 러스트 프로그래밍 언어는 여러분이 더 빠르고, 더 안정적인 소프트웨어를 작성하도록 해줍니다. 프로그래밍 언어 디자인에서 고수준의 인간공학과 저수준의 제어는 종종 조화롭지 못합니다; 러스트는 이러한 갈등에 도전합니다. 강력한 기술적 능력과 훌륭한 개발자 경험을 조화롭게 하는 것을 통해, 러스트는 (메모리 사용 같은) 저수준 디테일을 그러한 제어를 하는데 동반되는 전통적으로 귀찮은 것들 없이도 제어하는 옵션을 제공합니다.","breadcrumbs":"소개 » 소개","id":"1","title":"소개"},"10":{"body":"이 책을 제작하도록 하는 소스코드는 GitHub 에서 찾을 수 있습니다.","breadcrumbs":"소개 » 소스 코드","id":"10","title":"소스 코드"},"100":{"body":"아래처럼 IpAddrKind 의 두 개의 variants 에 대한 인스턴스를 만들 수 있습니다: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n#\nlet four = IpAddrKind::V4;\nlet six = IpAddrKind::V6; 열거형의 variants 는 열거형을 정의한 식별자에 의해 이름 공간이 생기며, 두 개의 콜론을 사용하여 둘을 구분할 수 있습니다. IpAddrKind::V4 와 IpAddrKind::V6 의 값은 동일한 타입이기 때문에, 이 방식이 유용합니다: IpAddrKind. 이제 IpAddrKind 타입을 인자로 받는 함수를 정의할 수 있습니다: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n#\nfn route(ip_type: IpAddrKind) { } 그리고, variant 중 하나를 사용해서 함수를 호출할 수 있습니다: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n#\n# fn route(ip_type: IpAddrKind) { }\n#\nroute(IpAddrKind::V4);\nroute(IpAddrKind::V6); 열거형을 사용하면 이점이 더 있습니다. IP 주소 타입에 대해 더 생각해 볼 때, 지금으로써는 실제 IP 주소 데이터 를 저장할 방법이 없습니다. 단지 어떤 종류 인지만 알 뿐입니다. 5장에서 구조체에 대해 방금 공부했다고 한다면, 이 문제를 Listing 6-1에서 보이는 것처럼 풀려고 할 것입니다: enum IpAddrKind { V4, V6,\n} struct IpAddr { kind: IpAddrKind, address: String,\n} let home = IpAddr { kind: IpAddrKind::V4, address: String::from(\"127.0.0.1\"),\n}; let loopback = IpAddr { kind: IpAddrKind::V6, address: String::from(\"::1\"),\n}; Listing 6-1: struct 를 사용해서 IP 주소의 데이터와 IpAddrKind variant 저장하기 여기서 두 개의 필드를 갖는 IpAddr 를 정의했습니다: IpAddrKind 타입(이전에 정의한 열거형)인 kind 필드와 String 타입인 address 필드입니다. 구조체에 대한 두 개의 인스턴스가 있습니다. 첫 번째 home 은 kind 의 값으로 IpAddrKind::V4 을 갖고 연관된 주소 데이터로 127.0.0.1 를 갖습니다. 두 번째 loopback 은 IpAddrKind 의 다른 variant 인 V6 을 값으로 갖고, 연관된 주소로 ::1 를 갖습니다. kind 와 address 의 값을 함께 사용하기 위해 구조체를 사용했습니다. 그렇게 함으로써 variant 가 연관된 값을 갖게 되었습니다. 각 열거형 variant 에 데이터를 직접 넣는 방식을 사용해서 열거형을 구조체의 일부로 사용하는 방식보다 더 간결하게 동일한 개념을 표현할 수 있습니다. IpAddr 열거형의 새로운 정의에서는 두 개의 V4 와 V6 variant 는 연관된 String 타입의 값을 갖게 됩니다. enum IpAddr { V4(String), V6(String),\n} let home = IpAddr::V4(String::from(\"127.0.0.1\")); let loopback = IpAddr::V6(String::from(\"::1\")); 열거형의 각 variant 에 직접 데이터를 붙임으로써, 구조체를 사용할 필요가 없어졌습니다. 구조체 보다 열거형을 사용할 때 다른 장점이 있습니다. 각 variant 는 다른 타입과 다른 양의 연관된 데이터를 가질 수 있습니다. 버전 4 타입의 IP 주소는 항상 0 ~ 255 사이의 숫자 4개로 된 구성요소를 갖게 될 것입니다. V4 주소에 4개의 u8 값을 저장하길 원하지만, V6 주소는 하나의 String 값으로 표현되길 원한다면, 구조체로는 이렇게 할 수 없습니다. 열거형은 이런 경우를 쉽게 처리합니다: enum IpAddr { V4(u8, u8, u8, u8), V6(String),\n} let home = IpAddr::V4(127, 0, 0, 1); let loopback = IpAddr::V6(String::from(\"::1\")); 두 가지 다른 종류의 IP 주소를 저장하기 위해 코드상에서 열거형을 정의하는 몇 가지 방법을 살펴봤습니다. 그러나, 누구나 알듯이 IP 주소와 그 종류를 저장하는 것은 흔하기 때문에, 표준 라이브러리에 사용할 수 있는 정의가 있습니다! 표준 라이브러리에서 `IpAddr` 를 어떻게 정의하고 있는지 살펴봅시다. 위에서 정의하고 사용했던 것과 동일한 열거형과 variant 를 갖고 있지만, variant 에 포함된 주소 데이터는 두 가지 다른 구조체로 되어 있으며, 각 variant 마다 다르게 정의하고 있습니다: struct Ipv4Addr { // details elided\n} struct Ipv6Addr { // details elided\n} enum IpAddr { V4(Ipv4Addr), V6(Ipv6Addr),\n} 이 코드에서 보듯이 열거형 variant 에 어떤 종류의 데이터라도 넣을 수 있습니다: 예를 들면 문자열, 숫자 타입, 혹은 구조체. 다른 열거형 조차도 포함할 수 있습니다! 또한 표준 라이브러리 타입들은 어떤 경우에는 해결책으로 생각한 것보다 훨씬 더 복잡하지 않습니다. 현재 스코프에 표준 라이브러리를 가져오지 않았기 때문에, 표준 라이브러리에 IpAddr 정의가 있더라도, 동일한 이름의 타입을 만들고 사용할 수 있습니다. 타입을 가져오는 것에 대해서는 7장에서 더 살펴볼 것입니다. Listing 6-2 에 있는 열거형의 다른 예제를 살펴봅시다: 이 예제에서는 각 variants 에 다양한 유형의 타입들이 포함되어 있습니다: enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32),\n} Listing 6-2: Message 열거형은 각 variants 가 다른 타입과 다른 양의 값을 저장함. 이 열거형에는 다른 데이터 타입을 갖는 네 개의 variants 가 있습니다: Quit 은 연관된 데이터가 전혀 없습니다. Move 은 익명 구조체를 포함합니다. Write 은 하나의 String 을 포함합니다. ChangeColor 는 세 개의 i32 을 포함합니다. Listing 6-2 에서 처럼 variants 로 열거형을 정의하는 것은 다른 종류의 구조체들을 정의하는 것과 비슷합니다. 열거형과 다른 점은 struct 키워드를 사용하지 않는다는 것과 모든 variants 가 Message 타입으로 그룹화된다는 것입니다. 아래 구조체들은 이전 열거형의 variants 가 갖는 것과 동일한 데이터를 포함할 수 있습니다: struct QuitMessage; // 유닛 구조체\nstruct MoveMessage { x: i32, y: i32,\n}\nstruct WriteMessage(String); // 튜플 구조체\nstruct ChangeColorMessage(i32, i32, i32); // 튜플 구조체 각기 다른 타입을 갖는 여러 개의 구조체를 사용한다면, 이 메시지 중 어떤 한 가지를 인자로 받는 함수를 정의하기 힘들 것입니다. Listing 6-2 에 정의한 Message 열거형은 하나의 타입으로 이것이 가능합니다. 열거형과 구조체는 한 가지 더 유사한 점이 있습니다: 구조체에 impl 을 사용해서 메소드를 정의한 것처럼, 열거형에도 정의할 수 있습니다. 여기 Message 열거형에 에 정의한 call 이라는 메소드가 있습니다: # enum Message {\n# Quit,\n# Move { x: i32, y: i32 },\n# Write(String),\n# ChangeColor(i32, i32, i32),\n# }\n#\nimpl Message { fn call(&self) { // 메소드 내용은 여기 정의할 수 있습니다. }\n} let m = Message::Write(String::from(\"hello\"));\nm.call(); 열거형의 값을 가져오기 위해 메소드 안에서 self 를 사용할 것입니다. 이 예제에서 생성한 변수 m 은 Message::Write(String::from(\"hello\")) 값을 갖게 되고, 이 값은 m.call()이 실행될 때, call 메소드 안에서 self가 될 것입니다. 표준 라이브러리에 있는 매우 흔하게 사용하고 유용한 열거형을 살펴봅시다: Option.","breadcrumbs":"열거형과 패턴 매칭 » 열거형 정의하기 » 열거형 값","id":"100","title":"열거형 값"},"101":{"body":"이전 절에서, IpAddr 열거형을 사용하여 작성한 프로그램에서는 러스트 타입 시스템을 사용하여 데이터뿐만 아니라 더 많은 정보를 담을 수 있는 방법을 살펴보았습니다. 이번 절에서는 표준 라이브러리에서 열거형으로 정의된 또 다른 타입인 Option 에 대한 사용 예를 살펴볼 것입니다. Option 타입은 많이 사용되는데, 값이 있거나 없을 수도 있는 아주 흔한 상황을 나타내기 때문입니다. 이 개념을 타입 시스템의 관점으로 표현하자면, 컴파일러가 발생할 수 있는 모든 경우를 처리했는지 체크할 수 있습니다. 이렇게 함으로써 버그를 방지할 수 있고, 이것은 다른 프로그래밍 언어에서 매우 흔합니다. 프로그래밍 언어 디자인은 가끔 어떤 특성들이 포함되었는지의 관점에서 생각되기도 하지만, 포함되지 않은 특성들도 역시 중요합니다. 러스트는 다른 언어들에서 흔하게 볼 수 있는 null 특성이 없습니다. Null 은 값이 없다는 것을 표현하는 하나의 값입니다. null 을 허용하는 언어에서는, 변수는 항상 두 상태중 하나가 될 수 있습니다: null 혹은 null 이 아님. null 을 고안한 Tony Hoare 의 \"Null 참조 : 10 억 달러의 실수\"에서 다음과 같이 말합니다: 나는 그것을 나의 10억 달러의 실수라고 생각한다. 그 당시 객체지향 언어에서 처음 참조를 위한 포괄적인 타입 시스템을 디자인하고 있었다. 내 목표는 컴파일러에 의해 자동으로 수행되는 체크를 통해 모든 참조의 사용은 절대적으로 안전하다는 것을 확인하는 것이었다. 그러나 null 참조를 넣고 싶은 유혹을 참을 수 없었다. 간단한 이유는 구현이 쉽다는 것이었다. 이것은 수없이 많은 오류와 취약점들, 시스템 종료를 유발했고, 지난 40년간 10억 달러의 고통과 손실을 초래했을 수도 있다. null 값으로 발생하는 문제는, null 값을 null 이 아닌 값처럼 사용하려고 할 때 여러 종류의 오류가 발생할 수 있다는 것입니다. null이나 null이 아닌 속성은 어디에나 있을 수 있고, 너무나도 쉽게 이런 종류의 오류를 만들어 냅니다. 그러나, null 이 표현하려고 하는 것은 아직까지도 유용합니다: null 은 현재 어떤 이유로 유효하지 않고, 존재하지 않는 하나의 값입니다. 문제는 실제 개념에 있기보다, 특정 구현에 있습니다. 이와 같이 러스트에는 null 이 없지만, 값의 존재 혹은 부재의 개념을 표현할 수 있는 열거형이 있습니다. 이 열거형은 Option