LOGICAL 값과 INTEGER 값의 암묵적 변환
LOGICAL 값과 INTEGER 값의 암묵적 변환
다른 컴파일러와의 호환성을 위해 GNU Fortran은 LOGICAL 값과 INTEGER 값을 서로 암묵적으로 변환해 주는 확장 기능을 제공해요. 이 이야기는 주로 레거시 코드를 다룰 때, 또는 다른 컴파일러에서 작성된 코드를 gfortran으로 옮길 때 유용한 내용이에요. 표준적인 Fortran에서는 이런 변환이 허용되지 않는다는 점을 먼저 짚어 두고 시작할게요.
본문
LOGICAL에서 INTEGER로
LOGICAL 값을 INTEGER 값으로 변환할 때는 .FALSE.가 0으로, .TRUE.가 1로 해석돼요. 즉 참은 1, 거짓은 0이 되는 거죠. 아래 예시는 LOGICAL 변수 l에 정수 1을 대입하는 코드인데, 이 값은 .TRUE.로 해석돼요.
LOGICAL :: l
l = 1
여기서 주의할 점은, 이 코드는 표준 Fortran에서는 오류로 간주된다는 거예요. 표준을 엄격히 따르는 컴파일러라면 타입이 맞지 않는 이 대입을 거부할 수 있어요. 그런데 GNU Fortran은 다른 컴파일러와의 하위 호환성을 위해 이 확장을 허용하고 있죠.
INTEGER에서 LOGICAL로
반대로 INTEGER 값을 LOGICAL 값으로 변환할 때는 값 0이 .FALSE.로 해석되고, 0이 아닌 어떤 값이든 .TRUE.로 해석돼요. 예를 들어 아래처럼 INTEGER 변수 i에 .TRUE.를 대입하면, i에는 정수 1이 저장돼요.
INTEGER :: i
i = .TRUE.
즉 이 변환은 두 방향 모두 대칭적으로 정의되어 있어요. LOGICAL → INTEGER일 때는 참/거짓이 각각 1/0으로, INTEGER → LOGICAL일 때는 0이 거짓, 0이 아닌 값이 참이 되는 식이에요.
변환이 적용되지 않는 경우
그런데 이 암묵적 변환이 항상 통용되는 건 아니에요. 적용되지 않는 예외 상황이 몇 가지 있어요.
if문 안에서는INTEGER값의 암묵적 변환이 일어나지 않아요. 즉if문의 조건 자리에LOGICAL이 아닌INTEGER표현식을 그대로 쓸 수는 없다는 뜻이에요.- I/O 연산 안에서는
LOGICAL값이나INTEGER값의 암묵적 변환이 일어나지 않아요. 예를 들어 출력 문에서 두 타입을 섞어 쓰는 경우에도 명시적 변환이 필요할 수 있어요.
이 지점은 실제 코드를 다룰 때 헷갈리기 쉬우니 꼭 기억해 두는 게 좋아요. 확장 기능이라고 해서 모든 문맥에서 통용되는 건 아니라는 점, 그래서 표준을 따르는 코드를 작성하는 관점에서는 이런 암묵적 변환에 의존하기보다 명시적으로 타입을 변환해 주는 편이 안전하다는 점을 함께 알아두면 좋아요.
더 알아보기
- GNU Fortran Compiler 문서에서 확장 기능 전반을 다루고 있어요.
LOGICAL값이 메모리 안에서 어떻게 표현되는지 궁금하다면 LOGICAL 변수의 내부 표현 문서를 함께 보면 도움이 돼요.- 다른 컴파일러와의 호환성 확장 목록을 한 번에 보고 싶다면 gfortran 매뉴얼의 관련 절을 참고해 보세요.