옛 스타일 종류(kind) 지정

옛 스타일 종류(kind) 지정 (Old-style kind specifications)

REAL*8처럼 타입 이름 뒤에 *와 크기를 붙이는 표기, 본 적 있나요? 이건 오래된 코드에서 흔히 보이는 옛 스타일의 종류(kind) 지정이에요. gfortran이 이를 어떻게 해석하고, 현대 표준 문법으로는 어떻게 바꿔 쓰면 되는지 살펴볼게요.

출처: Old-style kind specifications

본문

GNU Fortran은 선언에서 옛 스타일의 종류 지정을 허용해요. 다음과 같은 형태로 보여요.

      TYPESPEC*size x,y,z

여기서 TYPESPEC는 기본 타입(INTEGER, REAL 등)이고, size는 해당 타입의 유효한 kind에 대응하는 저장 크기(바이트 수)예요. (COMPLEX 변수의 경우 size는 실수부와 허수부를 합친 전체 크기예요.) 이 문장은 x, y, z를 적절한 kind를 가진 TYPESPEC 타입으로 선언해요.

이것은 표준에 부합하는 다음 선언과 동등해요.

      TYPESPEC(k) x,y,z

여기서 k는 의도한 정밀도에 적합한 kind 파라미터예요. kind 파라미터는 구현에 의존적이기 때문에, 올바른 값을 얻으려면 KIND, SELECTED_INT_KIND, SELECTED_LOGICAL_KIND, SELECTED_REAL_KIND 내장 함수를 사용해야 해요. 예를 들어 REAL*8 x는 다음과 같이 바꿔 쓸 수 있어요.

INTEGER, PARAMETER :: dbl = KIND(1.0d0)
REAL(KIND=dbl) :: x

핵심은 옛 스타일이 "크기가 정확히 몇 바이트인지"를 직접 적는 방식이라면, 표준적인 방식은 KIND 파라미터라는 추상적인 값을 통해 정밀도를 지정한다는 점이에요. kind 값이 컴파일러마다 다를 수 있으니, REAL*8 같은 하드코딩된 크기보다는 KIND(1.0d0)처럼 내장 함수로 kind를 구하는 코드가 이식성이 훨씬 좋아요. 오래된 코드를 현대 표준으로 옮길 때는 이런 식으로 *크기 표기를 kind 지정으로 치환해 주면 돼요.

더 알아보기

  • KIND, SELECTED_INT_KIND, SELECTED_REAL_KIND 내장 함수
  • 옛 스타일 변수 초기화 (같은 절의 인접 항목)
  • 타입 선언과 kind 파라미터