옛 스타일 변수 초기화

옛 스타일 변수 초기화 (Old-style variable initialization)

INTEGER i/1/,j/2/처럼 타입 선언 뒤에 슬래시로 값을 넣어 초기화하는 코드를 본 적 있나요? 이건 옛 포트란 코드에서 흔히 쓰이던 패턴이에요. gfortran이 이를 허용하는 범위와, 표준 문법으로는 어떻게 바꿔야 하는지 살펴볼게요.

출처: Old-style variable initialization

본문

GNU Fortran은 다음과 같은 형태의 옛 스타일 변수 초기화를 허용해요.

      INTEGER i/1/,j/2/
      REAL x(2,2) /3*0.,1./

초기화 구문의 문법은 DATA 문과 같아요. 하지만 DATA 문과 달리, 초기화는 바로 앞에 있는 변수에만 적용돼요. 다시 말해 INTEGER I,J/2,3/ 같은 형태는 유효하지 않아요. 이 형식의 초기화는 이중 콜론(::)이 없는 선언에서만 허용돼요. 이중 콜론은 Fortran 90에서 도입되었는데, 동시에 타입 선언에서 변수를 초기화하는 표준 문법도 도입했어요.

위 예시와 동등한 표준 준수 코드의 예는 다음과 같아요.

! Fortran 90
      INTEGER :: i = 1, j = 2
      REAL :: x(2,2) = RESHAPE((/0.,0.,0.,1./),SHAPE(x))
! Fortran 77
      INTEGER i, j
      REAL x(2,2)
      DATA i/1/, j/2/, x/3*0.,1./

이 예시를 보면 흐름이 명확해져요. Fortran 90 이후 문법에서는 INTEGER :: i = 1, j = 2처럼 이중 콜론과 함께 각 변수에 값을 직접 넣으면 돼요. 배열 x(2,2)RESHAPE을 써서 값을 배치하는데, /3*0.,1./이 의미하는 "0을 3번, 그리고 1"이라는 값을 (/0.,0.,0.,1./)로 명시적으로 나열했어요.

한 가지 주의할 점은, 선언이나 DATA 문에서 명시적으로 초기화된 변수는 자동으로 SAVE 속성을 갖게 된다는 거예요. 즉 초기화된 변수는 실행 중 상태가 유지(저장)되므로, 서브루틴이 끝난 뒤에도 그 값이 보존된다는 의미예요. 옛 코드를 옮길 때 이 암묵적인 SAVE 동작을 간과하면 예상치 못한 동작을 만날 수 있어요.

더 알아보기

  • 옛 스타일 종류(kind) 지정 (같은 절의 인접 항목)
  • DATA 문과 SAVE 속성
  • Fortran 90의 타입 선언 초기화 문법