포트란의 기본 자료형은 다음의 5 가지이다.

정수형 INTEGER
실수형 REAL
복소형 COMPLEX
논리형 LOGICAL
문자형/문자열 CHARACTER

( 세부적인 자료형의 규정은 KIND 로 배열은 DIMENSION 으로 한다. 또, C의 구조체와 마찬가지로, TYPE 을 통한, 사용자 정의 데이터형도 사용 가능하다. )


변수의 선언시 위의 키워드와 함께 :: 를 사용하는 것이 새로운 규약이다.
물론, 90/95 가 이전버전과 호환이 되도록 만들어졌기 때문에 :: 을 생략해도 되지만, 되도록 써주는 것이 좋다.

예.   INTEGER :: i , j



1. 정수형 데이터 타입

정수형 상수는 점을 찍을 경우, 실수로 인식한다.

예. 100 은 정수지만, 100. 과 같이 점을 찍으면 실수이다.

정수형 데이터가 메모리에 저장될때, 기본 크기는 해당 컴퓨터의 word 싸이즈에 의존한다.
가령 4바이트 워드 컴퓨터 ( 32비트 컴퓨터) 의 경우, 정수형 데이터는 기본 4바이트가 된다.

몇 바이트 형 정수형 데이터 타입을 쓸 것인가는 KIND 를 사용해서 기술할 수 있다.

INTEGER ( KIND = kindnumber ) :: variables
INTEGER ( kindnumber ) :: variables

kindnumber 는 보통 바이트수를 나타내는데, 꼭 그런건 아니며 컴퓨터/컴파일러에 의존적이다. 

사용하고자 하는 숫자가 몇바이트 정수형을 요구하는지를 체크하는 함수로 SELECTED_INT_KIND()수가 있다.

