자바스크립트 중첩 함수(Nested Function)

자바스크립트는 함수를 다른 함수 내에서 정의하고 사용할 수 있는 중첩 함수(nested function) 기능을 제공합니다. 중첩 함수는 코드의 구조적으로 응집력을 높일 수 있으며, 변수를 캡슐화하고 코드를 더욱 모듈화할 수 있는 이점을 제공합니다. 이번 글에서는 자바스크립트의 중첩 함수에 대해 알아보겠습니다.

중첩 함수의 정의

중첩 함수는 함수 내부에 정의되고, 해당 함수 내부에서만 사용될 수 있는 함수입니다. 중첩 함수는 외부 함수의 스코프(lexical scope)에 접근할 수 있으며, 외부 함수의 변수와 매개변수를 사용할 수 있습니다.

function outerFunction() {
  // 외부 함수 내부에서 중첩 함수 정의
  function innerFunction() {
    // 중첩 함수의 코드
  }

  // 중첩 함수 호출
  innerFunction();
}

중첩 함수의 활용 예시

중첩 함수는 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. 그렇다면 중첩 함수가 어떻게 유용하게 활용될 수 있는지 살펴보겠습니다.

1. 변수 캡슐화

중첩 함수는 외부 함수의 스코프에 접근할 수 있기 때문에, 외부 함수의 변수를 캡슐화할 수 있습니다. 이를 통해 변수의 접근 범위를 제한하고, 변수의 의도치 않은 변경을 방지할 수 있습니다.

function calculator() {
  let result = 0;

  function add(num) {
    result += num;
  }

  function subtract(num) {
    result -= num;
  }

  function getResult() {
    return result;
  }

  return {
    add,
    subtract,
    getResult
  };
}

const calc = calculator();
calc.add(5);
calc.subtract(2);
console.log(calc.getResult()); // 출력: 3

위 예시에서 calculator 함수는 add, subtract, getResult 세 개의 중첩 함수를 반환합니다. 중첩 함수들은 result 변수에 접근하여 값을 변경하거나 반환하는 역할을 수행합니다. 이를 통해 result 변수의 값을 외부에서 직접 접근하는 것을 방지하고, 계산기의 독립적인 동작을 보장합니다.

2. 모듈화된 코드 구조

중첩 함수를 사용하면 코드를 모듈화하고, 각각의 기능을 분리하여 작성할 수 있습니다. 이는 코드의 가독성과 재사용성을 향상시킵니다.

function userModule() {
  let username = '';

  function setUsername(name) {
    username = name;
  }

  function getUsername() {
    return username;
  }

  function greet() {
    console.log(`Hello, ${username}!`);
  }

  return {
    setUsername,
    getUsername,
    greet
  };
}

const user = userModule();
user.setUsername('John Doe');
user.greet(); // 출력: Hello, John Doe!

위 예시에서 userModule 함수는 사용자 정보를 관리하기 위한 중첩 함수들을 반환합니다. setUsername, getUsername, greet 함수들은 각각 사용자 이름을 설정하고 조회하며, 인사말을 출력하는 역할을 수행합니다. 이를 통해 사용자 모듈의 관련 기능들을 한 곳에 모아놓고, 필요한 곳에서 모듈을 가져와서 사용할 수 있습니다.

결론

자바스크립트의 중첩 함수는 코드의 구조적 응집력을 높이고, 변수를 캡슐화하여 모듈화된 코드 구조를 구현할 수 있도록 도와줍니다. 중첩 함수를 적절히 활용하면 가독성 좋은 코드를 작성할 수 있고, 코드 유지보수성을 높일 수 있습니다.

중첩 함수는 자바스크립트의 강력한 기능 중 하나이므로, 적절하게 사용해 보시기 바랍니다. Happy coding!