배열에 대한 인덱싱(또는 접근)을 배열로 하는 경우라는 것은 다음과 같이 어떤 배열내의 원소값에 접근하는데 있어서 인덱스를 단일값이 아닌 배열로 주는 경우를 의미합니다. 예를 들어 다음과 같이 5개의 정수값들로 구성된 data라는 배열이 있을 경우를 생각해 봅시다.
IDL> data = [55, 75, 60, 90, 85]
이 배열의 첫번째 원소값을 출력하고자 한다면 다음과 같이 인덱스 0을 사용하여 해당 원소값에 접근한 후 출력 명령을 사용하면 됩니다.
IDL> PRINT, data[0]
55
그런데 이와 같은 접근에 있어서 다음과 같은 방법을 사용하는 것도 가능합니다.
IDL> PRINT, data[[0]]
55
이 경우가 바로 배열에 대한 인덱싱을 배열로 하는 경우가 됩니다. 즉, 단일값 0 대신 배열 [0]을 사용하여 접근하는 방식입니다. 사실단 한 개의 값에만 접근할 경우에는 굳이 이런 방식을 사용할 필요까진 없습니다. 하지만 다음과 같이 내가 원하는 특정한 위치의 값들 여러 개에 접근하고자 할 경우에는 당연히 이 방식을 사용할 수 밖에 없습니다.
그런데 이번엔 다음과 같은 인덱싱을 시도해 보고자 합니다.
IDL> PRINT, data[[4, 5, 6]]
사실 이러한 인덱싱은 뭔가 좀 이상합니다. 왜냐하면 data라는 배열은 값을 5개만 갖고 있기 때문에 유효한 인덱스는 0~4가 됩니다. 그런데 이와 같이 유효하지도 않은 5, 6과 같은 인덱스를 사용한 접근이 가능할까요? 가능하지 않을 것으로 생각하기 쉬운데 실제로는 가능합니다. 그 결과는 다음과 같습니다.
85 85 85
즉, 접근하고자 하는 인덱스들로 구성된 배열내에서는 어떤 숫자의 인덱스를 써도 문제는 없다, 즉 오류가 발생하지는 않는다는 얘기가 됩니다. 배열의 원소 갯수에 따른 유효한 인덱스 범위에 굳이 제한을 받지 않는다는 의미입니다. 단 유효 범위를 넘어가는 인덱스가 사용될 경우에는 그 방향으로 유효한 최대 또는 최소 인덱스에 대한 값을 접근하게 됩니다. 따라서 반대 방향의 경우도 마찬가지입니다.
IDL> PRINT, data[[0, -1, -2]]
55 55 55
이와 같은 상황을 인덱스 클리핑(Index Clipping)이라고도 부릅니다. 물론 IDL이 암묵적으로(implicitly) 이와 같이 처리하기 때문에이러한 결과가 나오긴 하지만, 사실 바람직하지 않게 보일 수도 있습니다. 유효하지도 않은 인덱스를 사용했는데도 불구하고 IDL이 이를 군말없이 처리해주는 것 자체가 상황에 따라서는 또 다른 혼란을 유발할 가능성도 있을 겁니다. 만약 이러한 방식의 암묵적 처리가 거슬린다면, 즉 유효하지 않은 인덱스가 사용되었을 경우 가차없이 에러를 발생시키도록 엄격한 관리를 해주길 원한다면, 방법은 있습니다. 바로 다음과 같은 명령을 한번 실행해주면 됩니다.
IDL> COMPILE_OPT STRICTARRSUBS
여기서 사용된 COMPILE_OPT라는 명령은 IDL 컴파일러의 기본 설정들 중 일부를 나의 목적에 맞게 변형시킬 수 있는 기능을 제공하는 명령입니다. 위와 같이 STRICTARRSUBS라는 설정과 함께 이 명령을 실행한 이후부터는 위와 같은 행위들이 더 이상 용납되지 않습니다. 이제는 암묵적인 봐주기가 더 이상 존재하지 않게 됩니다. 따라서 이후부터는 위와 같은 행위들은 다음과 같이 오류를 발생시키게 됩니다.
IDL> PRINT, data[[4, 5, 6]]
% Array used to subscript array contains out of range subscript: DATA.
% Execution halted at: $MAIN$
IDL> PRINT, data[[0, -1, -2]]
% Array used to subscript array contains out of range subscript: DATA.
% Execution halted at: $MAIN$
물론 COMPILE_OPT 명령은 프로그램 안에서도 사용할 수 있습니다. 적어도 이 프로그램 내에서는 봐주기 따윈 허용할 수 없다고 결정을 내린다면, 프로그램의 첫머리에서 위와 같은 COMPLIE_OPT 명령을 적어주면 됩니다. 이 경우 적어도 이 프로그램 내에서는 COMPILE_OPT에서의 설정들이 유효하게 됩니다. COMPILE_OPT 명령에는 다른 여러가지 유용한 설정 옵션들이 있는데, 제가 예전에 올렸던 다른 게시물을 참조하셔도 좋을 것 같습니다.
그리고 이와 같은 STRICTARRSUBS 설정은 인덱싱을 배열로 할 경우에 대해서만 적용됩니다. 즉, 단일값으로 인덱싱을 하는 경우에 대해서는 적용되지 않습니다. 따라서 다음과 같은 행위는 언제나 오류를 일으키게 됩니다.
IDL> PRINT, data[7]
% Attempt to subscript DATA with <INT ( 7)> is out of range.
% Execution halted at: $MAIN$
다만 단일값 인덱스의 경우 최근 버전의 IDL에서는 (-) 인덱스가 허용되고 있는데요(IDL 8.0 버전부터). 다음 예제와 같은 (-) 인덱스의 사용은 어떤 경우에든 문제가 되지 않는다는 점도 유념해둘 필요가 있습니다.
IDL> PRINT, data[-2]
90
이 (-) 인덱스의 사용에 관해서도 제가 예전에 관련 게시물을 올린 적이 있으므로, 함께 참조해두시면 좋겠습니다.
'IDL > Programming' 카테고리의 다른 글
배열의 사용과 관련하여 유의해야 할 최근 변동사항 (0) | 2016.07.25 |
---|---|
SAVE 명령 및 IDL_SAVEFILE 클래스의 사용에 관하여 [1] (0) | 2016.06.22 |
B, I, O, Z 포맷(Format) 코드에 관하여 (0) | 2016.06.01 |
터미널 프롬프트상에서 IDL 프로그램의 실행에 관하여 (0) | 2016.03.28 |
NaN 값의 이해와 활용 [2] (0) | 2016.01.15 |