10~11장. 일급 함수

1. 코드의 냄새 감지하기 : 함수 이름에 있는 암묵적 인자

  • 함수 이름에 있는 암묵적 인자 특징
    1. 함수 구현이 거의 똑같음
    2. 함수 이름이 구현의 차이를 만듦

2. 리팩터링 : 암묵적 인자 드러내기

리팩터링 단계

  1. 함수 이름에 있는 암묵적 인자를 확인
  2. 명시적인 인자 추가
  3. 함수 본문에 하드 코딩된 값을 새로운 인자로 바꿈
  4. 함수를 호출하는 곳을 고침
  • 즉, 암묵적인 것은 명시적으로 바꾼다는 것
  • 리팩터링 후, 암묵적인 이름은 인자로 넘길 수 있는 값이 됨 → 일급 ⇒ 일급 필드를 사용하면 코드에 자바스크립트를 너무 많이 사용하는 것 같아요 ← 중요한 것은 데이터 그대로 사용해, 여러 가지 방법으로 데이터를 활용할 수 있다는 점 → 데이터 지향
  • 일급 함수를 인자로 받는 함수로 만들어 줄 것이다 → 고차 함수
    • 일급 : 인자로 전할 수 있다
    • 고차 : 함수가 다른 함수를 인자로 받을 수 있다 ⇒ 일급 함수가 없다면 고차 함수를 만들 수 없다.
    // 고차함수 forEach()
    function forEach(arr, f) {
      for (let i = 0; i < arr.length; i++) {
        const item = arr[i];
        f(item);
      }
    }

3. 리팩터링 : 함수 본문을 콜백으로 바꾸기

리팩터링 단계

  1. 함수 본문에서 바꿀 부분의 앞부분과 뒷부분을 확인
  2. 리팩터링 할 코드를 함수로 빼냄
  3. 빼낸 함수의 인자로 넘길 부분을 또 다른 함수로 빼냄
  • 함수 본문에 어떤 부분(비슷한 함수에 있는 서로 다른 부분)을 콜백으로 바꿈 → 일급 함수로 어떤 함수에 동작 전달 ⇒ 원래 있던 코드를 고차 함수로 만드는 강력한 방법
  • 함수를 정의하고 전달할 때는 익명함수로 전달
    • 익명 함수는 이름이 없는 함수로, 보통 필요한 곳에서 인라인으로 정의함
    • 왜 함수로 감싸서 넘기나요? ← 코드가 바로 실행되면 안되기 때문. 감싼 함수를 호출하기 전까지 실행되지 않음

용어 설명

  • 일급 : 언어에 있는 다른 값처럼 쓸 수 있음
  • 데이터 지향 : 이벤트와 엔티티에 대한 사실을 표현하기 위해 일반 데이터 구조를 사용하는 프로그래밍 형식 ☑️ 데이터 지향 ISSUE (opens in a new tab) 내용 정리
    • 데이터는 기본 형태의 데이터로 두고, 실제 개발은 위에 인터페이스를 잘 쌓아서 사용하라
    • 기본적인 데이터 형태로 남아있을 경우, 다양한 방법을 통해 편리하게 이용 가능
    • 다만 해당 개념은 은닉화(캡슐레이션)가 기본이 되는 OOP와는 차이가 있음
  • 고차 함수 : 인자로 함수를 받거나 리턴값으로 함수를 리턴할 수 있는 함수
  • 콜백 : 자바스크립트에서 인자로 전달하는 함수

+ 이야기해보기

📍 데이터지향과 OOP(Object Oriented Programming: 객체지향프로그래밍)

객체지향프로그래밍은 독립적인 단위에 데이터와 해당 데이터를 다루는 메서드를 묶어 프로그래밍하는 것으로, 객체 외부에서 객체 내부의 자료에 직접 접근을 제한하고, 메서드를 통해 상호작용하도록 설계된다.

4가지 특징으로는 추상화, 상속, 다형성, 캡슐화가 있다.

  1. 추상화 : 공통의 속성이나 기능을 묶어 이름을 붙이는 것

  2. 상속 : 상위 개념의 특징을 하위 개념이 물려받는 것

  3. 다형성 : 부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩되어 사용되는 것

  4. 캡슐화 : 데이터 구조와 데이터를 다루는 방법들을 결합시켜 묶는 것

    → 실제로 구현되는 부분을 외부에 드러나지 않도록(은닉화) 캡슐로 감싸, 이용 방법만을 알려줌

    • 은닉화 : 캡슐화의 한 개념으로 객체 외부에서 객체 내의 자료로의 접근을 제한하고 데이터를 수정,조작하는 동작은 내부에 두고 접근(getter),설정(setter)하는 메소드로 결과만 받는것

데이터지향은 데이터를 기본 형태로 두고, 인터페이스를 통해 데이터에 접근하거나 조작하는 식으로 설계된다.


=> 내가 이해한 결론(요약) :

객체지향프로그래밍과 데이터지향 모두 데이터를 기본 형태로 두고, 인터페이스를 통해서 접근하도록 설계되어 있지만, 두 개념은 ‘은닉성’에서 차이가 있다.

객체지향의 경우 객체 외부에서 객체 내부의 자료에 ‘직접’적으로 접근하는 것을 제한하지만, 데이터지향에서는 은닉화에 큰 중점을 두지 않는다. 직접적인 접근을 피할 수 있지만, 이를 강제하지는 않는다.


질문

  1. 자바스크립트 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가 사용됩니다.
 */