diff --git "a/\354\261\225\355\204\260_10/\353\205\270\354\230\210\354\260\254.md" "b/\354\261\225\355\204\260_10/\353\205\270\354\230\210\354\260\254.md" new file mode 100644 index 0000000..4f90e3a --- /dev/null +++ "b/\354\261\225\355\204\260_10/\353\205\270\354\230\210\354\260\254.md" @@ -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 + +--- + +이렇게 정리하고 보니 두 리팩터링 기법에서 공통점과 차이점이 보이는 것 같다. + +- 공통점 + - 함수에서 공통된 부분을 정의하고, 그것을 맥락에 얽매이지 않는 일반적인 함수로 만든다. + - 맥락에 해당하는 부분은 명시적으로 인자로 받도록 만든다. +- 차이점 + - '암묵적 인자를 드러내기'에서는 우리가 일반적으로 이야기하는 '값'에 대한 부분을 일급으로 승격시키려고 한다. + - '함수 본문을 콜백으로 바꾸기' 에서는 특정한 구현에 대한 부분을 일급으로 승격시키려고 한다. + +결국 두 리팩터링 기법에서 가장 중요한 부분은 일급의 개념을 이해하는 것이고, 무엇을 일급으로 뽑아낼 것인가를 볼 수 있는 시선을 갖추는 것이 중요하다고 여겨진다.