Main Content

중첩 함수

중첩 함수란?

중첩 함수는 부모 함수 내에 완전히 포함되는 함수입니다. 프로그램 파일 내에 있는 모든 함수는 중첩 함수를 가질 수 있습니다.

예를 들어, 아래 parent라는 함수는 nestedfx라는 중첩 함수를 포함합니다.

function parent
disp('This is the parent function')
nestedfx

   function nestedfx
      disp('This is the nested function')
   end

end

중첩 함수와 다른 유형의 함수 간의 주요 차이점은 중첩 함수는 부모 함수에 정의된 변수에 액세스하고 수정할 수 있다는 점입니다. 그 결과, 다음과 같은 이점이 있습니다.

  • 중첩 함수는 입력 인수에 명시적으로 전달되지 않은 변수를 사용할 수 있습니다.

  • 부모 함수에 중첩 함수에 대한 핸들을 생성하여 중첩 함수를 실행하는 데 필요한 데이터를 포함시킬 수 있습니다.

중첩 함수의 요건

  • 일반적으로, 함수는 end 문을 필요로 하지 않습니다. 그러나, 프로그램 파일 내에 중첩 함수를 사용하는 경우에는 파일 내 모든 함수에 end 문을 사용해야 합니다.

  • MATLAB® 프로그램 제어문(예: if/elseif/else, switch/case, for, while, try/catch 등) 내에는 중첩 함수를 정의할 수 없습니다.

  • 중첩 함수는 이름을 사용하여 직접 호출하거나(feval 사용 안 함) 또는 @ 연산자를 사용하여 생성한(str2func는 사용하지 않음) 함수 핸들을 사용하여 호출해야 합니다.

  • 중첩 함수 또는 중첩 함수를 감싸는 함수에 있는 모든 변수는 명시적으로 정의되어야 합니다. 즉, 값이 함수 작업 공간에 미리 존재하지 않으면 이러한 값을 변수에 할당하는 함수 또는 스크립트를 호출할 수 없습니다. (자세한 내용은 오류 해결: 변수를 정적 작업 공간에 추가해 봅니다. 항목을 참조하십시오.)

부모 함수와 중첩 함수 간에 변수 공유하기

일반적으로, 함수는 다른 함수의 작업 공간에 있는 변수를 사용할 수 없습니다. 그러나, 중첩 함수는 중첩 함수를 감싸는 함수의 작업 공간에 있는 변수에 액세스하여 수정할 수 있습니다.

따라서 중첩 함수와 중첩 함수를 감싸는 함수 모두 변수를 인수로 전달하지 않고 동일한 변수를 수정할 수 있습니다. 예를 들어, main1 함수와 main2 함수 각각에서 메인 함수와 중첩 함수 모두 변수 x에 액세스할 수 있습니다.

function main1
x = 5;
nestfun1

   function nestfun1 
     x = x + 1;
   end 

end
function main2
nestfun2

   function nestfun2
      x = 5;
   end 
   
x = x + 1;
end

부모 함수가 지정된 변수를 사용하지 않을 경우 변수는 중첩 함수에 대한 로컬 변수로 유지됩니다. 예를 들어, main이라는 다음 함수에서 두 개의 중첩 함수는 서로 상호 작용할 수 없는 자체 고유 버전의 x를 가집니다.

function main
   nestedfun1
   nestedfun2

   function nestedfun1
      x = 1;
   end

   function nestedfun2
      x = 2;
   end
end

출력 인수를 반환하는 함수는 해당 작업 공간에 출력값에 대한 변수를 가집니다. 그러나, 부모 함수는 명시적으로 요청하는 경우에만 중첩 함수 출력값에 대해 변수를 가집니다. 예를 들어, 다음 함수 parentfun은 자신의 작업 공간에 변수 y가지지 않습니다.

function parentfun
x = 5;
nestfun;

   function y = nestfun
     y = x + 1;
   end 

end

다음과 같이 코드를 수정하면 변수 zparentfun의 작업 공간 내에 있게 됩니다.

function parentfun
x = 5;
z = nestfun;

   function y = nestfun
     y = x + 1;
   end 

end

핸들(Handle)로 함수 파라미터(Function Parameter) 저장하기

중첩 함수는 다음 세 개 소스의 변수를 사용할 수 있습니다.

  • 입력 인수

  • 중첩 함수 내에 정의된 변수

  • 부모 함수에 정의된 변수(외부 범위 변수라고도 함)

중첩 함수에 대한 함수 핸들을 생성하면 해당 핸들은 함수의 이름뿐만 아니라 외부 범위 변수의 값도 저장합니다.

예를 들어, makeParabola.m이라는 파일에 함수를 생성해 보겠습니다. 이 함수는 여러 다항식 계수를 받고, 이 계수의 다항식 값을 계산하는 중첩 함수에 대한 핸들을 반환합니다.

function p = makeParabola(a,b,c)
p = @parabola;

   function y = parabola(x)
   y = a*x.^2 + b*x + c;
   end

end

makeParabola 함수는 계수 a, b, c에 대한 값을 포함하는 parabola 함수에 대한 핸들을 반환합니다.

명령줄에서 계수 값으로 1.3, .2, 30을 사용하여 makeParabola 함수를 호출합니다. 반환된 함수 핸들 p를 사용하여 특정 지점에서 다항식을 계산합니다.

p = makeParabola(1.3,.2,30);

X = 25;
Y = p(X)
Y =
  847.5000

많은 MATLAB 함수는 함수 핸들 입력값을 받아 특정 범위의 값에 대해 함수를 실행합니다. 예를 들어, -25에서 +25까지 포물선 방정식을 플로팅합니다.

fplot(p,[-25,25])

각각 다른 다항식 계수를 사용하는 parabola 함수에 대한 여러 핸들을 생성할 수 있습니다.

firstp = makeParabola(0.8,1.6,32);
secondp = makeParabola(3,4,50);
range = [-25,25];

figure
hold on
fplot(firstp,range)
fplot(secondp,range,'r:')
hold off

중첩 함수의 가시성(Visibility)

각 함수에는 특정 범위, 즉 자신에게 접근할 수 있는 다른 함수 집합이 정의됩니다. 중첩 함수에 대한 접근성은 아래와 같습니다.

  • 중첩 함수 바로 위 수준. (다음 코드에서 함수 ABD를 호출할 수 있지만, CE는 호출할 수 없습니다.)

  • 동일한 부모 함수 내에 동일한 수준에 중첩되어 있는 함수. (함수 BD를 호출할 수 있고, DB를 호출할 수 있습니다.)

  • 자신보다 하위 수준 함수. (함수 CB 또는 D를 호출할 수 있지만, E는 호출할 수 없습니다.)

    function A(x, y)              % Main function
    B(x,y)
    D(y)
    
       function B(x,y)            % Nested in A
       C(x)
       D(y)
    
          function C(x)           % Nested in B
          D(x)
          end
       end
    
       function D(x)              % Nested in A
       E(x)
    
          function E(x)           % Nested in D
          disp(x)
          end
       end
    end

중첩 함수의 범위를 확장하는 가장 쉬운 방법은 핸들(Handle)로 함수 파라미터(Function Parameter) 저장하기에 표시된 대로 함수 핸들을 생성하고 이를 출력 인수로 반환하는 것입니다. 중첩 함수를 호출할 수 있는 함수만 중첩 함수에 대한 핸들을 생성할 수 있습니다.

관련 항목