IDL/Data Type & Format

클래스 기반 문법에 의한 변수 및 배열 처리 [3]

이상우_idl 2024. 1. 3. 15:36
728x90
반응형

IDL에서 변수 또는 배열을 일종의 클래스(Class) 기반의 문법으로 처리하는 방법에 관하여 소개하고 있습니다. 지난 회에 이어서 오늘은 IDL_String 클래스에 관하여 알아보겠습니다. 이 클래스에 대하여 지원되는 여러가지 메서드(Method)들 중에서 주목해볼만한 몇가지만 골라서 예제와 함께 살펴보고자 합니다.

 

* 참고로 오늘 소개될 내용은 IDL 도움말에서 Routines (by Topic) -> Variable Functions and Attributes 섹션의 내용을 바탕으로 합니다. 그리고 이 내용은 해당 웹페이지를 통해서도 볼 수 있습니다.

 

 

< CharAt 및 SubString 메서드 >

 

CharAt 메서드는 대상 문자열에 대하여 특정한 위치의 문자를 추출하는 역할을 합니다. 위치는 인덱스로 지정하며 시작값은 0입니다. 예제를 보면 다음과 같습니다.

 

IDL> str = 'Geographic'
IDL> r = str.CharAt(0)
IDL> PRINT, r
G
IDL> r = str.CharAt(4)
IDL> PRINT, r
r

 

다만 CharAt 메서드로는 위와 같이 한 문자만 추출이 가능합니다. 만약 특정한 위치로 시작하는 여러 개의 문자들을 한꺼번에 추출하고자 한다면 CharAt 대신 다음과 같이 SubString 메서드를 사용하면 됩니다.

 

IDL> r = str.SubString(3, 7)
IDL> PRINT, r
graph

 

위의 예제는 대상 문자열에서 위치 인덱스로 3부터 7까지 총 5개의 연속된 문자들을 뽑아낸 경우입니다.

 

< StartsWith 및 EndsWith 메서드 >

 

StartsWith 메서드는 대상 문자열에 대하여 특정한 문자열로 시작되는 것이 맞는가 여부를 체크하는 역할을 합니다. 예를 들면 다음과 같습니다.

 

IDL> str = 'Geographic'
IDL> r = str.StartsWith('ge')
IDL> PRINT, r
   0

 

이와 같이 대상 문자열이 'ge'로 시작되는가 여부를 체크하면 아니라는 의미의 0이란 값을 받게 됩니다. 그런데 이 결과는 대소문자의 구분이 적용된 경우입니다. 만약 다음과 같이 /FOLD_CASE 키워드를 사용하면 대소문자 구분을 하지 않고 판단하도록 할 수 있습니다.

 

IDL> r = str.StartsWith('ge', /FOLD_CASE)
IDL> PRINT, r
   1

 

이렇게 하면 대소문자 구분 없이 'ge'라는 알파벳으로 시작된다는 의미로 1이란 결과값을 받게 됩니다. 그리고 StartsWith 메서드와 반대로 EndsWith 메서드는 대상 문자열의 끝부분을 체크합니다. 즉 대상 문자열이 특정한 문자열로 끝나는 것이 맞는가 여부를 체크하는 역할입니다. 예제를 보면 다음과 같습니다.

 

IDL> r = str.EndsWith('ic')
IDL> PRINT, r
   1

 

IDL> r = str.EndsWith('ick')
IDL> PRINT, r
   0

 

이와 같이 대상 문자열의 끝부분이 'ic'로 끝나는가 여부 및 'ick'로 끝나는가 여부를 체크하면 각각 1과 0이란 결과를 얻게 됩니다.

 

< IndexOf 및 LastIndexOf 메서드 >

 

IndexOf 메서드는 대상 문자열에 대하여 특정한 문자가 등장하는 위치에 대한 인덱스를 알려주는 역할을 합니다. 예제를 보면 다음과 같습니다.

 

IDL> str = 'Geographic'
IDL> r = str.IndexOf('g')
IDL> PRINT, r
           3

 

여기서는 대상 문자열 내에서 'g'의 위치 인덱스인 3을 돌려받았습니다. 만약 /FOLD_CASE 키워드를 사용하여 대소문자를 구분하지 않도록 할 경우의 결과는 다음과 같습니다.

 

