IDL/Programming

포맷(Format) 코드의 이해 [1]

이상우_IDL 2015. 6. 18. 23:24
728x90

포맷(Format)이라고 하면 프로그래밍에서 값의 입출력에 있어서 서식을 지정하는 경우에 등장하는 용어입니다. 숫자의 자리수, 문자의 필드수, 공백의 수 등등을 자료형(Type)에 맞게 지정하는데 있어서 대표적으로 I, F, A 등의 기술자(Descriptor)들을 사용하게 됩니다. 사실 프로그래밍을 조금이라도 배우신 분들이라면 많이들 아실만한 내용이기도 합니다만, 이 포맷에 관한 내용도 타 언어와 공통적이며 기본적인 부분이 있고 IDL에서만 좀 특별한 부분들도 있습니다. 그래서 기회가 되는대로 순차적으로 다뤄볼 계획을 갖고, 게시물의 제목에 [1]이라는 번호를 붙여봤습니다.


오늘은 가장 기본적인 서식 지정 출력(Formatted Print)에 관한 내용부터 언급하기로 합니다. 가장 자주 사용되는 I, F, A 기술자들을 위주로 소개하고자 합니다. 여기서 I는 정수형, F는 실수형, A는 문자형 값에 대한 서식 지정을 할 때 사용됩니다. 물론 이런 내용은 IDL 도움말에도 있긴 합니다만, 제가 나름대로 도식적으로 정리해보았습니다. 먼저 정수형을 다루는 I 기술자를 사용한 출력에 관한 설명 그림입니다.



설명된 것과 같이 알파벳 I 뒤에 나오는 숫자는 필드(Field)의 크기입니다. 서식을 위하여 할당되는 한 칸의 공간이라고 보면 됩니다. 필드의 크기는 기술하고자 하는 숫자의 자리수보다 여유가 있어야 합니다. 그렇지 않으면, 즉 필드 크기가 모자라면 모든 필드를 * 기호로 대체해버리고 끝나게 됩니다. 따라서 어떤 자료형의 서식이든 다 마찬가지이겠지만, 필드 크기가 그 값을 포함할 만큼 충분해야 합니다. 그리고 마이너스(-) 부호가 필드 하나를 점유한다는 점도 반드시 주의해야 합니다. 다음은 위의 그림에서 설명된 내용에 따라 IDL에서 출력을 해본 결과입니다.


IDL> PRINT, 32, FORMAT='(I6)'

    32

IDL> PRINT, 32, FORMAT='(I4)'

  32

IDL> PRINT, 32, FORMAT='(I2)'

32

IDL> PRINT, -32, FORMAT='(I2)'

**


자 그런데 정수형 I 기술자의 경우는 약간 특이한 사용 방식이 있습니다. 일단 그림부터 봅시다.



즉 I 기술자 뒤에 붙는 숫자 뒤에 점이 붙고 그 뒤에 또 다른 숫자가 나오는 방식입니다. 이런 표기는 실수형 F 기술자에서는 당연한 것이지만, I 기술자에서 이런 표기법이 지원된다는 점도 알아두는 것이 좋습니다. 여기서 I 바로 뒤에 붙는 숫자는 당연히 전체 필드 크기에 해당된다는 것은 동일하지만, 점 뒤에 붙는 숫자는 "어떤 숫자든 무조건 들어가야 하는" 필드의 크기입니다. 원래 필드의 공간이 남으면 공백으로 두는 것이 원칙이지만, 점 뒤에 붙는 숫자 크기 만큼의 필드들은 절대로 비어있으면 안되는 부분입니다. 따라서 위의 그림에서 설명된 것처럼, 이런 필드에는 최소한 0이라도 집어 넣어야 합니다. 다음은 위의 그림에서 설명된 내용에 따라 IDL에서 출력을 해본 결과입니다.


IDL> PRINT, 32, FORMAT='(I6.3)'

   032

IDL> PRINT, 32, FORMAT='(I6.4)'

  0032

IDL> PRINT, 32, FORMAT='(I6.6)'

000032


이렇게 점이 붙는 숫자들로 구성된 I 기술자는 사실 굉장한 효용성이 있습니다. 즉, 숫자의 모습을 띈 문자값들을 생성하는데 있어서, 다음과 같이 빈 자릿수 부분을 0으로 채워넣는 서식으로 된 값들을 만드는 경우입니다. 프로그래밍을 하다 보면, 이런 서식의 값들이 필요한 경우가 분명히 있습니다.


IDL> a = INDGEN(6)+8

IDL> FOR i=0, 5 DO PRINT, a[i], FORMAT='(I3.3)'

008

009

010

011

012

013


이러한 방식으로 I 기술자를 활용하는 방법은 일련번호들을 동일한 자릿수로 생성해야 할 경우 매우 유용합니다. 이러한 일련번호들을 파일명의 뒷부분에 붙인다든지 하는 작업이 그러한 예입니다. 예를 들면 다음과 같이 일련번호들이 들어간 txt 확장자의 파일명들을 생성하여 그 이름 문자값들을 배열로서 만들 수 있습니다.


IDL> file_names = 'file_'+STRING(a, FORMAT='(I3.3)')+'.txt'

IDL> FOR i=0, 5 DO PRINT, file_names[i]

file_008.txt

file_009.txt

file_010.txt

file_011.txt

file_012.txt

file_013.txt


즉, 바로 위 예제에서 생성했던 배열 a의 정수값들을 STRING 함수를 사용하여 I3.3 형식의 문자값들로 변환하고, 이 값들을 파일명의 중간 부분에 붙이는 작업이 됩니다. 따라서 STRING 함수도 형변환 함수로서 잘 활용하면 매우 다양하게 써먹을 수가 있다는 점도 알아두시면 좋습니다.


오늘은 정수형 I 기술자를 이용한 출력 및 활용에 관한 내용을 다뤄보았습니다. 다음 시간에는 실수형 F 기술자에 관하여 알아보겠습니다.

LIST