Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[노예찬] 챕터 10: 일급 함수 1 #58

Merged
merged 1 commit into from
May 23, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions 챕터_10/노예찬.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
10장에서는 처음으로 일급에 대한 개념을 소개하고 있다. 일급의 개념을 본격적으로 먼저 소개하지는 않는다. 특정한 상황을 소개하고, 그 상황을 해결해나가는 과정 속에서 일급의 중요성과 그것을 다루는 방식에 대해서 설명하고 있다.

크게는 2가지 리팩토링 기법을 소개하면서, 그 가운데서 일급의 개념을 설명한다.

- 암묵적 인자를 드러내기(express implicit argument)
- 함수 본문을 콜백으로 바꾸기(replace body with callback)

각각의 리팩토링 기법을 알아보면서, 그 가운데 나타난 일급의 개념을 이해한다면 책의 내용을 제대로 이해한 것이라고 볼 수 있을 것 같다.

## 1. 암묵적 인자를 드러내기 Express implicit argument

이 리팩터링 기법은 아래와 같이 수행한다.

> 암묵적 인자가 일급 값이 되도록 함수에 인자를 추가합니다. 이렇게 하면 잠재적 중복을 없애고 코드의 목적을 더 잘 표현할 수 있습니다. p.234

이 리팩터링을 사용하는 이유는 2가지다.

1. 잠재적 중복을 없앤다.
2. 코드의 목적을 더욱 분명하게 표현한다.

이것을 적용하는 방법은 다음과 같다.

예를 들어, setPriceByName, setQuantityByName, setShippingByName과 같은 함수들이 있다고 해보자. 여기서 prcie, quantity, shipping 과 같은 맥락만 제외하면 함수 본문에서 공통적인 동작을 하고 있다는 사실을 확인할 수 있다.

딱 저 구체적인 price, quantity, shipping 의 부분만 맥락에 따라서 변경된다. 그렇다면 맥락을 제거한 상태에서의 동작을 정의하고, 맥락에 따라서 동작을 적용할 수 있도록 변경해주면 된다.

setFieldByName(field) 이런 방식으로 변경할 수 있다. 이제 이 함수는 아주 일반적인 함수로 입력받은 field 값을 이름으로 지정해주는 동작을 한다.

### '암묵적 인자를 드러내기' 에서 나타난 일급의 개념

일급이란 값으로 다룰 수 있는 것을 가리킨다. 값으로 다룰 수 없는 것이 있는데, + - 연산자나, for-swich와 같은 키워드들은 값으로 다룰 수가 없다.

특히 책에서 소개하는 내용 중 setPriceByName이라는 함수에서 Price에 대한 부분, 그러니까 함수의 이름에 해당하는 부분은 우리가 값으로 다룰 수가 없다. 하지만, 이것을 값으로 다룰 수 있게 만들어주는 것이 우리가 배운 리팩터링 기법이다. 해당 기법은 이름에 해당하는 영역을 명시적으로 인자에 추가함으로써, 그것을 일급 값으로 만들었다.

이렇게 일급 값으로 다룰 수 있게 되면, 함수가 훨씬 더 유연해지고 다양한 곳에서 사용할 수 있다는 장점이 있다.

## 2. 함수 본문을 콜백으로 바꾸기 Replace body with callback

이 리팩터링 기법은 아래와 같이 수행한다.

> 함수 본문에 어떤 부분을 콜백으로 바꿉니다. 이렇게 하면 일급 함수로 어떤 함수에 동작을 전달할 수 있습니다. p. 234

이 기법을 적용하고나면 얻을 수 있는 이점은 다음과 같다.

- 중복을 줄일 수 있다.
- 함수의 동작을 콜백으로 받음으로써 유연하게 만들 수 있다.

여러 함수를 살펴보았더니, 공통된 동작을 하는 구현이 있으면 해당 부분을 함수로 뽑아낸다. 그리고 맥락에 따라서 다른 동작을 하는 부분은 콜백으로 받아서 수행하도록 만든다.

### '함수 본문을 콜백으로 바꾸기' 에서 나타난 일급의 개념

- 특정 구현사항도 일급으로 만들 수 있다. 해당 구현을 함수로 만들면 된다. 대부분의 언어에서 함수를 일급으로 다루고 있고, js에서도 마찬가지로 함수를 일급으로 다루고 있다. 이것을 일급 함수라고 부른다. 일급 함수가 되었다는 것은 여타 다른 변수와 마찬가지로 값으로 다룰 수 있게 되었다는 말이다.
- 값으로 다룰 수 있게 되었다는 것은 함수의 인자로 넘길 수 있다는 말이다.
- 함수에 다른 함수를 넘기는 것, 그러니까 다른 함수를 인자로 받을 수 있도록 만든 함수를 우리는 고차 함수라고 말한다.

> 일급은 인자로 전달할 수 있다는 말입니다. 그리고 고차라는 말은 함수가 다른 함수를 인자로 받을 수 있다는 말입니다. 일급 함수가 없다면 고차 함수를 만들 수 없습니다. p.252

---

이렇게 정리하고 보니 두 리팩터링 기법에서 공통점과 차이점이 보이는 것 같다.

- 공통점
- 함수에서 공통된 부분을 정의하고, 그것을 맥락에 얽매이지 않는 일반적인 함수로 만든다.
- 맥락에 해당하는 부분은 명시적으로 인자로 받도록 만든다.
- 차이점
- '암묵적 인자를 드러내기'에서는 우리가 일반적으로 이야기하는 '값'에 대한 부분을 일급으로 승격시키려고 한다.
- '함수 본문을 콜백으로 바꾸기' 에서는 특정한 구현에 대한 부분을 일급으로 승격시키려고 한다.

결국 두 리팩터링 기법에서 가장 중요한 부분은 일급의 개념을 이해하는 것이고, 무엇을 일급으로 뽑아낼 것인가를 볼 수 있는 시선을 갖추는 것이 중요하다고 여겨진다.
Loading