IDL> r = str.IndexOf('g', /FOLD_CASE)
IDL> PRINT, r
           0

 

이와 같이 대소문자 구분을 하지 않을 경우에는 맨 앞에 있는 'G'의 위치 인덱스 0을 돌려받게 됩니다. 여기서 유의할 것은 대상 문자열인 'Geographic'에는 대소문자 구분을 하지 않을 경우에는 알파벳 g가 두번 등장하는 셈인데, IndexOf 메서드는 그 중에서 첫번째로 등장하는 알파벳 g에 대한 위치를 찾아낸다는 것입니다. 즉 탐색할 문자열이 여러 차례 등장할 경우에는 그 중 맨 처음 등장하는 위치를 찾아낸다는 것입니다. 반면 LastIndexOf 메서드는 말 그대로 탐색할 문자열이 마지막으로 등장하는 위치를 찾아낸다는 차이가 있습니다. 즉 바로 위의 예제에서 메서드만 바꿔주면 결과는 다음과 같습니다.

 

IDL> r = str.LastIndexOf('g', /FOLD_CASE)
IDL> PRINT, r
           3

 

즉 LastIndexOf 메서드로 대소문자 구분없이 알파벳 g를 찾으면 마지막에 등장하는 g에 대한 위치를 찾아냅니다. 따라서 IndexOf 메서드와 LastIndexOf 메서드 사이에는 이러한 차이가 있음을 염두에 두어야 합니다.

 

< Insert 및 Remove 메서드 >

 

Insert 메서드는 대상 문자열에 대하여 새로운 문자열을 추가하는 역할을 합니다. 예제를 보면 다음과 같습니다.

 

IDL> str = 'Geographic Projection'
IDL> r = str.Insert('and Mercator ', 11)
IDL> PRINT, r
Geographic and Mercator Projection

 

이와 같이 대상 문자열 내의 특정한 위치에 또 다른 문자열을 추가할 수 있습니다. 이번에는 또 다른 예제를 봅시다.

 

IDL> str = 'bbb'
IDL> r = str.Insert('ccc', 5)
IDL> PRINT, r
bbb

 

여기서는 대상 문자열인 'bbb'에 대하여 인덱스 5에 해당하는 위치 즉 'bbb'보다도 뒤쪽에 'ccc'라는 문자열을 추가하는 시도를 해본 것인데요. 이와 같이 대상 문자열의 내부가 아닌 외곽 부분에 새로운 문자열을 추가하는 것은 위의 방식으로는 효과가 없습니다. 하지만 되게 하는 방법이 있는데 바로 FILL_CHARACTER 키워드를 사용하는 것입니다. 즉 다음과 같이 처리해봅시다.

 

IDL> r = str.Insert('ccc', 5, FILL=' ')
IDL> PRINT, r
bbb  ccc

 

이와 같이 FILL_CHARACTER 키워드(여기서는 그냥 FILL로 줄여서 사용함)를 사용하면 외곽 부분에 문자열을 추가하면서 짜투리 공간에 대해서는 이 키워드에 부여된 문자(여기서는 ' ' 즉 공백)를 채워넣게 됩니다. 이러한 방식은 대상 문자열의 뒷부분 뿐 아니라 앞부분에 대해서도 적용 가능합니다. 즉 다음과 같은 방식입니다.

 

IDL> r = str.Insert('aaa', -5, FILL=' ')
IDL> PRINT, r
aaa  bbb

 

이와 같이 Insert 메서드가 새로운 문자열을 추가하는 역할인 반면 Remove 메서드는 대상 문자열에 대하여 특정 문자열을 제거하는 역할을 합니다. 예제를 보면 다음과 같습니다.

 

IDL> str = 'an example number'
IDL> r = str.Remove(1, 9)
IDL> PRINT, r
a number

 

이와 같이 대상 문자열 내에서 제거하고자 하는 부분 문자열의 시작 및 끝 인덱스를 명시해주면 됩니다.

 

< Contains 메서드 >

 

이 메서드는 대상 문자열 내에 특정한 문자열이 포함되어있는지 여부를 확인하는 역할을 합니다. 예제를 보면 다음과 같습니다. 여기서는 3개의 문자값들로 구성된 배열을 대상으로 해보았습니다.

 

