diff --git a/second-edition/src/appendix-08-glossary.md b/second-edition/src/appendix-08-glossary.md index 15d205aed9..d5a2ffef33 100644 --- a/second-edition/src/appendix-08-glossary.md +++ b/second-edition/src/appendix-08-glossary.md @@ -49,7 +49,7 @@ - deadlock: 데드록, 교착 상태 - deep copy: 깊은 복사 - dependency: 디펜던시, 의존성 -- deref coercion: 역참조 강제 +- deref coercion: 역참조 강제 변환 - derefence operator: 역참조 연산자 - derivable: 추론 가능한 - derivable traits: 파생 가능한 트레잇 diff --git a/second-edition/src/ch08-02-strings.md b/second-edition/src/ch08-02-strings.md index b410b5b6a5..d7e52e4fde 100644 --- a/second-edition/src/ch08-02-strings.md +++ b/second-edition/src/ch08-02-strings.md @@ -183,9 +183,9 @@ fn add(self, s: &str) -> String { 두 `String`을 더하지는 못합니다. 하지만, 잠깐만요 - `&s2`의 타입은 `&String`이지, `add`의 두번째 파라미터에 명시한것처럼 `&str`은 아니죠. 왜 Listing 8-18의 예제가 컴파일될까요? `&s2`를 `add` 호출에 사용할 수 있는 이유는 `&String` 인자가 `&str`로 *강제*될 수 있기 때문입니다 - -`add` 함수가 호출되면, 러스트는 *역참조 강제(deref coercion)* 라 불리는 무언가를 사용하는데, +`add` 함수가 호출되면, 러스트는 *역참조 강제 변환(deref coercion)* 이라 불리는 무언가를 사용하는데, 이는 `add` 함수내에서 사용되는 `&s2`가 `&s2[..]`로 바뀌는 것으로 생각할 수 있도록 해줍니다. -역참조 강제에 대한 것은 15장에서 다룰 것입니다. `add`가 파라미터의 소유권을 가져가지는 않으므로, +역참조 강제 변환에 대한 것은 15장에서 다룰 것입니다. `add`가 파라미터의 소유권을 가져가지는 않으므로, `s2`는 이 연산 이후에도 여전히 유효한 `String`일 것입니다. 두번째로, 시그니처에서 `add`가 `self`의 소유권을 가져가는 것을 볼 수 있는데, 이는 `self`가 diff --git a/second-edition/src/ch15-02-deref.md b/second-edition/src/ch15-02-deref.md index 296504f402..339c154ae6 100644 --- a/second-edition/src/ch15-02-deref.md +++ b/second-edition/src/ch15-02-deref.md @@ -10,7 +10,7 @@ Deref 트레잇을 구현하는 것은 우리가 (곱하기 혹은 글롭 연산 비슷한 우리만의 타입을 정의하는 시도를 해서 왜 `*`가 우리의 새로 정의된 타입에서는 참조자처럼 작동하지 않는지를 봅시다. 우리는 `Defer` 트레잇을 구현하는 것이 어떻게 스마트 포인터가 참조자와 유사한 방식으로 동작하는 것을 가능하게 해 주는지를 탐구할 -것입니다. 그런 뒤 러스트의 *역참조 강제 (deref corecion)* 기능과 이 기능이 어떻게 +것입니다. 그런 뒤 러스트의 *역참조 강제 변환 (deref corecion)* 기능과 이 기능이 어떻게 참조자 혹은 스마트 포인터와 함께 동작하도록 하는지 살펴보겠습니다. ### `*`와 함께 포인터를 따라가서 값을 얻기 @@ -220,22 +220,22 @@ Listing 15-9의 `*y`에 들어설 때, 무대 뒤에서 러스트는 실제로 얻는데, 이는 Listing 15-9의 `assert_eq!` 내의 `5`와 일치합니다. ### Implicit Deref Coercions with Functions and Methods -### 함수와 메소드를 이용한 암묵적 역참조 강제 +### 함수와 메소드를 이용한 암묵적 역참조 강제 변환 -*역참조 강제(deref coercion)* 는 러스트가 함수 및 메소드의 인자에 -수행하는 편의성 기능입니다. 역참조 강제는 `Deref`를 구현한 어떤 +*역참조 강제 변환(deref coercion)* 은 러스트가 함수 및 메소드의 인자에 +수행하는 편의성 기능입니다. 역참조 강제 변환은 `Deref`를 구현한 어떤 타입의 참조자를 `Deref`가 본래의 타입으로부터 바꿀 수 있는 타입의 -참조자로 바꿔줍니다. 역참조 강제는 우리가 특정 타입의 값에 대한 +참조자로 바꿔줍니다. 역참조 강제 변환은 우리가 특정 타입의 값에 대한 참조자를 함수 혹은 메소드의 인자로 넘기는 중 정의된 파라미터 타입에는 맞지 않을 때 자동적으로 발생합니다. 일련의 `deref` 메소드 호출은 우리가 제공한 타입을 파라미터가 요구하는 타입으로 변경해 줍니다. -역참조 강제가 러스트에 도입되어서 함수와 메소드 호출을 작성하는 프로그래머들은 +역참조 강제 변환이 러스트에 도입되어서 함수와 메소드 호출을 작성하는 프로그래머들은 `&`와 `*`를 이용한 많은 수의 명시적 참조 및 역참조를 추가하지 않아도 됩니다. -역참조 강제 기능은 또한 우리가 참조자나 스마트 포인터 둘 중 어느 경우라도 작동할 +역참조 강제 변환 기능은 또한 우리가 참조자나 스마트 포인터 둘 중 어느 경우라도 작동할 수 있는 코드를 더 많이 작성할 수 있도록 해 줍니다. -역참조 강제가 실제 작동하는 것을 보기 위해서, 우리가 Listing 15-8에서 +역참조 강제 변환이 실제 작동하는 것을 보기 위해서, 우리가 Listing 15-8에서 정의했던 `MyBox`과 Listing 15-10에서 추가했던 `Deref`의 구현체를 이용합시다. Listing 15-11은 스트링 슬라이스 파라미터를 갖는 함수의 정의를 보여줍니다: @@ -252,7 +252,7 @@ fn hello(name: &str) { 갖는 `hello` 함수 우리는 예를 들면 `hello("Rust");`와 같이 스트링 슬라이스를 인자로 하여 `hello` 함수를 -호출할 수 있습니다. Listing 15-12에서 보는 바와 같이, 역참조 강제는 `MyBox` +호출할 수 있습니다. Listing 15-12에서 보는 바와 같이, 역참조 강제 변환은 `MyBox` 타입의 값에 대한 참조자를 이용하여 `hello`를 호출하는 것을 가능하게 해 줍니다: Filename: src/main.rs @@ -286,7 +286,7 @@ fn main() { } ``` -Listing 15-12: 역참조 강제 때문에 작동되는, +Listing 15-12: 역참조 강제 변환 때문에 작동되는, `MyBox` 값에 대한 참조자로 `hello` 호출하기 여기서 우리는 `hello` 함수를 호출하는 인자로서 `&m`를 이용했는데, 이는 @@ -297,7 +297,7 @@ fn main() { 있습니다. 러스트는 `deref`를 다시 한번 호출하여 `&String`을 `&str`로 변환하고, 이는 `hello` 함수의 정의와 일치하게 됩니다. -만일 러스트가 역참조 강제 기능을 구현하지 않았다면, 우리는 `&MyBox` +만일 러스트가 역참조 강제 변환 기능을 구현하지 않았다면, 우리는 `&MyBox` 타입의 값을 가지고 `hello` 함수를 호출하는 데 있어 Listing 15-12의 코드 대신 Listing 15-13의 코드를 작성해야 했을 것입니다: @@ -332,29 +332,29 @@ fn main() { } ``` -Listing 15-13: 만일 러스트에 역참조 강제가 없었다면 +Listing 15-13: 만일 러스트에 역참조 강제 변환이 없었다면 우리가 작성했어야 했을 코드 `(*m)`은 `MyBox`을 `String`로 역참조해 줍니다. 그런 다음 `&`과 `[..]`은 `hello` 시그니처와 일치되도록 전체 스트링과 동일한 `String`의 -스트링 슬라이스를 얻습니다. 역참조 강제가 없는 코드는 이러한 모든 기호들이 -수반된 상태에서 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제는 +스트링 슬라이스를 얻습니다. 역참조 강제 변환이 없는 코드는 이러한 모든 기호들이 +수반된 상태에서 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제 변환은 러스트가 우리를 위해 이러한 변환을 자동적으로 다룰 수 있도록 해 줍니다. `Deref` 트레잇이 관련된 타입에 대해 정의될 때, 러스트는 해당 타입을 분석하여 파라미터의 타입에 맞는 참조자를 얻기 위해 필요한 수만큼의 `Deref::deref`를 사용할 것입니다. `Deref::deref`가 삽입될 필요가 있는 -횟수는 컴파일 타임에 분석되므로, 역참조 강제의 이점을 얻는 데에 관해서 +횟수는 컴파일 타임에 분석되므로, 역참조 강제 변환의 이점을 얻는 데에 관해서 어떠한 런타임 페널티도 없습니다! -### 역참조 강제가 가변성과 상호작용 하는 법 +### 역참조 강제 변환이 가변성과 상호작용 하는 법 불변 참조자에 대한 `*`를 오버 라이딩하기 위해 `Deref` 트레잇을 이용하는 방법과 비슷하게, 러스트는 가변 참조자에 대한 `*`를 오버 라이딩하기 위한 `DerefMut` 트레잇을 제공합니다. 러스트는 다음의 세 가지 경우에 해당하는 타입과 트레잇 구현을 찾았을 때 -역참조 강제를 수행합니다: +역참조 강제 변환을 수행합니다: * `T: Deref`일때 `&T`에서 `&U`로 * `T: DerefMut`일때 `&mut T`에서 `&mut U`로 diff --git a/second-edition/src/ch17-03-oo-design-patterns.md b/second-edition/src/ch17-03-oo-design-patterns.md index e688c3d9a6..656fb66a8a 100644 --- a/second-edition/src/ch17-03-oo-design-patterns.md +++ b/second-edition/src/ch17-03-oo-design-patterns.md @@ -408,7 +408,7 @@ impl Post { 경우중 하나이며, 심지어 컴파일러가 그런 경우를 이해할 수 없더라도 `None` 값이 결코 가능하지 못한 경우입니다. -이 지점에서 우리가 `&Box`의 `content`를 호출할 때, 역참조 강제는 +이 지점에서 우리가 `&Box`의 `content`를 호출할 때, 역참조 강제 변환은 `&`와 `Box`에 영향을 줘서 `content` 메소드가 궁극적으로 `State` 트레잇을 구현하는 타입 상에서 호출되도록 합니다. 이는 우리가 `State` 트레잇 정의에 `content`를 추가할 필요가 있음을 의미하고, 이곳이 Listing 17-18처럼 diff --git a/src/ch04-03-slices.md b/src/ch04-03-slices.md index 3f9f1945a6..c7c3766ddb 100644 --- a/src/ch04-03-slices.md +++ b/src/ch04-03-slices.md @@ -266,8 +266,8 @@ fn first_word(s: &String) -> &str { 문자열 슬라이스라면 이를 바로 인수로써 전달할 수 있습니다. `String`이라면 `String`의 슬라이스 혹은 `String`에 대한 참조자를 전달할 수 있습니다. -이러한 유연성은 *역참조 강제 (deref coercions)* 기능을 이용하는데, 15장의 -[‘함수와 메서드를 이용한 암묵적 역참조 강제’][deref-coercions]절에서 +이러한 유연성은 *역참조 강제 변환 (deref coercions)* 기능을 이용하는데, 15장의 +[‘함수와 메서드를 이용한 암묵적 역참조 강제 변환’][deref-coercions]절에서 다룰 것입니다. `String`에 대한 참조자 대신에 문자열 슬라이스를 매개변수로 하는 함수를 정의하면 diff --git a/src/ch08-02-strings.md b/src/ch08-02-strings.md index 1a2fc083f0..d728e16b29 100644 --- a/src/ch08-02-strings.md +++ b/src/ch08-02-strings.md @@ -172,9 +172,9 @@ fn add(self, s: &str) -> String { 지정된 `&str`은 아니죠. 어째서 예제 8-18가 컴파일되는 걸까요? `&s2`를 `add` 호출에 사용할 수 있는 이유는 `&String` 인수가 `&str`로 *강제*될 -수 있기 때문입니다. `add` 함수가 호출되면, 러스트는 *역참조 강제 (deref coercion)* -를 사용하는데, 이것이 `add` 함수 내에서 사용되는 `&s2`를 -`&s2[..]`로 바꿉니다. 역참조 강제는 15장에서 더 자세히 +수 있기 때문입니다. `add` 함수가 호출되면, 러스트는 *역참조 강제 변환 (deref coercion)* +을 사용하는데, 이것이 `add` 함수 내에서 사용되는 `&s2`를 +`&s2[..]`로 바꿉니다. 역참조 강제 변환은 15장에서 더 자세히 다루겠습니다. `add`가 매개변수의 소유권을 가져가지는 않으므로, `s2`는 이 연산 이후에도 계속 유효한 `String`일 것입니다. diff --git a/src/ch15-02-deref.md b/src/ch15-02-deref.md index 5259e70ca8..0d4618b39b 100644 --- a/src/ch15-02-deref.md +++ b/src/ch15-02-deref.md @@ -11,7 +11,7 @@ 역참조 연산자가 새로 정의한 타입에서는 참조자처럼 동작하지 않는 이유를 알아보겠습니다. `Deref` 트레이트를 구현하는 것이 스마트 포인터가 참조자와 유사한 방식으로 동작하도록 하는 원리를 탐구해 볼 것입니다. -그리고서 러스트의 *역참조 강제 (deref corecion)* 기능과 이 기능이 +그리고서 러스트의 *역참조 강제 변환 (deref corecion)* 기능과 이 기능이 참조자 혹은 스마트 포인터와 함께 동작하도록 하는 방식을 살펴보겠습니다. > Note: 이제부터 만들려고 하는 `MyBox` 타입과 실제 `Box` 간에는 @@ -188,24 +188,24 @@ 결국 `i32` 타입의 데이터를 얻게 되는데, 이는 예제 15-9의 `assert_eq!` 내의 `5`와 일치합니다. -### 함수와 메서드를 이용한 암묵적 역참조 강제 +### 함수와 메서드를 이용한 암묵적 역참조 강제 변환 -*역참조 강제 (deref coercion)* 는 `Deref`를 구현한 어떤 타입의 참조자를 -다른 타입의 참조자로 바꿔줍니다. 예를 들어, 역참조 강제는 `&String`을 `&str`로 +*역참조 강제 변환 (deref coercion)* 은 `Deref`를 구현한 어떤 타입의 참조자를 +다른 타입의 참조자로 바꿔줍니다. 예를 들어, 역참조 강제 변환은 `&String`을 `&str`로 바꿔줄 수 있는데, 이는 `String`의 `Deref` 트레이트 구현이 그렇게 `&str`을 -반환하도록 했기 때문입니다. 역참조 강제는 러스트가 함수와 메서드의 인수에 +반환하도록 했기 때문입니다. 역참조 강제 변환은 러스트가 함수와 메서드의 인수에 대해 수행해 주는 편의성 기능이고, `Deref` 트레이트를 구현한 타입에 대해서만 동작합니다. 이는 어떤 특정한 타입값에 대한 참조자를 함수 혹은 메서드의 인수로 전달하는데 이 함수나 메서드의 정의에는 그 매개변수 타입이 맞지 않을 때 자동으로 발생합니다. 일련의 `deref` 메서드 호출이 인수로 제공한 타입을 매개변수로서 필요한 타입으로 변경해 줍니다. -역참조 강제는 함수와 메서드 호출을 작성하는 프로그래머들이 `&`와 `*`를 +역참조 강제 변환은 함수와 메서드 호출을 작성하는 프로그래머들이 `&`와 `*`를 사용하여 수많은 명시적인 참조 및 역참조를 추가할 필요가 없도록 하기 위해 -도입되었습니다. 또한 역참조 강제 기능은 참조자나 스마트 포인터 둘 중 어느 +도입되었습니다. 또한 역참조 강제 변환 기능은 참조자나 스마트 포인터 둘 중 어느 경우라도 작동되는 코드를 더 많이 작성할 수 있도록 해 줍니다. -역참조 강제가 실제 작동하는 것을 보기 위해서, 예제 15-8에서 +역참조 강제 변환이 실제 작동하는 것을 보기 위해서, 예제 15-8에서 정의했던 `MyBox`와 예제 15-10에서 추가했던 `Deref`의 구현체를 이용해 봅시다. 예제 15-11은 문자열 슬라이스 매개변수를 갖는 함수의 정의를 보여줍니다: @@ -220,7 +220,7 @@ `hello` 함수 `hello` 함수는 이를테면 `hello("Rust");`와 같이 문자열 슬라이스를 인수로 -호출될 수 있습니다. 예제 15-12에서 보는 바와 같이, 역참조 강제는 `MyBox` +호출될 수 있습니다. 예제 15-12에서 보는 바와 같이, 역참조 강제 변환은 `MyBox` 타입 값에 대한 참조자로 `hello`의 호출을 가능하게 만들어 줍니다: 파일명: src/main.rs @@ -229,7 +229,7 @@ {{#rustdoc_include ../listings/ch15-smart-pointers/listing-15-12/src/main.rs:here}} ``` -예제 15-12: 역참조 강제에 의해 작동되는, +예제 15-12: 역참조 강제 변환에 의해 작동되는, `MyBox` 값에 대한 참조자로 `hello` 호출하기 여기서는 `hello` 함수에 `&m` 인수를 넣어 호출하고 있는데, 이것이 `MyBox` @@ -240,7 +240,7 @@ 러스트는 다시 한번 `deref`를 호출하여 `&String`을 `&str`로 바꾸는데, 이것이 `hello` 함수의 정의와 일치하게 됩니다. -만일 러스트에 역참조 강제가 구현되어 있지 않았다면, `&MyBox` +만일 러스트에 역참조 강제 변환이 구현되어 있지 않았다면, `&MyBox` 타입의 값으로 `hello`를 호출하기 위해서는 예제 15-12의 코드 대신 예제 15-13의 코드를 작성했어야 할 것입니다: @@ -250,29 +250,29 @@ {{#rustdoc_include ../listings/ch15-smart-pointers/listing-15-13/src/main.rs:here}} ``` -예제 15-13: 러스트에 역참조 강제가 없었을 경우 +예제 15-13: 러스트에 역참조 강제 변환이 없었을 경우 작성했어야 할 코드 `(*m)`은 `MyBox`을 `String`으로 역참조해 줍니다. 그런 다음 `&`과 `[..]`가 전체 문자열과 동일한 `String`의 문자열 슬라이스를 얻어와서 `hello` -시그니처와 일치되도록 합니다. 역참조 강제가 없는 코드는 이 모든 기호가 수반된 -상태가 되어 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제는 러스트가 +시그니처와 일치되도록 합니다. 역참조 강제 변환이 없는 코드는 이 모든 기호가 수반된 +상태가 되어 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제 변환은 러스트가 프로그래머 대신 이러한 변환을 자동으로 다룰 수 있도록 해 줍니다. 인수로 넣어진 타입에 대해 `Deref` 트레이트가 정의되어 있다면, 러스트는 해당 타입을 분석하고 `Deref::deref`를 필요한 만큼 사용하여 매개변수 타입과 일치하는 참조자를 얻을 것입니다. `Deref::deref`가 추가되어야 하는 횟수는 -컴파일 타임에 분석되므로, 역참조 강제의 이점을 얻는 데에 관해서 어떠한 +컴파일 타임에 분석되므로, 역참조 강제 변환의 이점을 얻는 데에 관해서 어떠한 런타임 페널티도 없습니다! -### 역참조 강제가 가변성과 상호작용하는 법 +### 역참조 강제 변환이 가변성과 상호작용하는 법 `Deref` 트레이트를 사용하여 불변 참조자에 대한 `*`를 오버라이딩하는 방법과 비슷한 방식으로, `DerefMut` 트레이트를 사용하여 가변 참조자에 대한 `*` 연산자를 오버라이딩할 수 있습니다. 러스트는 다음의 세 가지 경우에 해당하는 타입과 트레이트 구현을 찾았을 때 -역참조 강제를 수행합니다: +역참조 강제 변환을 수행합니다: * `T: Deref`일 때 `&T`에서 `&U`로 * `T: DerefMut`일 때 `&mut T`에서 `&mut U`로 @@ -281,7 +281,7 @@ 처음 두 가지 경우는 두 번째가 가변성을 구현했다는 점을 제외하면 동일합니다. 첫 번째 경우는 어떤 `&T`가 있는데, `T`가 어떤 타입 `U`에 대한 `Deref`를 구현했다면, 명료하게 `&U`를 얻을 수 있음을 기술하고 있습니다. 두 번째 경우는 -동일한 역참조 강제가 가변 참조자에 대해서도 발생함을 기술합니다. +동일한 역참조 강제 변환이 가변 참조자에 대해서도 발생함을 기술합니다. 세 번째 경우는 좀 더 까다로운데, 러스트는 가변 참조자를 불변 참조자로 강제할 수도 있습니다. 하지만 그 역은 *불가능하며*, 불변 참조자는 가변 참조자로 diff --git a/src/ch17-03-oo-design-patterns.md b/src/ch17-03-oo-design-patterns.md index 688c057675..bebeca8d4b 100644 --- a/src/ch17-03-oo-design-patterns.md +++ b/src/ch17-03-oo-design-patterns.md @@ -276,7 +276,7 @@ 입니다. 이 시점에서 `&Box`의 `content`가 호출되면, `&`와 `Box`에 -역참조 강제가 적용되어, `content` 메서드는 궁극적으로 `State` +역참조 강제 변환이 적용되어, `content` 메서드는 궁극적으로 `State` 트레이트를 구현하는 타입에서 호출될 것입니다. 이는 즉 `State` 트레이트 정의에 `content`를 추가해야 함을 뜻하고, 예제 17-18처럼 가지고 있는 상태에 따라 어떤 내용물을 반환할지에 대한 로직을