IDL/Data Type & Format

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

이상우_IDL 2023. 12. 19. 16:12
728x90

오늘은 IDL에서 변수 또는 배열을 일종의 클래스(Class) 기반의 문법으로 처리하는 개념에 관하여 간략하게 살펴보고자 합니다. 이러한 개념은 IDL 8.4 버전에서부터 도입되기 시작하였습니다. 이것은 단일값 변수 및 배열과 같은 항목 자체를 마치 하나의 객체(Object)처럼 취급하면서 그것에 대한 다양한 속성(Attribute)들의 확인 또는 메서드(Method) 형태의 명령을 적용하여 여러가지 처리를 할 수 있도록 해주는 개념으로 이해하면 됩니다. 물론 이러한 원론적인 설명만으로는 좀 부족할 것 같고 관련 예제들을 통해서 그 개념을 이해하는 것이 더 좋을 것 같습니다. 일단 다음과 같이 단일 정수형 값을 포함하는 변수를 정의합니다.

 

IDL> var = 47

 

이러한 변수 var에 대하여 몇가지 속성(Attribute)들을 확인해봅시다. 먼저 이러한 클래스 기반의 작업에 있어서는 기본적으로 도트 표기(dot notation) 방식의 문법이 필수입니다. 먼저 이 값이 어떤 자료형인지를 확인하기 위하여 TYPENAME이라는 속성을 확인하는 방법입니다.

 

IDL> PRINT, var.TYPENAME
INT

 

이와 같이 변수 var의 값이 INT 즉 정수형임을 확인할 수 있습니다. 그리고 이 값의 자료형의 바이트(Byte) 수를 TYPESIZE 속성으로 확인할 수 있습니다.

 

IDL> PRINT, var.TYPESIZE
           2

 

즉 변수 var의 값은 2바이트의 일반 정수형(Integer) 값이라는 의미입니다. 또한 NDIM이라는 속성이 있는데 말 그대로 차원의 갯수를 의미합니다.

 

IDL> PRINT, var.NDIM
           0

 

여기서는 0이란 값이 출력되었는데 이유는 그 대상인 var가 단일값(Scalar)을 담은 변수이기 때문입니다. 그러면 이번에는 그 대상이 단일값이 아닌 배열인 경우를 봅시다.

 

IDL> var = FINDGEN(3, 2)
IDL> HELP, var
VAR             FLOAT     = Array[3, 2]
IDL> PRINT, var.NDIM
           2

 

이와 같이 3x2의 구조를 갖는 실수형 2차원 배열 var를 정의하고 NDIM 속성을 확인해보면 차원의 갯수인 2를 얻게 됩니다. 또한 각 차원별 크기는 DIM 속성으로 확인할 수 있습니다.

 

IDL> PRINT, var.DIM
           3           2

 

그리고 앞서 이미 사용해보았던 자료형 관련 속성들도 다음과 같이 확인할 수 있습니다.

 

IDL> PRINT, var.TYPENAME
FLOAT
IDL> PRINT, var.TYPESIZE
           4

 

사실 이와 같은 작업은 굳이 이렇게 클래스 개념의 문법을 사용하지 않고도 거의 다 할 수 있기는 합니다. 즉 기존의 문법에서는 TYPENAME, SIZE 등의 내장함수들을 사용하여 비슷한 작업을 할 수 있습니다. 다만 이와 같이 하나의 클래스 개념으로서 도트 표기 문법 기반의 다양한 기능들을 비교적 간편하게 사용할 수 있게 된 것이고, 어떤 면에서는 기존의 문법보다도 좀 더 현대적인 프로그래밍 언어스럽게 변화된 방식이라고 봐도 될 듯 합니다.

 

그리고 이러한 클래스 기반의 처리 기능들은 좀 더 세분화되어 제공되고 있는데요. 먼저 IDL_Number라는 클래스에 대하여 자세히 살펴봅시다. 역시 단일값 또는 배열에 대하여 적용 가능한 여러가지 기능들이 있는데 예를 들어 ROUND라는 메서드(Method)를 사용해본 예제는 다음과 같습니다.

 

IDL> num = 5.7
IDL> PRINT, num.ROUND()
           6

 

이와 같이 ROUND 메서드는소수점을 포함하는 실수형 값에 대하여 반올림한 정수형 값을 전달하는 역할입니다. 비슷한 맥락의 CEIL, FLOOR와 같은 메서드들도 있습니다. 여기서 메서드(Method)라는 개념은 일종의 명령과 같다고 보면 됩니다. 이러한 메서드들은 별도의 인수들(Arguments)을 필요로 하는 경우가 있어서 그 인수들을 괄호안에 넣어줘야 할 수도 있습니다. 다만 여기서 사용된 ROUND 메서드의 경우는 별도의 인수들은 필요 없기 때문에 그냥 빈 괄호로만 적어줍니다. 그리고 그 대상은 단일값 변수 뿐 아니라 배열이어도 됩니다.

 

IDL> num = [3.2, 8.7]

IDL> PRINT, num.ROUND()
           3           9

 

그리고 MIN, MAX, MEAN, MEDIAN과 같은 메서드들도 지원되는데 주로 배열을 대상으로 최소값, 최대값, 평균값, 중간값을 산출해주는 역할을 합니다. 적용 예제를 보면 다음과 같습니다.

 

IDL> num = [82, 66, 73, 90, 77]
IDL> PRINT, num.MIN()
      66
IDL> PRINT, num.MAX()
      90
IDL> PRINT, num.MEAN()
      77.6000
IDL> PRINT, num.MEDIAN()
      77.0000

 

그리고 대상 값의 부호 즉 + 또는 - 여부를 확인해주는 SIGNUM이라는 메서드도 있습니다.

 

IDL> num = [22.7, -9.5, 13.1]
IDL> PRINT, num.SIGNUM()
      1.00000     -1.00000      1.00000

 

사실 위와 같은 작업들은 기존에 이미 지원되던 유사 기능의 내장함수들로도 처리가 가능하긴 합니다. 즉 몇몇 작업들의 예를 들면 다음과 같이 처리해도 됩니다.

 

IDL> num = [3.2, 8.7]
IDL> PRINT, ROUND(num)
           3           9

 

IDL> num = [82, 66, 73, 90, 77]
IDL> PRINT, MEAN(num)
      77.6000

 

따라서 굳이 클래스 기반의 문법을 새롭게 도입하여 사용할 필요가 있을까에 대한 의문이 유저 입장에서는 들 수도 있습니다. 하지만 향후에 소개될 클래스 및 메서드 기반의 기능들 중에서는 기존의 문법에는 없었거나 기존에 비하여 더 간편하고 편리한 문법으로 작업이 가능한 경우들도 있습니다. 따라서 내용을 자세히 살펴보고 유저 입장에서 좀 더 편한 방향으로 선택하여 사용하면 될 것 같습니다.

 

그러면 다음에 이어질 후속 게시물에서는 추가적인 클래스 및 메서드들을 계속 이어서 살펴보기로 하겠습니다.

LIST