IDL/Programming

함수 부프로그램에서 여러 개의 값들을 돌려 받는 방법

이상우_IDL 2013. 10. 4. 16:00
728x90

IDL에서 FUNCTION 부프로그램을 만들면 항상 끝부분에서 RETURN이란 명령을 사용하여 값을 돌려주도록 하는 방법이 사용됩니다. 예를 들면 다음과 같은 방식입니다.


FUNCTION MY_FUNC, a, b

val = a+b

RETURN, val

END


이 함수 부프로그램을 사용하면 다음과 같이 두 인자값의 합을 돌려받게 됩니다.


result = MY_FUNC(3, 4)

PRINT, result

      7


그런데 함수 부프로그램내에서 여러 개의 결과값들을 생성하고 이 값들을 모두 돌려주도록 하려면 어떻게 하면 될까요? 사실 RETURN 명령이 받을 수 있는 인자는 단 하나뿐입니다. 따라서 다음과 같은 방식은 허용되지 않습니다.


FUNCTION MY_FUNC, a, b

val1 = a+b

val2 = a*b

RETURN, val1, val2; 허용되지 않음!

END


이런 경우에는 어떻게 하면 될까요? 먼저 생각해볼 수 있는 방법은 돌려줄 값들을 하나의 배열에 담는 것입니다. 즉 다음과 같이 하면 되겠지요.

FUNCTION MY_FUNC, a, b

val1 = a+b

val2 = a*b

result = [val1, val2]

RETURN, result

END


result = MY_FUNC(3, 4)

PRINT, result[0]

      7

PRINT, result[1]
     12


그러면 이 함수를 사용한 결과에 대하여 배열 인덱싱을 해서 원하는 값을 취할 수 있습니다. 그런데 이 방법은 한계가 있습니다. 배열을 만들려면 그 배열안에는 하나의 자료형(Type)만 허용이 됩니다. 정수, 실수, 문자든 하나의 자료형인 값들만이 하나의 배열로 포함이 가능합니다. 따라서 만약 돌려줄 값들이 다양한 자료형들을 갖는 경우에는 이 방법은 사용할 수 없습니다. 물론 다른 방법이 있습니다. 바로 구조체(Structure)를 활용하는 것입니다. 다음은 숫자 및 문자 등으로 구성된 결과값들로 구조체를 구성해서 이 구조체를 돌려주게 하는 함수 부프로그램의 예입니다.


FUNCTION MY_FUNC, a, b

val1 = a+b

val2 = a*b

str = 'Success'

result = {val1:val1, val2:val2, str:str}

RETURN, result

END


구조체라는 개념에 대해서는 제가 여기서 깊이 다루지는 않겠습니다. 그냥 집합괄호인 {}를 사용해서 정의한다는 점, 그리고 필드명(:의 왼쪽에 해당)이란 것이 나중에 참조를 위해서 사용된다는 점 정도만 언급을 하기로 합니다. 이 함수를 사용해서 돌려받은 결과는 구조체이기 때문에, 구조체 안에 있는 값들은 다음과 같이 "." 기호를 사용하여 참조해서 가져오면 됩니다.

result = MY_FUNC(3, 4)

PRINT, result.val1

      7

PRINT, result.val2
     12
PRINT, result.str
SUCCESS

원래 구조체라는 개념 자체가 이와 같이 여러가지 형의 다양한 값들을 하나의 묶음으로 포함하는 역할을 목적으로 만들어진 것이기 때문에, 이러한 장점을 잘 활용한 예라고 보시면 되겠습니다.

LIST