Scilab에서 함수의 정의는 다음과 같이 키워드 function 으로 시작하고 endfunction으로 끝난다.
function [y1, y2, … ] = function_name(x1, x2, …)…...endfunction |
출력변수(들)은 대괄호 [ ] 로 묶지만 만약 출력 변수가 하나라면 대괄호는 생략이 가능하다. 입력변수는 괄호 ( )로 묶는데 만약 입력 변수가 없다면 정의에서는 괄호를 생략할 수 있다. 하지만 함수를 호출할 때는 입력 변수가 없다고 하더라도 괄호를 생략하지 못 한다. 함수의 몸체는 Scilab의 문장들(statements)로 작성된다.
간단한 예로 입력변수를 단순하게 세 제곱하여 반환하는 함수는 다음과 같이 입력할 수 있다.
>> function y=pow3(x)>> y=x^3>> endfunction |
이렇게 입력하면 pow3()라는 함수가 내부적으로 컴파일 된 후 작업 공간에 올라오며 이 후에 호출할 수 있다. 예를 들어서
>> a=pow(4) |
라고 호출하면 변수 a에 64가 저장될 것이다.
또 다른 예로서 숫자 x가 소수(prime number)이면 %t를 아니면 %f 를 반환하는 IsPrime()이라는 함수는 다음과 같다.
function y=isPrime(x)for n=2:(x-1)if modulo(x,n)==0 theny=%freturnendendy=%tendfunction |
여기서 함수 내부의 return 명령을 만나면 그 즉시 함수의 실행이 종료되고 호출된 곳으로 되돌아가게 된다. 알고리듬은 2와 x-1 사이의 모든 수로 나누어 보고 한 번이라도 그 나머지가 0이라면 %f를 반환하는 아주 간단한 방법을 사용했다.
Scilab의 함수는 변수처럼 취급된다. 예를 들어서 입력의 3제곱을 반환하는 다음과 같은 함수를 고려하자.
>> function y=foo(x), y=x^3, endfunction |
전술한 바와 같이 이렇게 함수를 정의하면 작업 공간에 이 함수가 올라오게 된다. 그 다음 일반적인 변수에 이 함수를 대입할 수 있다.
>> foo2 = foo |
이 명령을 보면 좌변의 새로운 변수에 함수명을 대입했다. 이렇게 되면 함수 본체가 복사되어 새로운 변수 foo2에 대입된다. 이 말은 이후에 원래의 함수 foo를 삭제/변형하더라도 foo2 함수에는 영향을 미치지 않는다는 말이다.
이렇게 함수를 변수처럼 취급할 수 있다는 것은 여러가지 이점이 있다. 함수 자체가 다른 함수의 입력 변수, 혹은 출력 변수가 될 수 있으며 구조체나 리스트의 필드가 될 수도 있다.
만약 정의된 함수를 삭제하고 싶다면 변수를 삭제할 때와 같이 clear 함수를 이용하면 된다.
>> clear foo>> clear(‘foo’) |
이렇게 원래의 함수 foo()가 삭제되더라도 foo2()함수는 여전히 메모리에 남아있게 된다.
댓글 없음:
댓글 쓰기