IDL/Programming

FOREACH 구문 소개

이상우_IDL 2025. 5. 26. 14:03
728x90

오늘은 IDL 8.0 버전부터 새로 도입된 FOREACH라는 구문(Statement)을 소개하기로 하겠습니다. 이름을 봐서는 아무래도 FOR문과 흡사한 역할을 할 것 같다는 느낌이 먼저 듭니다만, 사용법은 약간 다릅니다. 사실 IDL에서는 반복형 구문으로서 FOR, WHILE, REPEAT 구문들이 지원되는데 FOREACH 구문은 가장 나중에 도입된 반복형 구문이라고 보시면 됩니다. 그러면 FOREACH 구문의 예제를 하나 보도록 하겠습니다. 그러면 아마 FOR 구문과의 차이점을 확연히 느낄 수 있을 것입니다. 다음과 같이 a라는 배열을 먼저 생성해봅시다.

 

a = 100*INDGEN(11)

 

이 배열은 0, 100, 200, ..., 900, 1000과 같은 11개의 정수값들로 이루어져 있습니다. 이 배열에 대하여 각 배열 인덱스와 배열값을 차례로 출력해보려 합니다. 우선 기존의 FOR문을 이용하면 다음과 같은 내용이 되어야 합니다.

 

FOR i = 0, N_ELEMENTS(a)-1 DO PRINT, i, a[i]

 

하지만 FOREACH문을 사용하면 다음과 같은 내용이 됩니다.

 

FOREACH element, a, index DO PRINT, index, element

 

물론 두 경우 모두 결과는 다음과 같습니다.

 

                     0       0
                     1     100
                     2     200
                     3     300
                     4     400
                     5     500
                     6     600
                     7     700
                     8     800
                     9     900
                    10    1000

 

여기서 일단 FOREACH 구문의 기본구조를 살펴보면 다음과 같습니다.

 

FOREACH element, Variable, [Key or Index] DO ~~

 

또는

 

FOREACH element, Variable, [Key or Index] DO BEGIN

~~

ENDFOREACH

 

기본적으로 FOREACH 구문은 배열의 각 원소에 대한 작업을 수행합니다. 이 점에 있어서는 FOR 구문과 유사하지만, FOR 구문은 애초에 인덱스 기반으로 정의되는 구문이라고 한다면, FOREACH 구문은 배열 내 각 원소값 자체에 촛점을 맞추는 방식이라고 볼 수 있습니다. 따라서 대상이 되는 배열의 전체 원소 갯수를 미리 파악해야 할 필요성이 거의 없다고 봐도 됩니다. FOREACH 구문을 보면 두 개의 필수인자와 한 개의 선택인자가 있습니다. 처음에 필요한 정보는 배열이름 하나면 됩니다. 나머지 인자들은 미리 부여하는 것이 아닌 나중에 얻어지는 인자들입니다. 앞서 예제에서 사용한 문구를 다시 살펴봅시다.

 

FOREACH element, a, index DO PRINT, index, element

 

여기서 우리가 사전에 갖고있던 정보는 a라는 배열명뿐입니다. 따라서 이 배열명만 갖고 있으면 이 배열의 원소 갯수가 몇 개나 되느냐에 대한 사전 고려없이 바로 사용할 수 있습니다. 이러한 장점은 배열의 차원수가 높을 경우 극대화됩니다. 이번에는 다음과 같이 2차원 배열을 예제로 들어보겠습니다.

 

a = 100 * HANNING(100, 100)

 

예를 들어서 이 배열의 모든 원소값들을 출력하려면 다음과 같이 FOREACH문을 활용하면 됩니다.

 

FOREACH element, a DO PRINT, element

 

그러면 총 1만개의 원소값들이 출력될 것입니다. 그런데 만약 이 배열내의 특정 섹션에 해당되는 값들만 출력하고 싶다고 합시다. 즉, 예를 들어, a[30:33, 50:54]와 같은 특정 영역의 값들만 출력하고자 할 경우, 만약 FOR문을 사용한다면 아마도 다음과 같이 2중 루프의 형태가 되어야 할 것입니다.

 

FOR j = 50, 54 DO FOR i = 30, 33 DO PRINT, a[i, j]

 

하지만 FOREACH문을 사용하면 다음과 같이 처리하면 됩니다.

 

FOREACH element, a[30:33, 50:54] DO PRINT, element

 

이런 경우를 보면 FOREACH 구문이 FOR 구문에 비하여 편리한 측면도 있습니다. 물론 그렇다고 해서 FOREACH문이 FOR문에 비해 무조건 더 간결하고 편리하다는 것은 아닙니다. 경우에 따라서는 FOR 구문을 사용하는 것이 더 효율적일 수도 있을 것입니다. 하지만 FOREACH 구문이 배열을 다룰 때 인덱스에 대한 고려를 조금 덜 하고도 충분히 사용 가능하다는 장점은 분명히 있습니다. 따라서 복잡한 배열처리에 있어서 FOR 구문과 FOREACH 구문을 상황에 따라 각각의 장점을 살려 적재적소에 사용한다면 좀 더 수월한 프로그래밍이 될 수 있지 않을까 생각됩니다.

 

 

* 이 내용은 지난 2011년에 올렸던 게시물의 내용을 일부 수정하여 다시 새롭게 올리는 내용입니다. 따라서 기존의 게시물은 이번 내용으로 대체되었습니다.

 

 

이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

LIST