함수(Function)

2022-03-09 · 2 min read

요약

프로그래밍에서 함수코드의 재사용을 위해 특정한 동작을 수행하는 코드를 묶어 하나의 실행 단위로 만든 것을 말합니다.

함수를 정의하는 방법으로는 크게 함수 선언문함수 표현식이 있습니다.

  • 함수 선언문: function 키워드로 시작하여 함수를 정의합니다. 런타임 이전에 함수 객체를 생성합니다.
  • 함수 표현식: 변수에 함수 리터럴을 할당하는 형태로 함수를 정의합니다. 런타임 시점에 함수 객체를 생성합니다.

함수

프로그래밍에서 함수(function)란 특정한 동작을 수행하는 코드를 묶어 하나의 실행 단위로 만든 것을 말합니다. 일반적으로 함수의 구성은 다음과 같습니다.

function

  • 함수명: 함수를 호출하기 위해 사용되는 식별자(identifier)
  • 매개변수(parameter): 함수에 정의된, 외부로부터 전달받을 변수
  • 인수(argument): 함수의 입력값
  • 반환값(return value): 함수의 출력값

함수는 동일한 작업을 반복적으로 해야할 때, 코드의 중복을 줄이고 재사용성을 높이기 위해 사용합니다. 이는 코드의 유지보수성과 신뢰성을 높이는 효과가 있습니다.

함수 리터럴

JavaScript에서 함수는 함수 객체 타입의 값이기 때문에 리터럴로 생성할 수도 있습니다. 함수 리터럴은 function 키워드, 함수명, 매개변수 목록, 함수 몸체로 구성된다. 함수 리터럴의 이름은 생략할 수 있는데, 이름이 있는 함수를 기명 함수(named function), 이름이 없는 함수를 익명 함수(anonymous function)라고 합니다.

// 변수에 익명 함수 리터럴을 할당
const sayHello = function () {
  console.log('hello world!');
};

함수 리터럴은 평가된 결과로 함수 객체를 생성하기 때문에 변수에 할당할 수도 있습니다.

또한 기본적으로 함수의 이름은 함수 자신의 내부에서만 참조할 수 있는 식별자입니다. 따라서 다음과 같은 경우에는 오류가 발생합니다.

const foo = function bar() {};
bar(); // bar is not defined

함수 선언문과 함수 표현식

함수를 정의하는 방법으로는 크게 함수 선언문함수 표현식이 있습니다. Function 생성자 함수를 이용하는 방법도 있지만 권장되지 않습니다.

함수 선언문

함수 선언문(function declaration)function 키워드로 시작하여 함수를 정의합니다.

function add(a, b) {
  return a + b;
}

함수 선언문은 함수명을 생략하지 않은 기명 함수 리터럴과 형태가 동일한데, 코드 맥락에 따라서 자바스크립트 엔진이 함수 선언문 혹은 리터럴로 해석합니다.

  • 기명 함수 리터럴이 단독으로 사용되는 경우(즉 피연산자로 사용되지 않는 경우) 함수 선언문으로 해석합니다.
  • 피연산자로 사용되거나 변수에 할당할 경우에는 함수 리터럴로 해석합니다.

또한 본래 함수명은 해당 함수의 내에서만 참조 가능한 식별자입니다. 하지만 함수 선언문으로 정의된 함수는 함수 외부에서도 호출할 수 있어야 합니다. 따라서 자바스크립트 엔진은 함수 선언문에 의해 함수 객체가 생성될 때, 암묵적으로 함수명과 동일한 식별자를 생성하고 여기에 함수 객체를 할당합니다.

함수 표현식

함수 표현식(function expression)이란 변수에 함수 리터럴을 할당하여 함수를 정의하는 것을 말합니다. 기명 함수 리터럴을 써도 되지만 함수 표현식에서 함수명은 의미가 없으므로 일반적으로 익명 함수를 사용합니다.

const add = function (a, b) {
  return a + b;
};

함수 선언문과 함수 표현식의 가장 큰 차이점은 함수 객체의 생성 시점입니다.

  • 함수 선언문은 코드가 해석되는 시점(즉 런타임 이전)에 함수 객체를 생성합니다.
  • 함수 표현식은 변수의 값이므로 런타임에 실행 흐름이 함수의 정의에 도달했을 때 생성됩니다.

참고 자료

Copyright 2022-2024.hanse-kimAll right reserved.