Skip to content

Commit

Permalink
역참조 강제 -> 역참조 강제 변환으로 용어 수정 (#63)
Browse files Browse the repository at this point in the history
  • Loading branch information
ilotoki0804 committed May 23, 2024
1 parent 1ef1288 commit 11063e0
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 45 deletions.
2 changes: 1 addition & 1 deletion second-edition/src/appendix-08-glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
- deadlock: 데드록, 교착 상태
- deep copy: 깊은 복사
- dependency: 디펜던시, 의존성
- deref coercion: 역참조 강제
- deref coercion: 역참조 강제 변환
- derefence operator: 역참조 연산자
- derivable: 추론 가능한
- derivable traits: 파생 가능한 트레잇
Expand Down
4 changes: 2 additions & 2 deletions second-edition/src/ch08-02-strings.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down
34 changes: 17 additions & 17 deletions second-edition/src/ch15-02-deref.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Deref 트레잇을 구현하는 것은 우리가 (곱하기 혹은 글롭 연산
비슷한 우리만의 타입을 정의하는 시도를 해서 왜 `*`가 우리의 새로 정의된 타입에서는
참조자처럼 작동하지 않는지를 봅시다. 우리는 `Defer` 트레잇을 구현하는 것이 어떻게
스마트 포인터가 참조자와 유사한 방식으로 동작하는 것을 가능하게 해 주는지를 탐구할
것입니다. 그런 뒤 러스트의 *역참조 강제 (deref corecion)* 기능과 이 기능이 어떻게
것입니다. 그런 뒤 러스트의 *역참조 강제 변환 (deref corecion)* 기능과 이 기능이 어떻게
참조자 혹은 스마트 포인터와 함께 동작하도록 하는지 살펴보겠습니다.

### `*`와 함께 포인터를 따라가서 값을 얻기
Expand Down Expand Up @@ -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<T>`과 Listing 15-10에서 추가했던 `Deref`의 구현체를
이용합시다. Listing 15-11은 스트링 슬라이스 파라미터를 갖는 함수의
정의를 보여줍니다:
Expand All @@ -252,7 +252,7 @@ fn hello(name: &str) {
갖는 `hello` 함수</span>

우리는 예를 들면 `hello("Rust");`와 같이 스트링 슬라이스를 인자로 하여 `hello` 함수를
호출할 수 있습니다. Listing 15-12에서 보는 바와 같이, 역참조 강제는 `MyBox<String>`
호출할 수 있습니다. Listing 15-12에서 보는 바와 같이, 역참조 강제 변환은 `MyBox<String>`
타입의 값에 대한 참조자를 이용하여 `hello`를 호출하는 것을 가능하게 해 줍니다:

<span class="filename">Filename: src/main.rs</span>
Expand Down Expand Up @@ -286,7 +286,7 @@ fn main() {
}
```

<span class="caption">Listing 15-12: 역참조 강제 때문에 작동되는,
<span class="caption">Listing 15-12: 역참조 강제 변환 때문에 작동되는,
`MyBox<String>` 값에 대한 참조자로 `hello` 호출하기</span>

여기서 우리는 `hello` 함수를 호출하는 인자로서 `&m`를 이용했는데, 이는
Expand All @@ -297,7 +297,7 @@ fn main() {
있습니다. 러스트는 `deref`를 다시 한번 호출하여 `&String``&str`로 변환하고,
이는 `hello` 함수의 정의와 일치하게 됩니다.

만일 러스트가 역참조 강제 기능을 구현하지 않았다면, 우리는 `&MyBox<String>`
만일 러스트가 역참조 강제 변환 기능을 구현하지 않았다면, 우리는 `&MyBox<String>`
타입의 값을 가지고 `hello` 함수를 호출하는 데 있어 Listing 15-12의 코드 대신
Listing 15-13의 코드를 작성해야 했을 것입니다:

Expand Down Expand Up @@ -332,29 +332,29 @@ fn main() {
}
```

<span class="caption">Listing 15-13: 만일 러스트에 역참조 강제가 없었다면
<span class="caption">Listing 15-13: 만일 러스트에 역참조 강제 변환이 없었다면
우리가 작성했어야 했을 코드</span>

`(*m)``MyBox<String>``String`로 역참조해 줍니다. 그런 다음 `&`
`[..]``hello` 시그니처와 일치되도록 전체 스트링과 동일한 `String`
스트링 슬라이스를 얻습니다. 역참조 강제가 없는 코드는 이러한 모든 기호들이
수반된 상태에서 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제는
스트링 슬라이스를 얻습니다. 역참조 강제 변환이 없는 코드는 이러한 모든 기호들이
수반된 상태에서 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제 변환은
러스트가 우리를 위해 이러한 변환을 자동적으로 다룰 수 있도록 해 줍니다.

`Deref` 트레잇이 관련된 타입에 대해 정의될 때, 러스트는 해당 타입을
분석하여 파라미터의 타입에 맞는 참조자를 얻기 위해 필요한 수만큼의
`Deref::deref`를 사용할 것입니다. `Deref::deref`가 삽입될 필요가 있는
횟수는 컴파일 타임에 분석되므로, 역참조 강제의 이점을 얻는 데에 관해서
횟수는 컴파일 타임에 분석되므로, 역참조 강제 변환의 이점을 얻는 데에 관해서
어떠한 런타임 페널티도 없습니다!

### 역참조 강제가 가변성과 상호작용 하는 법
### 역참조 강제 변환이 가변성과 상호작용 하는 법

불변 참조자에 대한 `*`를 오버 라이딩하기 위해 `Deref` 트레잇을 이용하는
방법과 비슷하게, 러스트는 가변 참조자에 대한 `*`를 오버 라이딩하기 위한
`DerefMut` 트레잇을 제공합니다.

러스트는 다음의 세 가지 경우에 해당하는 타입과 트레잇 구현을 찾았을 때
역참조 강제를 수행합니다:
역참조 강제 변환을 수행합니다:

* `T: Deref<Target=U>`일때 `&T`에서 `&U`
* `T: DerefMut<Target=U>`일때 `&mut T`에서 `&mut U`
Expand Down
2 changes: 1 addition & 1 deletion second-edition/src/ch17-03-oo-design-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ impl Post {
경우중 하나이며, 심지어 컴파일러가 그런 경우를 이해할 수 없더라도 `None`
값이 결코 가능하지 못한 경우입니다.

이 지점에서 우리가 `&Box<State>``content`를 호출할 때, 역참조 강제는
이 지점에서 우리가 `&Box<State>``content`를 호출할 때, 역참조 강제 변환은
`&``Box`에 영향을 줘서 `content` 메소드가 궁극적으로 `State` 트레잇을
구현하는 타입 상에서 호출되도록 합니다. 이는 우리가 `State` 트레잇 정의에
`content`를 추가할 필요가 있음을 의미하고, 이곳이 Listing 17-18처럼
Expand Down
4 changes: 2 additions & 2 deletions src/ch04-03-slices.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,8 @@ fn first_word(s: &String) -> &str {

문자열 슬라이스라면 이를 바로 인수로써 전달할 수 있습니다. `String`이라면
`String`의 슬라이스 혹은 `String`에 대한 참조자를 전달할 수 있습니다.
이러한 유연성은 *역참조 강제 (deref coercions)* 기능을 이용하는데, 15장의
[‘함수와 메서드를 이용한 암묵적 역참조 강제’][deref-coercions]<!--ignore-->절에서
이러한 유연성은 *역참조 강제 변환 (deref coercions)* 기능을 이용하는데, 15장의
[‘함수와 메서드를 이용한 암묵적 역참조 강제 변환][deref-coercions]<!--ignore-->절에서
다룰 것입니다.

`String`에 대한 참조자 대신에 문자열 슬라이스를 매개변수로 하는 함수를 정의하면
Expand Down
6 changes: 3 additions & 3 deletions src/ch08-02-strings.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`일 것입니다.

Expand Down
36 changes: 18 additions & 18 deletions src/ch15-02-deref.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
역참조 연산자가 새로 정의한 타입에서는 참조자처럼 동작하지 않는 이유를
알아보겠습니다. `Deref` 트레이트를 구현하는 것이 스마트 포인터가
참조자와 유사한 방식으로 동작하도록 하는 원리를 탐구해 볼 것입니다.
그리고서 러스트의 *역참조 강제 (deref corecion)* 기능과 이 기능이
그리고서 러스트의 *역참조 강제 변환 (deref corecion)* 기능과 이 기능이
참조자 혹은 스마트 포인터와 함께 동작하도록 하는 방식을 살펴보겠습니다.

> Note: 이제부터 만들려고 하는 `MyBox<T>` 타입과 실제 `Box<T>` 간에는
Expand Down Expand Up @@ -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<T>`와 예제 15-10에서 추가했던 `Deref`의 구현체를
이용해 봅시다. 예제 15-11은 문자열 슬라이스 매개변수를 갖는 함수의
정의를 보여줍니다:
Expand All @@ -220,7 +220,7 @@
`hello` 함수</span>

`hello` 함수는 이를테면 `hello("Rust");`와 같이 문자열 슬라이스를 인수로
호출될 수 있습니다. 예제 15-12에서 보는 바와 같이, 역참조 강제는 `MyBox<String>`
호출될 수 있습니다. 예제 15-12에서 보는 바와 같이, 역참조 강제 변환은 `MyBox<String>`
타입 값에 대한 참조자로 `hello`의 호출을 가능하게 만들어 줍니다:

<span class="filename">파일명: src/main.rs</span>
Expand All @@ -229,7 +229,7 @@
{{#rustdoc_include ../listings/ch15-smart-pointers/listing-15-12/src/main.rs:here}}
```

<span class="caption">예제 15-12: 역참조 강제에 의해 작동되는,
<span class="caption">예제 15-12: 역참조 강제 변환에 의해 작동되는,
`MyBox<String>` 값에 대한 참조자로 `hello` 호출하기</span>

여기서는 `hello` 함수에 `&m` 인수를 넣어 호출하고 있는데, 이것이 `MyBox<String>`
Expand All @@ -240,7 +240,7 @@
러스트는 다시 한번 `deref`를 호출하여 `&String``&str`로 바꾸는데,
이것이 `hello` 함수의 정의와 일치하게 됩니다.

만일 러스트에 역참조 강제가 구현되어 있지 않았다면, `&MyBox<String>`
만일 러스트에 역참조 강제 변환이 구현되어 있지 않았다면, `&MyBox<String>`
타입의 값으로 `hello`를 호출하기 위해서는 예제 15-12의 코드 대신
예제 15-13의 코드를 작성했어야 할 것입니다:

Expand All @@ -250,29 +250,29 @@
{{#rustdoc_include ../listings/ch15-smart-pointers/listing-15-13/src/main.rs:here}}
```

<span class="caption">예제 15-13: 러스트에 역참조 강제가 없었을 경우
<span class="caption">예제 15-13: 러스트에 역참조 강제 변환이 없었을 경우
작성했어야 할 코드</span>

`(*m)``MyBox<String>``String`으로 역참조해 줍니다. 그런 다음 `&`
`[..]`가 전체 문자열과 동일한 `String`의 문자열 슬라이스를 얻어와서 `hello`
시그니처와 일치되도록 합니다. 역참조 강제가 없는 코드는 이 모든 기호가 수반된
상태가 되어 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제는 러스트가
시그니처와 일치되도록 합니다. 역참조 강제 변환이 없는 코드는 이 모든 기호가 수반된
상태가 되어 읽기도, 쓰기도, 이해하기도 더 힘들어집니다. 역참조 강제 변환은 러스트가
프로그래머 대신 이러한 변환을 자동으로 다룰 수 있도록 해 줍니다.

인수로 넣어진 타입에 대해 `Deref` 트레이트가 정의되어 있다면, 러스트는 해당
타입을 분석하고 `Deref::deref`를 필요한 만큼 사용하여 매개변수 타입과
일치하는 참조자를 얻을 것입니다. `Deref::deref`가 추가되어야 하는 횟수는
컴파일 타임에 분석되므로, 역참조 강제의 이점을 얻는 데에 관해서 어떠한
컴파일 타임에 분석되므로, 역참조 강제 변환의 이점을 얻는 데에 관해서 어떠한
런타임 페널티도 없습니다!

### 역참조 강제가 가변성과 상호작용하는 법
### 역참조 강제 변환이 가변성과 상호작용하는 법

`Deref` 트레이트를 사용하여 불변 참조자에 대한 `*`를 오버라이딩하는 방법과
비슷한 방식으로, `DerefMut` 트레이트를 사용하여 가변 참조자에 대한 `*` 연산자를
오버라이딩할 수 있습니다.

러스트는 다음의 세 가지 경우에 해당하는 타입과 트레이트 구현을 찾았을 때
역참조 강제를 수행합니다:
역참조 강제 변환을 수행합니다:

* `T: Deref<Target=U>`일 때 `&T`에서 `&U`
* `T: DerefMut<Target=U>`일 때 `&mut T`에서 `&mut U`
Expand All @@ -281,7 +281,7 @@
처음 두 가지 경우는 두 번째가 가변성을 구현했다는 점을 제외하면 동일합니다.
첫 번째 경우는 어떤 `&T`가 있는데, `T`가 어떤 타입 `U`에 대한 `Deref`
구현했다면, 명료하게 `&U`를 얻을 수 있음을 기술하고 있습니다. 두 번째 경우는
동일한 역참조 강제가 가변 참조자에 대해서도 발생함을 기술합니다.
동일한 역참조 강제 변환이 가변 참조자에 대해서도 발생함을 기술합니다.

세 번째 경우는 좀 더 까다로운데, 러스트는 가변 참조자를 불변 참조자로 강제할
수도 있습니다. 하지만 그 역은 *불가능하며*, 불변 참조자는 가변 참조자로
Expand Down
2 changes: 1 addition & 1 deletion src/ch17-03-oo-design-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@
입니다.

이 시점에서 `&Box<dyn State>``content`가 호출되면, `&``Box`
역참조 강제가 적용되어, `content` 메서드는 궁극적으로 `State`
역참조 강제 변환이 적용되어, `content` 메서드는 궁극적으로 `State`
트레이트를 구현하는 타입에서 호출될 것입니다. 이는 즉 `State` 트레이트
정의에 `content`를 추가해야 함을 뜻하고, 예제 17-18처럼
가지고 있는 상태에 따라 어떤 내용물을 반환할지에 대한 로직을
Expand Down

0 comments on commit 11063e0

Please sign in to comment.