Javascript – 중첩함수(Nested Function)

Javascript – 중첩함수(Nested Function)

일반적으로 함수 자체는 반복적인 작업을 하나의 명령어로 정리하는데 의미가 있다.
좀 더 나아게 , 반복적인 작업으로 분리 해 내면서  종속성을 줄이고, 물리적인 파일의
분리또한 가능하게 한다. 하지만 반대로, 코드의  간결성을 위해  어떠한 작업내에  1회성 또는,, 반복성 (그 함수 안에서 말고는 사용하지 않을때) 이 필요한 함수의 경우 함수안 함수( Nested Function) 정의하여 종속관계처럼 표현 할 수 있다.

아래  두자리의 + , – , /  , *  을  수행 하는 계산기를 함수로 작성한다고 생각해보자
아래는 모두 “외부함수” 로만 이루어져 있다. 그래서 서로 호출이 가능(같은 Scope)


function calculator ( cmd , a , b)
{

let rtnValue;
swtich(cmd)
{

case “A” : rtnValue = add(a,b); break;
case “S” : rtnValue = substract(a,b); break;
case “M” : rtnValue = multiply(a,b); break;
case “D” : d rtnValue =  ivide(a,b); break;

}

}

// calculator 에서 필요한 4가지 계산법을 함수로 구현

function add ( a , b) {  return a + b;  }
function subtract( a, b) { return a – b; }
function multiply (a , b) { return a * b;}
function divide (a ,b ) { return a/b; }

// setMemberJob 외부함수
function setMemberInfo(s)
{
     // 무언가를 처리 , 필요하면 add , subtract , mutiply , divide 호출가능하다.
}

허접한 예제지만,, 만약 위와  같은 함수있다고 하면,
아래와 같이 일반적으로 사용하게된다.


let tmpValue;


tmpValue = calculator( “A” , 10, 40);

tmpValue = calculator( “M” , 10, 40);

문제는  add ,substract multitply , divide  의 경우 함수 calculator 함수 에서만 사용됨에도 불구하고 위와같이  작성하는게 일반적이었다.

하지만 중첩함수(Nested Fucntion) 방법을 사용하면 함수 끼리의 포함이 가능하며,,
포함된 함수내에서 만! 접근이 가능해지는.. 안정정과 간결함이 한번에 해결된다.

function calculator ( cmd , a , b)  // 외부함수
{

let rtnValue;
swtich(cmd)
{

case “A” : rtnValue = add(a,b); break;
case “S” : rtnValue = substract(a,b); break;
case “M” : rtnValue = multiply(a,b); break;
case “D” : d rtnValue =  ivide(a,b); break;

}

function add ( a , b) {    return a + b; }     // 내부함수
function subtract( a, b) { return a – b; }    // 내부함수
function multiply (a , b) { return a * b;}    // 내부함수
function divide (a ,b ) { return a/b; }        // 내부함수

}

function setAge(s)  // 외부함수
{

return add(“A” , s , 10);   //  호출불가!!

}

위와같이calculator 함수에서 호출한 함수 add, sub, mul , div 등이 다른함수에 쓰이지않고 단지 calculator  함수내에 반복되어 사용되거나(역설적으로 다른함수에서는 사용불가) 또는 간결한 코드를 위해 만들어진 계산식이라면,

calculator  함수 내부에 관련된 함수를 코드들과 같이(중첩) 으로 두어 간결함과, 함수 목적의 모호성(?)을 조금 해소 할 수 있다.

정리

중첩함수(Nested Funtion)
처리코드들고 함게 함수 내부에 함수를 둘 수 있다.
이때,  내부함수를 포함하는 최초 실행되는 함수를 “외부함수” 그안에 있는
함수를 “내부함수”로 부른다.

function test()      “외부함수”
{

let a,b;
a = 10;

function in_test1() { ~ }   “내부함수”
function in_test2() { ~ }   “내부함수”

}


함수의 이름이 같아도 오류가 발생하지않음(단, 사용하는것은 당연 비추)
해당 함수 외부에서 내부 함수 호출 불가

function init()    // main  “외부함수”
{
    console.log(“main init”)

    init();  // sub 의 init() 호출

    function init(){    // sub  “내부함수”
        console.log(“sub init”);

    }

    function init2(){      // sub “내부함수”
        console.log(“sub init2”);
    }
}

init(); // 너무 당연하지만 main 의 init 을 호출한다.

main init
sub init
순서대로 출력

init2(); // 오류 이것도 당연하지만 내부 init2() 호출은 불가  – 기본 scope 문제

참고로 , function 과  function 외에 내부함수 for , if 등 (javascript 에 미리정의 된 함수)
에서도 당연히 사용이 가능하며 같은  규칙을 적용받는다.

if (a > 100)
{

function checkNum(getVal)
{

if ( getVal % 2 == 0)

console.log(“짝수”);

else

console.log(“홀수”);

}
checkNum(a);

}

답글 남기기

이메일 주소는 공개되지 않습니다.