다른 언어에서도 비슷하겠지만 IDL에서도 함수(Function) 형태의 부프로그램을 정말 많이 사용합니다. 잘 아시다시피 함수형 부프로그램은 내부적으로 어떤 연산을 수행한 결과를 되돌려주는 역할을 합니다. 물론 주프로그램 어디에선가 이 함수 부프로그램을 불렀을 때 이와 같은 방식으로 자기 역할을 수행하겠지요. 다음은 아주 단순한 형태의 함수형 부프로그램의 예로서, 두 개의 인자값들을 받아 서로 합한 결과를 돌려주는 역할을 합니다.
FUNCTION myfunc, a, b
v = a + b
RETURN, v
END
그러면 이러한 함수형 부프로그램을 다음과 같이 사용하면 됩니다. 일단 이러한 함수형 부프로그램이 정의되고 컴파일이 된 상태라면, 주프로그램에서든 아니면 커맨드 입력창에서든 다음과 같이 불러서 사용이 가능합니다.
IDL> PRINT, myfunc(7, 3)
10
그런데 만약 이 함수 프로그램에서 두 종류의 연산을 수행하고, 이렇게 얻어진 두 개의 결과값들을 되돌려주고 싶다고 합시다. 그래서 아래와 같이 내용을 좀 고쳐봤습니다.
FUNCTION myfunc, a, b
v1 = a + b
v2 = a * b
RETURN, v1, v2
END
하지만 이런 상태로는 컴파일 도중 에러가 납니다. RETURN 명령에는 오직 하나의 인자만이 허용되기 때문입니다. 그렇다면 이렇게 두 개의 값들을 한꺼번에 되돌려주도록 하려면 어떻게 해야 할까요? 이게 사실 아는 유저들은 잘 알지만, 올바른 해결책을 잘 모르는 유저들도 의외로 꽤 많습니다. 이럴 경우에는 여러 개의 값들을 한꺼번에 담을 수 있는 자료형을 생각해봐야 합니다. 가장 먼저 떠오르는 것은 배열(Array)입니다. 물론 배열도 해결책이 될 수 있습니다만, 그러기 위해서는 하나의 전제가 필요합니다. 즉 되돌려주고자 하는 값들이 다 같은 자료형(Type)일 경우만 가능합니다. 하나의 배열내에 서로 다른 자료형의 값들이 섞여서 포함될 수는 없기 때문입니다. 따라서 서로 다른 자료형인 값들을 한꺼번에 포함할 수 있는 뭔가가 필요해지는데, 이럴 때 유용한 방법은 바로 구조체(Structure), 리스트(List), 해쉬(Hash) 등의 형태로 묶어버린 후 이 묶음 자체를 되돌려주도록 하는 것입니다. 다음은 구조체의 형태로 한꺼번에 묶어서 전달하는 방식으로 함수 프로그램을 수정해본 예입니다.
FUNCTION myfunc, a, b
v1 = a + b
v2 = a * b
values = {v1:v1, v2:v2}
RETURN, values
END
구조체는 이와 같이 넣고자 하는 항목들을 집합괄호인 { }로 한꺼번에 묶는 방식으로 구성됩니다. 그 안에서 코마(,)로 나눠진 마디마디는 필드(Field)라고 하는데, 예를 들어 첫번째 필드를 보면 v1:v1과 같이 적혀 있는데요. 여기서 왼쪽의 v1은 필드 이름이고, 오른쪽의 v1은 실제 v1이란 변수의 값이라고 보면 됩니다. 그래서 나중에 구조체 이름에 마침표(.) 및 필드명을 붙여서 다음과 같이 각 항목별 결과값들 조회하면 됩니다.
IDL> result = myfunc(7, 3)
IDL> PRINT, result.v1, result.v2
10 21
이렇게 구조체를 사용하면 그 안에서 서로 다른 여러 종류의 자료형인 값들이 한꺼번에 포함될 수 있다는 장점이 있기 때문에, IDL 프로그래머들 사이에서는 전통적으로 많이 애용되어 오고 있는 방법이기도 합니다. 최근 버전의 IDL에서는 구조체외에도 리스트나 해쉬같은 방법들도 사용이 가능한데요. 예를 들어 리스트를 이용하는 경우에는 함수 프로그램의 내용을 다음과 같이 바꾸면 됩니다. 이번에는 세번째 결과값으로 그냥 문자형 값 하나를 추가하여 넣어봤습니다.
FUNCTION myfunc, a, b
v1 = a + b
v2 = a * b
v3 = 'Awesome'
values = LIST(v1, v2, v3)
RETURN, values
END
그리고 결과값들의 조회는 다음과 같은 방식으로 하면 됩니다. 리스트의 특성상 이와 같이 배열 인덱스를 쓰는 기분으로 사용하면 됩니다.
IDL> result = myfunc(7, 3)
IDL> PRINT, result[0], result[1], result[2]
10 21Awesome
물론 인덱스를 일일이 명시하지 않고 다음과 같이 그냥 한꺼번에 다 조회하는 것도 가능합니다.
IDL> result = myfunc(7, 3)
IDL> PRINT, result
10
21
Awesome
물론 이렇게 리스트를 사용하는 것은 IDL 8.x 버전에서만 지원된다는 점은 유념해야 하겠지요. 그래서 예전 버전의 IDL 사용자라면 그냥 구조체를 사용하는 방식이 더 나을 것으로 생각됩니다. 어쨌든 여러 개의 값들을 하나로 묶어 한꺼번에 되돌려주는 함수형 프로그램은 이와 같은 방식으로 만들면 된다는 점을 잘 기억해두시면 좋을 것 같습니다.
'IDL > Programming' 카테고리의 다른 글
| 특정 년, 월의 일수(number of days) 산출법 (0) | 2014.10.17 |
|---|---|
| 날짜 문자열 갖고 놀기 [1] (0) | 2014.10.16 |
| 배열내에서 N번째로 가장 작은(또는 큰) 원소값 찾기 (0) | 2014.08.06 |
| 텍스트 파일을 효과적으로 읽는 방법에 관하여 [4] (0) | 2014.05.16 |
| 텍스트 파일을 효과적으로 읽는 방법에 관하여 [3] (0) | 2014.05.16 |