10~11장. 일급 함수
1. 코드의 냄새 감지하기 : 함수 이름에 있는 암묵적 인자
- 함수 이름에 있는 암묵적 인자 특징
- 함수 구현이 거의 똑같음
- 함수 이름이 구현의 차이를 만듦
2. 리팩터링 : 암묵적 인자 드러내기
리팩터링 단계
- 함수 이름에 있는 암묵적 인자를 확인
- 명시적인 인자 추가
- 함수 본문에 하드 코딩된 값을 새로운 인자로 바꿈
- 함수를 호출하는 곳을 고침
- 즉, 암묵적인 것은 명시적으로 바꾼다는 것
- 리팩터링 후, 암묵적인 이름은 인자로 넘길 수 있는 값이 됨 → 일급
⇒ 일급 필드를 사용하면 코드에 자바스크립트를 너무 많이 사용하는 것 같아요
← 중요한 것은 데이터 그대로 사용해, 여러 가지 방법으로 데이터를 활용할 수 있다는 점
→
데이터 지향
- 일급 함수를 인자로 받는 함수로 만들어 줄 것이다 → 고차 함수
- 일급 : 인자로 전할 수 있다
- 고차 : 함수가 다른 함수를 인자로 받을 수 있다 ⇒ 일급 함수가 없다면 고차 함수를 만들 수 없다.
// 고차함수 forEach() function forEach(arr, f) { for (let i = 0; i < arr.length; i++) { const item = arr[i]; f(item); } }
3. 리팩터링 : 함수 본문을 콜백으로 바꾸기
리팩터링 단계
- 함수 본문에서 바꿀 부분의 앞부분과 뒷부분을 확인
- 리팩터링 할 코드를 함수로 빼냄
- 빼낸 함수의 인자로 넘길 부분을 또 다른 함수로 빼냄
- 함수 본문에 어떤 부분(비슷한 함수에 있는 서로 다른 부분)을 콜백으로 바꿈 → 일급 함수로 어떤 함수에 동작 전달 ⇒ 원래 있던 코드를 고차 함수로 만드는 강력한 방법
- 함수를 정의하고 전달할 때는 익명함수로 전달
- 익명 함수는 이름이 없는 함수로, 보통 필요한 곳에서 인라인으로 정의함
- 왜 함수로 감싸서 넘기나요? ← 코드가 바로 실행되면 안되기 때문. 감싼 함수를 호출하기 전까지 실행되지 않음
용어 설명
일급
: 언어에 있는 다른 값처럼 쓸 수 있음데이터 지향
: 이벤트와 엔티티에 대한 사실을 표현하기 위해 일반 데이터 구조를 사용하는 프로그래밍 형식 ☑️ 데이터 지향 ISSUE (opens in a new tab) 내용 정리- 데이터는 기본 형태의 데이터로 두고, 실제 개발은 위에 인터페이스를 잘 쌓아서 사용하라
- 기본적인 데이터 형태로 남아있을 경우, 다양한 방법을 통해 편리하게 이용 가능
- 다만 해당 개념은 은닉화(캡슐레이션)가 기본이 되는 OOP와는 차이가 있음
고차 함수
: 인자로 함수를 받거나 리턴값으로 함수를 리턴할 수 있는 함수콜백
: 자바스크립트에서 인자로 전달하는 함수
+ 이야기해보기
📍 데이터지향과 OOP(Object Oriented Programming: 객체지향프로그래밍)
객체지향프로그래밍은 독립적인 단위에 데이터와 해당 데이터를 다루는 메서드를 묶어 프로그래밍하는 것으로, 객체 외부에서 객체 내부의 자료에 직접 접근을 제한하고, 메서드를 통해 상호작용하도록 설계된다.
4가지 특징으로는 추상화, 상속, 다형성, 캡슐화가 있다.
-
추상화 : 공통의 속성이나 기능을 묶어 이름을 붙이는 것
-
상속 : 상위 개념의 특징을 하위 개념이 물려받는 것
-
다형성 : 부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩되어 사용되는 것
-
캡슐화 : 데이터 구조와 데이터를 다루는 방법들을 결합시켜 묶는 것
→ 실제로 구현되는 부분을 외부에 드러나지 않도록(은닉화) 캡슐로 감싸, 이용 방법만을 알려줌
은닉화
: 캡슐화의 한 개념으로 객체 외부에서 객체 내의 자료로의 접근을 제한하고 데이터를 수정,조작하는 동작은 내부에 두고 접근(getter),설정(setter)하는 메소드로 결과만 받는것
데이터지향은 데이터를 기본 형태로 두고, 인터페이스를 통해 데이터에 접근하거나 조작하는 식으로 설계된다.
=> 내가 이해한 결론(요약) :
객체지향프로그래밍과 데이터지향 모두 데이터를 기본 형태로 두고, 인터페이스를 통해서 접근하도록 설계되어 있지만, 두 개념은 ‘은닉성’에서 차이가 있다.
객체지향의 경우 객체 외부에서 객체 내부의 자료에 ‘직접’적으로 접근하는 것을 제한하지만, 데이터지향에서는 은닉화에 큰 중점을 두지 않는다. 직접적인 접근을 피할 수 있지만, 이를 강제하지는 않는다.
질문
- 자바스크립트 forEach 메소드 역시 고차함수인데, 이를 활용하지 않고 새로 forEach() 함수를 만들어야 하는 이유가 있을까요? (map, filter, reduce도 마찬가지임)
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
/**
* 배열의 각 요소에서 정의된 콜백 함수를 호출하고 결과가 포함된 배열을 반환합니다.
* @param callbackfn 최대 3개의 인수를 받아들이는 함수이다. 맵 방식은 배열의 각 요소에 대해 콜백 fn 함수를 한 번 호출한다.
* @param thisArg 이 키워드가 콜백 fn 함수에서 참조할 수 있는 개체입니다. 이 Arg가 생략되면 이 값으로 undefined가 사용됩니다.
*/