SELECTED_INT_KIND( range

가령 SELECTED_INT_KIND(x) 는  ( -10^x ,  +10^x ) 을 표현하는데 요구되는 최소 kind_number 를 준다.

예를 들어, 본인의 x200 / 인텔패럴렐스투디오 로 SELECTED_INT_KIND(18) 를 출력해보면, KIND = 8 이 나온다.
반면, SELECTED_INT_KIND(19) 는 -1 이 나오는데, 이는 해당범위를 나타낼수 있는 정수형 타입을 기본적으로 제공하지 않는다는 것이다.

정수형 상수의 경우에도, 메모리사이즈를 지정해줄수 있다. 상수 뒤에 underscore _ 와 kind 를 기술해주는 것이다.
예를 들어, 32 라고 하면, 이것은 디폴트 kind 를 갖는다.
그러나, 32_8 이라고 하면, 8바이트(64비트) 정수형 자료가 된다.

SELECTED_INT_KIND() 는 생긴건 이래 생겼어도, 엄연히 내장함수다 ㅡ_ㅡ;




10의 지수형 범위가 아니라, 그냥 해당 상수나, 해당 변수에 대해서 직접 KIND 를 주는 내장함수로 KIND() 가 있다.
이것은 자신의 디폴트를 확인하는데도 유용하다.

KIND( data )

예. KIND( 3 ) , KIND( 3_8 )             앞에꺼는 디폴트를 줄것이고, 뒤에껏은 8 을 준다.

예. KIND (i)                                  변수 i 의 KIND 를 보여준다.

참고로, KIND() 함수는, 정수형데이터에 국한되는 것이 아니라, 범용적으로 쓸 수 있는 함수이다.



2. 실수형 데이터 타입

실수형상수에서 지수형표기법은 E 와 D 를 사용하는데, E는 싱글프리시젼(single precision) , D는 더블 프리시전( double precision) 용이다.
(참고로, 유효숫자 부분에 소숫점을 찍는게 원칙.)

C에서 싱글프리시전으로 float , 더블프리시젼으로 double 을 썼던것과 비슷하게, 포트란에서는 KIND 를 이용해, 실수 자료형의 정밀도를 선택할 수 있다.

참고로, 보통, 32bit 워드 컴퓨터의 경우 보통 싱글 프리시젼이 싱글워드(32bit), 더블 프리시젼이 더블워드(64bit) 인데,
64비트 프로세서의 경우 싱글이 64비트, 더블이 128비트인 경우도 있다.

가장 흔한 경우는, KIND = 4 가 4바이트실수(32비트)형 ,  KIND =8 이 8바이트실수(64비트)형이다.

역시, 실수형 상수 뒤에 underscore _ 와 kind number 를 써줌으로써, 상수데이터도 세부적인 데이터타입을 지정할수 있다.

예.    32.  은 디폴트,  32._8   은 KIND=8 이다.
        32.E0 은 싱글프리시젼, 32.D0 는 더블프리시전이다.   ( E0 나 D0 모두 10^0 승 이므로, 수치상의 변화는 없다. )

실수형 변수의 선언은 다음과 같다.

REAL(KIND= kind number) :: variables
REAL(kind number) :: variables

() 의 kind 는 옵션으로 생략하면 디폴트가 적용된다.

정수형에 SELECTED_INT_KIND() 함수가 있었던 것처럼, 실수형에는 SELECTED_REAL_KIND() 함수가 있다.

SELECTED_REAL_KIND( p= precision, rrange )

여기서, precision 은 유효숫자의 수이고, range 는 10의 지수범위이다.

리턴값은 kind number 이고,  precision 에서 오바되면 -1 , range 에서 오바되면 -2 , 둘다 오바되면 -3 을 리턴한다.

다음과 같은 형태로 입력해도 된다.
SELECTED_REAL_KIND( precisionrange )
SELECTED_REAL_KIND( p= precision )
SELECTED_REAL_KIND( rrange )
SELECTED_REAL_KIND( precision )





리얼 데이터의 프리시젼과 레인지를 갈챠주는 내장함수로 다음의 두 함수가 있다.

PRECISION( real_or_complex )
RANGE( real_or_complex )

두 함수 모두 인자로 실수데이터나 복소수데이터르 받는다.
precision() 은 decimal precision 을 리턴하고,
range() 는 decimal exponent range 를 리턴한다.

어떤 실변수가 있을때, 그 변수에 대한 제반정보 3가지 ( KIND , PRECISION, RANGE ) 를 아는 것은 때때로 중요하다. 그것은 코드가 다른 컴퓨터에서 수행될때를 고려할때 특히 더욱 그러하다. 많은경우, 코드를 짤때, 프로그램이 실행되는 환경에 맞춰 돌아갈수 있도록 위의 정보에 대한 부분을 삽입한다.


3. 복소형 데이터 타입

아무래도 계산에 특화된 프로그래밍 언어다보니, 복소형 타입이 사용자정의형으로 만들어서 쓰는게 아니라 그냥 기본형타입으로 지정되어있다.

복소상수는 (a,b) 꼴로 씌여지고, 이것은 a + i b 를 나타낸다. 여기서 a 와 b는 자동으로 실수타입으로 가정된다.


복소변수의 선언은 다음과 같다.
COMPLEX (KIND= kind number ) :: variables
COMPLEX (kind number ) :: variables

KIND 는 실수형과 같다. 다만, 실수타입 두개를 하나로 통채로 사용할 뿐이다.

복소수의 기본적인 사칙연산은 우리가 아는 그대로 적용된다.



복소수 타입은 실수 타입을 포함하는 데이터타입으로, 상당히 유연하여, 실수와 믹스트모드로 연산이 가능하다.
( 각종 혼합모드의 연산에 대해서는 따로 다루도록 한다. )

예를들어, 3 + (2,4) = (5,4) 로 연산된다.
즉, 복소수의 입출력에 있어서도, 괄호없이 실수만 입력할경우 그것을 실수부로 받아들이고, 허수부는 0 이 되도록 한다.

포트란의 복소수 타입은 사칙연산 외에도 다른 연산들을 지원하는데, 특히 염두에 둘 것은 거듭제곱 연산자 ** 이다.
가령, (3,2) **  0.5 이나 (3,2) ** (4,-1) 과 같은 연산이 가능하다.



4. 논리형 데이터 타입

논리상수는  .TRUE. 와 .FALSE.  두가지인데, 주의할 점은, 양쪽에 점을 찍어줘야 한다는 거다. 그렇지 않고, 그냥 TRUE 와 FALSE 로 넣게 되면, 변수명이 된다.

.TRUE. 와 .FALSE. 를 그냥 WRITE로 찍으면,  .TRUE. 는 T 로 , .FALSE. 는 F 로 인쇄된다.
논리형 타입의 입력시에도 .TRUE. 나 .FALSE 대신 T 와 F 로 간단히 입력할 수 있다.

논리형 변수 선언.

LOGICAL :: variables

대소비교 연산이나 조건분기 등의 조건문에 대한 평가는 논리값으로 이루어진다.

논리연산자에 대해서는 따로 다루기로 한다.



5. 문자형 데이터 타입

포트란의 문자 및 문자열 상수는 따옴표 ( single quote ) 나 쌍따옴표 ( double quote ) 를 사용한다.
C에서는 문자에 싱글 따옴표, 문자열에 더블 따옴표였는데, 포트란에서는 짝만 맞게 써주면 구분하지 않는다.

근데, 이것이 신기한 유용성을 가져다 준다.

가령,   Man's best friend    라는 문자열을 묶어서 문자열 상수로 만들때, 외따옴표로 묶는 방법과, 쌍따옴표로 묶는 방법을 살펴보면, 다음과 같다.

외따옴표   :     'Man''s best friend'                   어파스트로피를 찍기위해 ' 를 연달아 두번 찍어준다.
쌍따옴표   :     "Man's best friend"                    쌍따옴표로 묶을때는 어파스트로피가 문제되지 않는다.


쌍따옴표 자체가 들어있는 문장을 찍을때는 그 문장자체를 외따옴표로 감싸고, 혹시 그 안에 어파스트로피 있으면, 외따옴표를 연달아 써서 '를 찍도록 한다.

예를들어  "This is me."  를 나타내는 문자열상수는    ' "This is me." '         으로 쓸 수 있다.

예.



문자/문자열 변수의 선언은 다음과 같다.

CHARACTER :: single_character_variables

CHARACTER ( len = length ) :: string_variables
CHARACTER ( length ) :: string_variables

즉, 길이를 넣어주면 문자열이고, 안넣어주면 문자형이다.



참고로, 포트란 77 문법은 다음과 같다.

CHARACTER*length variables
CHARACTER variable_name1 * length1 , variable_name2 * length2 , ...



Datatype Conversion Functions

마지막으로, 데이터 타입 변환 함수에 대해서 살펴보자.

C에서 괄호를 이용해 캐스트연산자를 쓴것과 비슷하게, 포트란 90/95 에서 자료형변환 함수가 다음과 같이 제공된다.

INT(x)                    실수자료에서 소숫점이하 버리고 정수부분만 리턴한다.
NINT(x)                  소수부분을 반올림한 정수를 리턴한다. 앞의 N 은 nearest 를 의미한다.
REAL(i)                   정수값을 실수형으로 변환한다.