WHERE 함수에 관한 내용을 전에도 한번 다룬 적이 있었는데, 그 당시의 내용은 WHERE 함수의 결과가 단 하나뿐일 경우의 유의사항에 관한 내용이었습니다 (링크 참조). 그런데 오늘은 결과가 -1일 경우, 즉 결과가 실제로는 없는 경우에 대한 유의사항을 언급해볼까 합니다. 즉 예를 들면 다음과 같은 경우입니다.
IDL> a = [79, 52, 80, 85, 56, 93]
IDL> w = WHERE(a GT 95, count)
IDL> PRINT, w
-1
IDL> PRINT, count
0
여기서는 배열 a의 6개의 값들 중 95를 넘는 경우를 찾고 있는데, 보시다시피 이 조건에 부합되는 값은 당연히 하나도 없습니다. 따라서 count 변수를 통하여 돌려받은 경우의 갯수 값은 0으로 나오고, w를 통해서 돌려받은 인덱스는 그냥 -1로 나옵니다. 이러한 부분은 IDL에서 WHERE 함수를 좀 사용해보신 분들이라면 다들 잘 아실 것으로 생각합니다.
그런데 만약에 다음과 같이 w를 사용해서 배열 a를 인덱싱해보면 어떤 일이 벌어질까요? 즉 a[w]를 출력해보라고 하면 어떻게 될까요? 이것도 물론 많이들 아실 것 같은데, 특히 올드 유저들께서는 당연히 "그거 에러 나오잖아요?"라고 하실겁니다. 이게 원래는 맞았었는데요. 그런데 IDL 8.0 버전부터는 이게 좀 다릅니다. 8.0 또는 그 이후 버전의 IDL에서라면 에러가 나오지 않습니다. 그 대신 다음과 같은 결과를 얻게 됩니다.
IDL> PRINT, a[w]
93
출력된 93이란 값은 사실 배열 a의 맨 끝에 위치한 값입니다. 아마 이런 경우를 처음 보는 유저들도 좀 계실 것 같습니다. 원인은 IDL8.0 버전부터 마이너스(-) 인덱스가 지원되기 시작했기 때문입니다. 즉 다음과 같이 인덱스가 -1이면 배열내 맨 끝 값이고, -2라면 끝에서 두번째, -3이라면 끝에서 세번째 이런 식입니다.
IDL> PRINT, a[-1], a[-2], a[-3]
93 56 85
그래서 예전 IDL에서는 -1로 인덱싱을 할 때 에러가 났었지만 최근 버전의 IDL에서는 그렇지가 않습니다. 물론 마이너스 인덱스 자체는 편리하게 사용할 수 있는 기능입니다. 예전 같으면 배열의 끝 값을 조회하려면 다음과 같이 N_ELEMENTS 함수를 사용했었는데, 그런 번거로움을 덜 수 있게 되었으니까요.
IDL> PRINT, a[N_ELEMENTS(a)-1]
93
하지만 -1을 인덱스로서 인정하기 시작한 이상, 이제는 WHERE 결과가 -1로 나왔을 경우에도 이걸 갖고 인덱싱을 할 때 에러가 발생하지 않게 되었습니다. 이건 디버깅하는 입장에서는 좀 위험할 수 있습니다. 조건에 맞는 결과를 찾지 못했는데도 그 결과값으로 인덱싱이 가능하므로, 이런 사실을 무심코 지나치게 되면 프로그램의 실행 과정에서 실수가 발생할 여지가 생긴 셈입니다. 따라서 이런 의도치않은 실수를 막기 위해서는 WHERE 함수에서 조건 만족 갯수를 확인하는 것이 매우 중요해졌습니다. 즉 맨 위의 예제코드에서도 봤듯이 WHERE 함수내에서 논리식 뒤에 이 숫자를 받아올 수 있는 변수를 사용하는 것이 거의 필수가 되었다고 봅니다. 이 값이 0이라면 진짜 해당사항이 없는 것이기 때문에 그에 맞는 후속 작업이 진행되도록 프로그램을 작성해야 하겠지요.
IDL> w = WHERE(a GT 95, count)
IDL> PRINT, count
0
IDL> IF count EQ 0 THEN PRINT, 'No Case!'
No Case!
따라서 IDL 8.0 이상의 버전을 사용하시는 유저들께서는 WHERE 함수를 사용하는데 있어서 이러한 부분을 주의하셨으면 합니다. 그럼으로써 더 효율적인 프로그래밍이 되리라 믿습니다.
'IDL > Programming' 카테고리의 다른 글
| 포맷(Format) 코드의 이해 [2] (0) | 2015.06.26 |
|---|---|
| 포맷(Format) 코드의 이해 [1] (0) | 2015.06.18 |
| LAMBDA, LAMBDAP 함수 소개 [2] (0) | 2015.02.04 |
| LAMBDA, LAMBDAP 함수 소개 [1] (0) | 2015.02.02 |
| 새로운 배열 생성 방법 소개 (0) | 2015.01.30 |