IDL 8.0 버전에서부터 도입된 복합형 자료형인 리스트(List)에 관하여 소개하고 있습니다. 지난 회차 게시물에서 바로 이어지는 내용입니다.
< 리스트 개체의 합성 >
다수의 리스트 개체들을 합쳐서 하나의 리스트 개체로 만들 수도 있습니다. 이를 위해서는 + 연산자를 사용하면 되며 그 예제를 보면 다음과 같습니다.
IDL> lst1 = LIST('zero', 1, 2.0)
IDL> lst2 = LIST(!pi, 'one', [1, 2, 3, 4])
IDL> lst3 = lst1+lst2
IDL> PRINT, lst3
zero
1
2.0000000
3.1415927
one
1 2 3 4
< 리스트 개체간 또는 리스트와 단일값의 비교 >
연산자 EQ를 이용하여 두 리스트 개체들을 서로 비교할 수도 있습니다. 기본적으로는 양쪽 리스트 개체의 동일한 위치 인덱스에 해당되는 원소끼리 비교하여 그 결과가 논리값인 1 또는 0으로 산출되는 방식입니다. 따라서 그 결과는 1 또는 0의 논리값들로 구성되는 배열이 되며, 이 배열의 크기는 두 리스트 개체 중 원소의 갯수가 적은 리스트 개체의 원소의 갯수와 동일합니다. 다음 예제를 봅시다.
IDL> lst1 = LIST('alpha', 5, 19.9)
IDL> lst2 = LIST('alpha', 'abc', 19.9)
IDL> r = lst1 EQ lst2
IDL> HELP, r
R BYTE = Array[3]
IDL> PRINT, r
1 0 1
여기서는 두 리스트 개체인 lst1, lst2 모두 원소의 갯수가 3입니다. 이번에는 lst1이 다음과 같이 4개의 원소를 갖는 경우를 가정해봅시다. 사실 이런 경우에도 결과는 갖습니다. 왜냐하면 어차피 lst2의 원소갯수가 3이므로 최종 결과 배열의 원소 갯수는 여전히 3이 될 수 밖에 없기 때문입니다.
IDL> lst1 = LIST('alpha', 5, 19.9, 22.6)
IDL> r = lst1 EQ lst2
IDL> HELP, r
R BYTE = Array[3]
IDL> PRINT, r
1 0 1
리스트 개체와 단일값을 서로 비교할 수도 있습니다. 이 경우의 결과는 리스트 개체의 원소의 갯수만큼의 0 또는 1의 값들로 이루어진 배열이 됩니다.
IDL> lst = LIST('gamma', 77, 14.6, 35)
IDL> r = lst EQ 77
IDL> HELP, r
R BYTE = Array[4]
IDL> PRINT, r
0 1 0 0
참고로 EQ 대신 NE 연산자를 사용하는 것도 가능하며 그 경우에는 다음과 같이 반대의 결과를 얻게 됩니다.
IDL> r = lst NE 77
IDL> HELP, r
R BYTE = Array[4]
IDL> PRINT, r
1 0 1 1
< 리스트 개체 내 개별 원소에 대한 접근 >
이번에는 리스트 개체 내의 원소들에 대한 여러가지 접근 방법들을 살펴보겠습니다. 리스트 개체는 기본적으로 1차원 배열과 유사한 구조를 갖기 때문에, 일반적으로 1차원 배열의 원소들에 접근하는 방식과 여러모로 유사합니다. 리스트 개체 내의 특정 원소값을 추출하려면 다음과 같이 위치 인덱스를 사용하면 됩니다.
IDL> lst = LIST('gamma', 46, 78.2, 12, [3, 4, 5])
IDL> PRINT, lst[2]
78.2000
IDL> PRINT, lst[4]
3 4 5
물론 특정 위치의 원소값을 다른 값으로 대치할 수도 있습니다.
IDL> lst[2] = 36.5
IDL> PRINT, lst
gamma
46
36.500000
12
3 4 5
리스트 개체 내의 특정 위치의 원소값들만 추출하여 또 다른 리스트 개체를 만들 수도 있습니다.
IDL> newlst = lst[[0, 2]]
IDL> PRINT, newlst
gamma
36.500000
IDL> newlst = lst[[1:3]]
IDL> PRINT, newlst
46
36.500000
12
< 리스트 개체의 복제 >
다음과 같이 = 기호를 사용하여 기존의 리스트를 카피 즉 복제할 수도 있습니다.
newlst = lst
다만 이렇게 하면 newlist와 list는 동일한 리스트 개체로 취급된다는 것을 반드시 유의해야 합니다. 따라서 둘 중 하나의 리스트 개체에 대하여 뭔가 변경을 하면 그 변경사항은 나머지 리스트 개체에도 그대로 적용된다는 점을 기억해야 합니다.
IDL> newlst[2] = 93
IDL> PRINT, newlst
gamma
46
93
12
3 4 5
IDL> PRINT, lst
gamma
46
93
12
3 4 5
따라서 만약 lst와 구성원소들은 동일하지만 완전히 독립적인, 즉 변경사항이 똑같이 적용되지 않는 새로운 리스트 개체를 만들려면 다음과 같이 * 기호를 사용하면 됩니다.
IDL> newlst = lst[*]
IDL> newlst[2] = 328
IDL> PRINT, newlst
gamma
46
328
12
3 4 5
IDL> PRINT, lst
gamma
46
93
12
3 4 5
지금까지 2회에 걸쳐 리스트(List)라는 자료형에 대한 전반적인 특성들을 알아보았습니다. 여기서 미처 다루지 못한 더 많은 내용들에 관해서는 IDL 도움말을 참조하시면 됩니다. 이제 또 다른 복합형 자료형인 해쉬(Hash)에 관한 내용도 조만간 이어질 예정입니다.
* 이 내용은 지난 2011년에 올렸던 게시물의 내용을 일부 수정하여 다시 새롭게 올리는 내용입니다. 따라서 기존의 게시물은 이번 내용으로 대체되었습니다.
* 이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > Data Type & Format' 카테고리의 다른 글
| 구조체(Structure)에 관하여 (1) | 2025.06.24 |
|---|---|
| 해쉬(Hash) 자료형에 관하여 (1) | 2025.06.10 |
| 리스트(List) 자료형에 관하여 [1] (0) | 2025.06.04 |
| ISA 함수의 활용 (0) | 2025.06.02 |
| TYPENAME 함수의 활용 (0) | 2025.05.29 |