IDL/Miscellaneous

[ ]와 ( )의 올바른 사용법

이상우_IDL 2012. 2. 2. 13:48
728x90
반응형

우리가 IDL로 코딩을 하다보면 배열을 자주 사용하게 됩니다. 그런데 IDL에서 배열내의 원소값을 취할 때, 당연히 인덱스 기반으로 접근을 합니다. 다들 아시겠지만 다음과 같은 방식이 됩니다.


IDL> a = INDGEN(100)

IDL> PRINT, a[50]

   50


여기서 배열 인덱스를 표시할 때 꺽쇠괄호, 즉 [ ]를 사용하였습니다. 사실 IDL에서는 이와 같은 작업에서 [ ]뿐 아니라 일반괄호인 ( )를 사용해도 됩니다. 즉, 다음과 같이 해도 결과는 똑같습니다.


IDL> PRINT, a(50)

   50


그런데 가급적이면 배열내 원소값에 접근할 때 일반괄호인 ( )는 가급적 피하시고 꺽쇠괄호 []를 사용하는 습관을 들이시길 권장합니다. 왜냐하면 ( )는 또 다른 사용처가 있습니다. 즉, 함수(function)을 사용할 경우입니다. 따라서 ( )를 잘못 사용하면 이상한 결과를 초래할 수 있습니다. 다음이 대표적인 예입니다.


IDL> sin = INDGEN(100)

IDL> PRINT, sin(50)

   -0.262357


여기서는 sin이라는 배열을 정의하고 이 배열의 특정 원소값을 출력해보았습니다. 그런데 이와 같이 배열내의 51번째 값을 출력하라고 했는데, 출력결과는 전혀 이상한 값이 나옵니다. 원래는 50이 나와야 정상이겠죠. 이런 일이 벌어지는 이유는 두가지입니다.


(1) 배열의 이름이 IDL에 원래 있는 함수인 SIN과 똑같습니다.

(2) 배열내 값을 접근할 때 일반괄호인 ( )가 사용되었습니다.


배열명을 이와 같이 짓는 것 자체는 허용은 됩니다. 하지만 이런 경우에 원소 접근을 위하여 ( )를 써버리면, IDL은 배열 sin이 아닌 함수 sin으로 먼저 인식을 해버립니다. 그래서 50에 대한 sin 함수 적용 결과인 -0.262357이 출력된 것입니다. 물론 이 상황에서 꺽쇠괄호 [ ]를 사용하면 의도했던대로 50이란 값이 출력됩니다.


IDL> PRINT, sin[50]

   50


따라서 이와 같은 혼동을 방지하려면 (1)과 같은 상황을 피하는 것이 좋겠죠. 하지만 IDL을 쓰다보면 IDL에 원래 내장된 함수들 뿐 아니라 다른 외부 라이브러리의 함수들도 많이 사용하는데, 이 수많은 함수들의 이름을 일일이 기억해가며 그 이름만 피해가기는 매우 어렵습니다. 따라서 가장 근본적이고 쉬운 방법은 (2)와 같은 상황만 만들지 않는 것입니다. 이를 위해서는 배열내 원소 접근시 무조건 꺽쇠괄호 []를 사용하는 습관을 들이면 됩니다.


별로 어려운 일은 아닙니다. 그리고 이런 습관을 들이면 본인의 작업시에도 좋지만, 다른 사람들과 작업을 공유할 때에도 불필요한 혼란을 막을 수 있습니다. 따라서 IDLer라면 이러한 습관을 들이시길 권장합니다. 그리고 일반괄호 ( )는 함수(function)에게 양보합시다.

반응형