IDL> files = ['data_20231126.jpg', 'data_20231203.jpg', 'data_20231207.jpg']
IDL> r = files.Contains('202312')
IDL> PRINT, r
   0   1   1

 

이와 같이 배열 files 내에 포함된 3개의 문자열들 중에서 '202312'라는 문자열을 포함하고 있는 것들이 무엇인지를 알아낼 수 있습니다. 즉 여기서는 두번째 및 세번째 문자열이 '202312'라는 문자열을 포함하는 것으로 확인된 것입니다.

 

* 참고로 정규표현식(Regular Expression) 기반으로 문자 탐색이 가능한 Matches라는 메서드도 있습니다.

 

< Reverse 및 Dup 메서드 >

 

Reverse 메서드는 대상 문자열에 대하여 문자들의 순서를 뒤집는 역할을 합니다. 예제를 보면 다음과 같습니다.

 

IDL> str = 'abcdefg'
IDL> r = str.Reverse()
IDL> PRINT, r
gfedcba

 

IDL> str = 'racecar'
IDL> r = str.Reverse()
IDL> PRINT, r
racecar

 

그리고 Dup 메서드대상 문자열을 다수로 복제하는 역할을 합니다. 간단한 예제를 보면 다음과 같습니다.

 

IDL> str = 'xy'
IDL> r = str.Dup(5)
IDL> PRINT, r
xyxyxyxyxy

 

여기서는 'xy'라는 문자열이 5회 반복되는 결과물을 얻은 것입니다. 그리고 이러한 결과물은 단일 문자열 뿐 아니라 배열의 형태로 얻는 것도 가능합니다.

 

IDL> r = str.Dup([5, 3, 2])
IDL> PRINT, r
xyxyxyxyxy xyxyxyxyxy xyxyxyxyxy
xyxyxyxyxy xyxyxyxyxy xyxyxyxyxy

 

* 참고로 Dup 메서드는 IDL 9.0 버전에서 추가된 기능입니다.

 

< Split 및 Join 메서드 >

 

Split 메서드는 대상 문자열에 대하여 특정한 문자를 기준으로 여러 마디로 분할하는 역할을 합니다. 예를 들면 다음과 같습니다.

 

IDL> str = 'Hello IDL Users'
IDL> r = str.Split(' ')
IDL> FOR j = 0, N_ELEMENTS(r)-1 DO PRINT, r[j]
Hello
IDL
Users

 

이와 같이 대상 문자열 str에 대하여 ' ' 즉 공백을 기준으로 Split 메서드를 적용하면 3개의 문자열들로 분할됩니다. 출력 결과를 통하여 이를 확인할 수 있습니다. 다음은 또 다른 예제로서 '/' 문자를 기준으로 분할하는 경우입니다.

 

IDL> str = '2024/01/02'
IDL> r = str.Split('/')
IDL> FOR j = 0, N_ELEMENTS(r)-1 DO PRINT, r[j]
2024
01
02

 

반면 Join 메서드대상 문자열들을 하나로 이어주는 역할을 합니다. 예제를 보면 다음과 같습니다.

 

IDL> str = ['data', '2023', '12', '30']
IDL> r = str.Join()
IDL> PRINT, r
data20231230

 

그리고 이와 같이 문자열들을 하나로 이어주면서 각 마디마다 붙는 문자를 따로 지정해줄 수도 있습니다. 그 예제는 다음과 같습니다.

 

IDL> r = str.Join('_')
IDL> PRINT, r
data_2023_12_30

 

지금까지 IDL_String 클래스에서 지원되는 여러가지 메서드들을 살펴보았습니다. 물론 이외에도 여러가지 다양한 메서드들이 지원되는데, 그 종류 및 각각의 사용법에 관한 자세한 내용은 서두에서 언급했듯이 IDL 도움말에서 IDL_String 클래스에 관한 섹션 또는 관련 웹페이지를 통하여 확인할 수 있습니다.

 

-------------------------------------------------------------

 

클래스 기반의 문법에 의한 변수 및 배열 처리에 관하여 이번까지 총 3회에 걸쳐서 간략하게나마 소개를 해보았습니다. 이 내용은 일단 이 정도 선에서 마무리하기로 하고, 향후에라도 혹시 관련된 흥미로운 내용이 또 생긴다면 그 때 또 소개하도록 하겠습니다.

반응형