IDL/Programming

_EXTRA라는 키워드에 관하여

이상우_IDL 2012. 1. 9. 17:30
728x90

IDL의 세상에서 돌아다니는 온갖 루틴들을 보다보면 '_EXTRA'라는 이름을 가진 요상한 키워드가 등장하는 경우를 종종 볼 수 있습니다. 저도 사실 IDL을 시작한지 한참 후에야 이해했지만, IDL 유저라면 알아두면 도움이 될만한 내용일 것 같아 좀 적어보려고 합니다.


이 키워드는 조금 어렵게 얘기하면 키워드의 상속(Inheritance)이라는 개념과 연결되는데, 이런 용어는 무시하고 대충 요약하면 '없는 키워드도 알아서 챙기라'는 의미 정도로 생각하면 될 것 같습니다. 여기서 '없는'이라는 부분은 정확히 얘기하면 '정의되지 않은'이라는 뜻입니다. 다음과 같은 아주 단순한 루틴을 예로 들어보겠습니다.


PRO test_extra, _extra=extra


HELP, extra


END


이 루틴을 test_extra.pro로 저장한 다음 컴파일을 합니다. 그런 다음에 우선 IDL 커맨드 입력창에서 test_extra를 실행해보면 다음과 같은 메시지가 나옵니다.


IDL> test_extra

EXTRA           UNDEFINED = <Undefined>


의미는 뭐 당연히 extra라는 이름의 변수는 있는데 정의가 안되어있다는 뜻입니다. 이번에는 다음과 같이 전혀 생뚱맞은 'aa'라는 키워드를 사용해보고 그 결과를 봅시다. 참고로 aa라는 키워드는 우리가 이 루틴에서 전혀 정의하지 않았던 키워드입니다.


IDL> test_extra, aa=1

** Structure <1147eed8>, 1 tags, length=2, data length=2, refs=1:

   AA              INT              1


이 결과를 보면 뭔가 좀 수상합니다. 사실 extra를 우리가 사전에 따로 정의한 것도 아닌데, extra가 엄연히 존재하는 자료로서 인식되고 이에 대한 HELP의 결과를 보여주고 있습니다. 더구나 내용을 보면 extra는 하나의 구조체(structure)이며 aa라는 하나의 필드를 갖고 있고 그 값은 1이라고 인식하고 있습니다. 이번엔 키워드를 하나 더 줘볼까요? 또 하나의 생뚱맞은 'bb'라는 키워드를 줘보겠습니다. 결과는 다음과 같습니다.


IDL> test_extra, aa=1, bb=2

** Structure <411688>, 2 tags, length=4, data length=4, refs=1:

   AA              INT              1

   BB              INT              2


역시 비슷한 결과입니다. 다만 extra라는 구조체가 aa, bb 두 필드를 갖고 있고 각각의 값이 1, 2라고 인식하고 있습니다. 이 결과들을 보면 뭔가 감이 오지않습니까? 그렇습니다. 루틴을 사용하는데 있어서 사전에 정의되지 않았던 키워드들이 사용될 경우, 이 정보들을 _EXTRA 키워드에 주어진 이름의 구조체로 일단 인식해두라는 의미입니다. 물론 이것만으로는 그 실용성을 가늠하기 어려우므로 실전 사용예제를 들어보겠습니다. 다음과 같이 test_extra의 내용을 바꿔보기로 합시다.


PRO test_extra, _extra=extra


HELP, extra

data = INDGEN(100)

PLOT, data, _EXTRA=extra


END


이 상태에서 다음과 같이 이 루틴을 사용해봅시다.


IDL> test_extra, linestyle=1, thick=3


사실 여기서 사용된 linestyle, thick 등의 키워드들은 test_extra 루틴에서 전혀 정의되지 않았던 키워드들입니다. 그리고 루틴의 내용에서 PLOT 프로시저 사용된 부분을 보면 그 안에서 또 _EXTRA 키워드가 사용된 것을 볼 수 있습니다. 이것은 결국 test_extra 루틴을 사용할 때 추가적으로 사용된(즉, 사전에 정의되지 않았음에도 불구하고 사용된) 키워드들을 이 PLOT 프로시저에서 이어받아서 사용하라는 의미입니다. 맨 처음에 언급했던 키워드의 상속이라는 개념이 바로 이러한 경우를 뜻합니다.


물론 지금 예로 들고 있는 test_extra 루틴을 사용할 때 추가로 사용하는 키워드들은 아무래도 PLOT 프로시저에서 유효하게 사용할 수 있는 키워드들이어야 바람직할겁니다. 그런데 만약 PLOT 프로시저에서도 사용되지 않는 전혀 이상한 키워드를 상속시키면 어떻게 될까요? 예를 들어 다음과 같이 test_extra 루틴을 사용해봅시다. 여기서 사용된 'ccc'라는 키워드는 PLOT 프로시저에서 전혀 사용되지 않는 키워드입니다.


IDL> test_extra, linestyle=1, thick=3, ccc=100


얼핏 생각해보면 정상적으로 실행되지 않고 에러가 날 것으로 보이지만, 실제로는 에러없이 정상적으로 PLOT 프로시저가 실행됨을 확인할 수 있습니다. 사실은 이와 같이 상속받은 키워드가 유효한 것이 아니더라도 그냥 무시하는 것이 기본 설정입니다. 만약 상속받은 키워드의 유효성을 검증하여 유효하지 않을 경우 에러가 나도록 하려면 루틴내에서 PLOT 프로시저 부분을 다음과 같이 수정하면 됩니다.


PRO test_extra, _extra=extra


HELP, extra

data = INDGEN(100)

PLOT, data, _STRICT_EXTRA=extra


END


즉 이와 같이 _EXTRA 대신 _STRICT_EXTRA라는 키워드를 사용하면 됩니다. 이렇게 수정하여 컴파일된 test_extra를 위와 같이 다시 사용해보면 이번에는 다음과 같이 에러를 내고 실행을 멈추게 됩니다.


IDL> test_extra, linestyle=1, thick=3, ccc=100

** Structure <114452f8>, 3 tags, length=6, data length=6, refs=1:

   CCC             INT            100

   LINESTYLE       INT              1

   THICK           INT              3

% Keyword CCC not allowed in call to: PLOT

% Execution halted at: TEST_EXTRA          5 /Users/sang-ui/Documents/Education/blog/test_extra.pro

%                      $MAIN$          


만약 test_extra 루틴에서 따로 정의된 키워드가 있을 경우라면 그 키워드를 제외한 다른 생뚱맞은 키워드가 사용될 경우 이와 같은 키워드 상속 기능이 발동된다고 보면 됩니다. 키워드의 상속에 관한 좀 더 자세한 내용은 IDL 도움말에서 extra로 검색을 해보면 나오는 결과들 중 'Keyword Inheritance'라는 섹션에 있습니다. 사실 이 개념은 객체지향 프로그래밍에서 사용자 정의 객체를 만들 경우에도 등장하는데, 일단 기본 개념은 이와 같다는 정도만 이해해도 실제 사용에는 충분하리라 생각됩니다.

LIST

'IDL > Programming' 카테고리의 다른 글

배열 합치기  (0) 2012.05.04
키워드(keyword)와 인자(argument)에 관하여  (0) 2012.01.13
COMPILE_OPT의 활용  (0) 2011.12.13
날짜 기반의 파일명 다루기  (0) 2011.09.20
FOREACH 구문 소개  (0) 2011.05.04