함수

프로그래밍의 함수는 수학에서의 함수와 그 뜻이 동일하다. 입력값(input)을 받아 출력값(output)을 내보내는 일련의 과정을 함수하고 한다.

함수 정의의 종류

함수는 함수 정의(function defination)를 통해 생성되고 함수 호출(function call/invoke)을 통해 실행된다. 함수를 정의하는 방법과 특징은 다음과 같다.

  1. 함수 선언식
  • 호이스팅 발생
  • 전역/ 함수 스코프에서 사용 가능
function add(a, b) {
  return a + b;
}
  1. 함수 표현식
  • 호이스팅 발생 안함
  • 어디서든 사용 가능
const multiply = function(a, b) {
  return a * b;
};
  1. 화살표 함수
  • this 바인딩이 상위 컨텍스트에 상속됨
const divide = (a, b) => a / b;
  1. 메서드 단축 문법
  • 객체 내부에서만 사용 가능
  • super 키워드를 통해 부모 객체의 프로토타입에 접근 가능(코드 재사용성이 향상됨)
const calculator = {
  square(x) {  // = square: function(x) {}
    return x ** 2;
  }
};
  1. Function 생성자 함수
  • 일반적인 개발에서 사용되지 않음
  • 런타임에 동적으로 함수 생성이 가능
  • 서버에서 받은 로직을 동적으로 실행해야 하는 경우 사용됨
// 생성자 함수 정의
const sum = new Function('a', 'b', 'return a + b');

console.log(sum(2, 3)); // 5

// 동적 함수 생성 예시
const operation = 'multiply';
const dynamicFunc = new Function(
  'x', 
  'y', 
  `return x ${operation === 'multiply' ? '*' : '+'} y`
);

console.log(dynamicFunc(4, 5)); // 20

함수를 사용해야 하는 이유

함수의 장점:

  • 함수로 한 번 정의한 코드를 여러 곳에서 재사용 가능
  • 함수명으로 코드의 의도를 명시 가능
  • 함수 내부를 수정하면 모든 호출처에 반영됨
  • 기능 단위로 분할이 가능
  • 함수 단위의 격리 테스트가 가능
  • 모듈화가 가능하므로 협업이 효율적

함수 호출의 조건

함수를 정상적으로 호출하고 결과를 얻기 위해선 매개변수, 인수, 반환문 간의 관계를 이해해야 한다.

  • 매개변수: 함수가 입력을 받기 위해 선언한 변수
    - 기본값 설정 가능, 초과된 인수 무시
  • 인수: 함수 호출 시 실제로 전달받는 값
    - 모든 데이터 타입 전달 가능, 원시값은 값 전달, 객체는 참조 전달
  • 반환문의 동작: 함수 실행 결과를 외부로 전달함
    - return이 없으면 undefined를 대신 전달, 실행 즉시 함수 종료

순수 함수

함수를 호출할 때 인수로 객체를 전달하면 참조 전달이 이루어진다. 이때문에 함수 내부에서 객체를 수정하면, 이 변경사항이 원본 객체에도 동일하게 발생한다. 이를 방지하기 위해서는 원본 객체를 직접 전달하지 않고 깊은 복사가 이루어진 새로운 객체를 인수로 전달해야 한다.

그리고 이처럼 외부 상태를 변경하지 않고 외부 상태에 의존하지도 않는 함수를 순수 함수라고 부른다. 즉, 동일한 입력에 대해 동일한 출력을 보장하는 함수다.

다양한 함수의 형태와 사용 목적

  • 즉시 실행 함수: 함수 정의와 동시에 호출되는 함수.
    - 즉시 실행되고 가비지 컬렉션에 의해 초기화가 되어야만 하는 경우에 사용
  • 재귀 함수: 자기 자신을 호출하는 함수
    - 반복되는 처리를 위해 사용
  • 중첩 함수: 함수 내부에 정의된 함수
    - 복잡한 함수를 하위 작업 단위로 분할하거나 캡슐화가 필요할 때 사용
  • 콜백 함수: 다른 함수의 매개변수로 전달되는 함수
    - 비동기 처리나 고차 함수에서 동작을 제어해야 할 때 사용
profile
개발 공부 내용을 포스팅 중입니다.

0개의 댓글