다음: 다중 반환값, 이전: 함수와 대본 기록철 소개, 상위 문서: 함수와 대본   [차례][찾아보기]


11.2 함수 정의하기

함수 이름을 정의하는 가장 간단한 형식입니다.

function 이름
  몸체
endfunction

올바른 변수 이름을 모두 함수 이름으로 사용 가능합니다. 연속한 글자·숫자·밑줄이되 숫자로 시작하지 않습니다. 함수 이름과 변수 이름은 같은 상징표를 공유합니다.

함수 몸체는 옥타브 명령문으로 구성합니다. 함수가 실제로 무엇을 지 지시하는 부분이기 때문에 정의에서 가장 중요한 부분입니다.

예를 들어, 실행하면 명령 처리기에서 경보를 울리는(가능한 경우) 함수가 있습니다.

function wakeup
  printf ("\a");
endfunction

printf문(입출력 참고)이 단순하게 옥타브가 문자열 "\a"을 출력하도록 지시합니다. 특별 문자 ‘\a’는 경보를 울립니다.(미국정보교환표준부호 7) 문자열을 참고하십시오.

한 번 함수를 정의하고 나면, 함수 입력을 타자하여 옥타브가 해당 함수를 평가하도록 할 수 있습니다.

정의한 함수에 정보를 보내주고 싶은 때가 있습니다. 옥타브에는 함수에 매개변수를 전달하는 구문이 있습니다.

function 이름 (매개변수-목록)
  body
endfunction

매개변수-목록은 반점 구분한 함수 매개변수 목록입니다. 함수를 호출할 때, 호출에서 준 매개변수 값을 매개변수 이름에 매깁니다. 매개변수 목록이 비면, 맨 위에 있는 예시와 똑같습니다.

경보를 울리면서 전갈을 출력하려면, wakeup을 아래처럼 손보아야 합니다.

function wakeup (안내)
  printf ("\a%s\n", message);
endfunction

이 함수를 아래처럼 호출합니다.

wakeup ("Rise and shine!");

명령 처리기의 경보를 울리면서, 전갈 ‘Rise and shine!’와 개행문자(printf문의 첫 번째 매개변수에 있는 ‘\n’)를 출력합니다.

대부분의 경우에, 정의한 함수로부터 정보를 얻고 싶은 때가 있습니다.  단일 값을 반환하는 함수를 작성하는 구문입니다.

function 반환-변수 = 이름 (매개변수-목록)
  body
endfunction

변수 이름인 상징 반환-변수가 함수가 반환하는 값을 담습니다. 반환-변수는 함수가 값을 반환할 수 있도록, 반드시 함수 몸체가 끝나기 전에 정의하여야 합니다.

함수 몸체에서 사용한 변수는 함수의 울안 변수입니다. 반환-변수와 매개변수-목록에 있는 변수도 함수의 울안 변수입니다. 함수 안에서 전역 변수에 접근하는 방법은 전역 변수을 참고하십시오.

벡터 원소의 평균을 구하는 함수 예시입니다.

function retval = avg (v)
  retval = sum (v) / length (v);
endfunction

avg를 아래처럼 쓰고,

function retval = avg (v)
  if (isvector (v))
    retval = sum (v) / length (v);
  endif
endfunction

벡터 매개변수 대신에 행렬 매개변수로 함수를 호출하면, 옥타브는 아래와 같은 오류 문구를 출력합니다.

error: 할당식 우항의 값이 정의되지 않음

if문의 몸체가 절대로 실행되지 않아 retval이 정의될 일이 없기 때문입니다. 이런 숨은 오류를 방지하려면, 반환값이 언제나 값을 갖게 하여, 문제에 직면하면, 쓸만한 오류가 발생하도록 하는 것이 좋습니다.

function retval = avg (v)
  retval = 0;
  if (isvector (v))
    retval = sum (v) / length (v);
  else
    error ("avg: expecting vector argument");
  endif
endfunction

이 함수에는 문제가 하나 더 있습니다. 매개변수 없이 호출하면 어떻게 될까요? 추가 문제 확인 없이는, 오류 원인을 찾는데에 별 쓸데도 없는 오류 문구가 나올 것입니다. 쓸데 없는 오류를 막기 위하여, 옥타브가 각 함수에 nargin라는 자동 변수를 제공합니다. 함수가 호출될 때마다 nargin이 자동으로 함수에 전달한 매개변수 개수로 초기화됩니다. avg 함수를 아래처럼 다시 적을 수 있습니다.

function retval = avg (v)
  retval = 0;
  if (nargin != 1)
    usage ("avg (vector)");
  endif
  if (isvector (v))
    retval = sum (v) / length (v);
  else
    error ("avg: expecting vector argument");
  endif
endfunction

매개변수가 예상보다 많이 들어와도 자동으로 오류를 보고하지는 않지만, 이렇게 하면 일부 문제를 식별할 수 있습니다. 또, 매개변수가 예상보다 덜 들어와도 자동으로 오류를 보고하지는 않지만, 값이 없는 변수로 함수를 호출하려고 하면 오류를 보고합니다. 이 문제를 피하고, 쓸만한 안내를 받으려면, 이들 문제의 가능성을 수동으로 확인하고, 직접 만든 오류 문구를 사용하여야 합니다.

nargin ()
nargin (함수)

함수에 입력한 매개변수 개수를 보고합니다.

함수 안에서 호출하면, 함수에 전달한 매개변수 개수를 반환합니다. 최상위에서 호출하면, 옥타브에 전달한 명령줄 매개변수 개수를 반환합니다.

함수 이름 또는 함수 다루개인 선택 매개변수 함수와 호출하면, 함수가 받아들일 수 있는, 선언된 매개변수의 개수를 반환합니다.

함수의 마지막 매개변수가 varargin이면, 반환값이 음수입니다. 함수 union의 선언 예시입니다.

function [y, ia, ib] = union (a, b, varargin)

and

nargin ("union")
⇒ -3

풀그림 짜기 안내: 내장 또는 동적 적재 함수 따위인 번역된 함수(.oct 기록철)에서는 nargin이 작동하지 않습니다.

같이 보기: nargout, narginchk, varargin, inputname.

inputname (n)
inputname (n, 색인만)

호출한 함수의 n번째 매개변수의 이름을 반환합니다.

매개변수가 단순한 변수 이름이 아니면, 빈 문자열을 반환합니다. 예를 들어, 구조체 기록란을 참조하는 s.field는 단순한 이름이 아니므로 ""를 반환합니다.

inputname는 함수 안에서나 쓸모있습니다 명령줄에서 사용하면, 늘 빈 문자열을 반환합니다.

기본적으로, n번째 매개변수가 올바르지 않은 변수 이름이면, 빈 문자열을 반환합니다. 선택 매개변수 색인만이 거짓이면, 변수가 올바르지 않은 이름일 때, 그 매개변수의 글월을 반환합니다.

같이 보기: nargin, nthargout.

= silent_functions ()
옛_값 = silent_functions (새_값)
silent_functions (새_값, "local")

함수의 내부 출력을 제한할지를 결정하는 내부 변수를 조회 또는 설정합니다.

이 설정이 비활성화되면, 쌍반점으로 끝나지 않은 함수 몸체 안 표현식을 평가할 때 나오는 결과를 표시합니다.

함수 안에서 "local" 선택지를 넣어 부르면, 함수와 함수가 부른 종속 절차의 변수가 지역적으로 바뀝니다. 함수가 종료되면 원래 변숫값이 되돌아옵니다.


다음: 다중 반환값, 이전: 함수와 대본 기록철 소개, 상위 문서: 함수와 대본   [차례][찾아보기]