티스토리 뷰

matlab

함수 핸들 이해하기

게으른 the lazy 2023. 8. 31. 00:46

 

함수 핸들에 대해 얘기해보고자 한다. 함수를 어떤 동작function을 하는 동사verb로서가 아니라 객체object로 다룰 수 있는 명사noun로서 취급하는 것은 개념의 전환이 필요한 부분이다. 이는 프로그래밍뿐만 아니라 수학에서도 모두 필요한 아이디어이다.

 

우리에게 익숙한 함수의 모양은 아래 그림과 같다.

 

 

물론 경우에 따라서는 입력이나 출력, 또는 둘 다 없을 수도 있다. 어쨌든 함수는 일동의 동작이다.

 


 

그런데 종종 함수를 동작이 아니라 객체로 다루고 싶을 때가 있다. 예를 들어 아래와 같은 질문을 생각해보자

 

함수 myadd는 입력 인자를 몇 개 받는가?

 

이 기능을 함수로 만든다면 이런 모양이 될 것이다.

 

함수명: num_input_args
입력: 함수 myadd
출력: myadd의 입력 인자 개수

 

새로운 함수 num_input_arg에는 함수 myadd반환값이 아니라 함수 그 자체를 전달해야 한다. 그런 어떻게? 여기에 필요한 것이 함수 핸들이다.

 

한국인에게 핸들이라는 단어는 아래 이미지를 연상시킨다.

 

pixabay

 

안타깝게도, 자동차의 핸들은 영어로 steering wheel이라고 부른다. 그럼 영어로 handle뭘까?

 

unsplash

 

손잡이다. 함수 핸들은 함수에 손잡이를 붙인 거다. 바로 이렇게.

 

 

 

 

굳이 비유하자면, 어떤 기능을 수행하는 기계를 손잡이가 달린 가방 안에 넣은 것으로 생각해볼 수도 있겠다. 미션임파서블의 한 장면처럼 말이다.

 

 

 

매트랩에서 함수에 핸들을 붙여 함수 핸들을 만들려면 어떻게 할까? 쉽다. 함수명 앞에 @만 붙이면 된다.

 

 

이제 함수에 핸들(손잡이)을 달았으니 물건처럼 다룰 수 있다. 프로그래밍에서 물건처럼 다룰 수 있는 것을 '변수'라고 부른다. 이제 함수 핸들은 변수로 취급할 수 있다. 함수 핸들은 자료형의 한 종류이므로,

- int8, double 등과 동등한 지위를 갖는다.
- 변수이므로 workspace생성된다.
- 변수이므로 함수에 인자로 전달될 수 있고, 반환값이 될 수도 있다.
 

함수의 입력 인자 개수를 반환하는 함수 num_input_args를 호출하는 방법은 아래와 같다.

 

num_input_args(@myadd)

 

사실 이 기능의 함수는 이미 있다. nargin이다.

 


 

매트랩에서 함수 핸들은 다방면으로 활용된다. 익명함수는 애초에 함수핸들을 만들기 위한 기능이며, 파이썬의 람다 함수와 정확히 같다. 익명함수에 대해 더 알고 싶다면 아래 영상을 보자.

 

 

 

 

sin(x)의 그래프를 그리고 싶다면? 굳이 아래처럼 변수를 만들지 않아도 된다.

 

x = linspace(0, 2*pi);
plot(x, sin(x))

 

함수 핸들을 받아서 plot 해주는 함수가 이미 있다. fplot은 함수 핸들을 입력 인자로 받은 후, 핸들의 입력을 알아서 적절히 만들어서 plot 해준다. sin내장함수이므로, fplot에다 @sin만 전달하면 된다.

 

fplot(@sin)

 

 

 

쉽다.

 

그 외에도 fzero, integral 등이 함수 핸들을 입력으로 받는 함수들이다. 이런 함수들을 함수 함수(function functions)라고 부른다. 네이밍이 참 별로다.

 


 

좋은 질문을 받은 적이 있다.

 

Q. 아래 두 줄은 어떻게 다른가요?

sine_handle
= @sin;
sine_handle = @(x) sin(x);
 

첫 번째 줄은 내장 함수인 sin을 함수 핸들로 만들어서 sine_handle이라는 이름을 붙인 것이다. 결과적으로 내장함수 sin에 별칭alias을 붙인 것과 마찬가지이다. 두 번째 줄은 약간 다르다. 두 번째 줄은 x를 입력으로 받은 후, sin에 전달하고, 그 결과를 반환하는 함수이다. 만약 x를 받아서 sincos을 모두 계산하고 싶다면 아래와 같은 형태가 되어야 한다.

 
sin_cos = @(x) [sin(x), cos(x)];

 


 

관심있는 분들은 파이썬의 일급 객체에 대해 알아보면 더 도움이 될 것이다.

 

 

- 게으른

'matlab' 카테고리의 다른 글

K-최근접 이웃 알고리즘 소개  (0) 2023.09.15
fprintf에 세미콜론이 없어도 되는 이유  (0) 2023.09.05
n차원 구의 부피는?  (0) 2023.08.07
숫자를 통화 표기로 바꾸기  (0) 2023.08.02
매트랩 숫자야구  (0) 2023.03.07
댓글