▶ 정수형 (Integer형)
정수형은 일반적인 숫자를 표현하는데 사용되는 자료형이다. 정수형은 표현할 수 있는 값의 범위에 따라 다시 표와 같이 구분된다.
자료형
|
범 위
|
크기
|
Shortint
|
-128 ~ 127
|
1바이트/ 부호있는 8비트
|
Smallint
|
-32768 ~ 32767
|
2바이트/ 부호있는 16비트
|
Longint
|
-2147483648 ~ 2147483647
|
4바이트/ 부호있는 32비트
|
Int64
|
-(263) ~ (263)-1
|
8바이트/ 부호있는 64비트
|
Byte
|
0 ~ 255
|
1바이트/ 부호없는 8비트
|
Word
|
0 ~ 65535
|
2바이트/ 부호없는 16비트
|
Longword
|
0 ~ 4294967295
|
4바이트/ 부호없는 32비트
|
Integer
|
-2147483648 ~ 2147483647
|
4바이트/ 부호있는 32비트
|
Cardinal
|
0 ~ 4294967295
|
4바이트/ 부호없는 32비트
|
▶ 실수형
실수형은 소수점 이하의 값을 다룰 수 있다는 점에서 정수형과 다르다.
자료형
|
범 위
|
유효 자릿수
|
크 기
|
Real
|
5.0 * 10-324 ~ 1.7 * 10308
|
15 ~ 16자리
|
8바이트
|
Real48
|
2.9 * 10-39 ~ 1.7 * 1038
|
11 ~ 12자리
|
6 바이트
|
Single
|
1.5 * 10-45 ~ 3.4 * 1038
|
7 ~ 8자리
|
4 바이트
|
Double
|
5.0 * 10-324 ~ 1.7 * 10308
|
15 ~ 16자리
|
8 바이트
|
Extended
|
3.6 * 10-4951 ~ 1.1 * 104932
|
19 ~ 20자리
|
10 바이트
|
Comp
|
-263+1 ~ 263-1
|
19 ~ 20자리
|
8 바이트
|
Currency
|
-922337203685477.5808 ~
-922337203685477.5807
|
19 ~ 20자리
|
8 바이트
|
Comp형은 분류상으로는 실수형으로 두었지만, 실제로는 정수형 값이다. 이제는 Int64형을 쓰는 것이 더 효율적이다.(Int64형이 나왔으니깐…) 또한, Currency형도 정확한 돈 계산을 위하여 부동 소수점 연산을 하지 않고 소수점 이하 네 자리만 보존하는 고정 소수점 수이기 때문에 유효 자릿수 이후를 잘라버림으로써 발생하는 Round off오류가 발생하지 않는다. 연산할 때도 자동으로 10000을 곱하고 나누어 주는 기능을 한다. 미국과 같이 달러와 센트 등으로 표기하는 국가에서 사용할 만하지만 우리 입장에서는 Int64형을 쓰는 것이 더 나을 것 같이 보인다
▶ 문자열형
변수를 String형으로 정의하면 Generic형이 되어 기본적으로
AnsiString형으로 정의된다.
자료형
|
최대 길이
|
필요한 메모리양
|
용 도
|
ShortString
|
255문자
|
2 ~ 256바이트
|
과거 버전과의 호환용
|
AnsiString
|
231문자
|
4 ~ 2기가바이트
|
8비트 ANSI 문자열 처리
|
WideString
|
230문자
|
4 ~ 2기가바이트
|
유니코드 문자열 처리
|
▶ Boolean형
Boolean형은 참(True)과 거짓(False), 0과 1등 두가지 값을 표현할 수 있는 기본 자료형이다.
자료형
|
크기 및 표현 범위
|
ByteBool
|
1바이트의
True/False
|
WordBool
|
2바이트의
True/False
|
LongBool
|
4바이트의
True/False
|
Boolean
|
1바이트의
True/False
|
실제로 델파이에서는 주로 Boolean형이 많이 사용되고, 나머지 대수형은 주로 외부 언어나 모듈과 함께 사용된다.
▶ 열거형(Enum형)
열거형은 말 그대로 몇 개의 항목들을 나열하고 그 순서를 값으로 가질 수 있는 자료형이다.
Type
Colors = ( Red, Blue, Yellow, Black, White)
//Colors형의 변수는 열거한
5가지 값들 중에서 한가지를 가질 수 있다.
Var
MyColor : Colors;
Begin
MyColor := Red;
End;
▶ 부분 범위형 (Subrange형)
부분 범위형은 파스칼의 독특한 자료형이다. 부분 범위형은 다른 Ordinal형의 가능한 값 범위의 부분 집합을 의미한다. 예를 들어, 정수들 중에서 1부터 10까지의 정수만을 사용할 수 있는 범위형을 정의한다면 다음과 같이 할 수 있다.
▶ Ordinal형
Ordinal형이라는 것은 순서가 정해진 형을 말한다.
오브젝트 파스칼에서는 Ordinal형으로는 Interger, Character, Boolean, Enumerated,
Subrange형이 있다.
실수의 경우 순서가 있다고 할 수는 있지만, 한 값에 대해 바로 다음 순서가 되는 값을 정할 수가 없다. 그러나 정수형의 경우 항상 1씩 증가하므로 다음 값은 현재 값에 대해 +1을 하면 정할 수가 있다. 마찬가지로 앞의 값도 구할 수 있다.
Ordinal형의 기본연산
함수 이름
|
의 미
|
Ord(X)
|
X의 순서값(정수)를 돌려주는 함수
|
Pred(X)
|
X보다 한 순서 앞의 값을 돌려주는 함수
|
Succ(X)
|
X보다 한 순서 뒤의 값을 돌려주는 함수
|
High(변수 또는 형)
|
주어진 형에 대해 주어질 수 있는 가장 큰 값을 돌려주는 함수
|
Low (변수 또는 형)
|
주어진 형에 대해 주어질 수 있는 가장 작은 값을 돌려주는 함수
|
Inc(X)
|
X 값을 한 순서 뒤의 값으로 증가시켜 주는 프로시저
|
Dec(X)
|
X 값을 한 순서 앞의 값으로 감소시켜 주는 프로시저
|
표준 함수 중에서 정수형을 받아 들이도록 되어 있는 것들은 대부분 Int64형 값을 32비트로 잘라서 받아 들이게 되어 있다. 하지만, 앞에서도 얘기한 바와 같이 High,
Low, Succ, Pred, Inc, Dec, IntToStr, IntToHex 등은 Int64형의 매개변수를 완전히 지원하지만 Ord함수는 받아들이지 못한다.
▶ 집합형 (Set)
집합형은 파스칼에 있는 독특한 자료형이다. 집합형은 기본이 되는 Ordinal타입의 256개 이하의 요소로 구성된 모음을 가질 수 있다.
Type
TintSet = set of 1..250;
Var
Set1, Set2 : TintSet;
…
Set1 := [1, 3, 5, 7, 9];
Set2 := [2, 4, 6, 8, 10];
▶ 배열형
배열은 같은 형의 원소로 구성된 순서가 있는 집합이다. 배열은 정적/동적으로 할당될 수 있다.
[정적배열]
정적배열은 보통 부분 범위형을 써서 다음의 형태로 정의한다.
Var
MyArray : array[1..100] of integer;
이렇게 하면 정수의 배열이 1부터 100까지 100개가 MyArray라는 이름으로 만들어진다. 이 상태에서 MyArray[3]은 MyArray배열의 세번째 원소를 가리키게 된다. 기본형 자리에 다시 배열을 만들면 2차원 배열이 된다.
Var
MyArray : array[1..10] of array[1..50] of Real;
MyArray1 : array[1..10,1..50] of Real;
//MyArray와 MyArray1은 같은 뜻이다.
[동적배열]
동적배열은 델파이 4에서 새로 추가된 기능이다. 동적배열은 크기나 길이를 고정시키지 않는다. 대신에 배열에 값을 할당하거나
SetLength 프로시저를 통해 크기를 변경시킬 때에 동적으로 메모리를 재할당하게 된다.
Var
MyDynamicArray : array of Real;
…
SetLength(MyDynamicArray, 20);
위와 같이 하면 MyDynamicArray에는 20개의 Real변수가 첨자 0부터 19까지 할당되게 된다.
동적 배열은 항상 0부터 시작하는 정수의 첨자를 갖는다.
2차원 이상의 동적배열을 만들고자 할때는 다음과 같이 array
of …를 반복해서 사용한다.
Type
TwoDimDynamicArray: array of array of Real;
Var
TwoDimReal : TwoDimDynamicArray;
…
SetLength(TwoDimReal, 20); //전체 행을
10개로 지정
SetLength(TwoDimReal[0], 5); //첫번째 행에
5개의 실수 배열
▶ 레코드형
C/C++ 등에서 struct형과 매우 유사한 구조로 여러 종류의 자료형으로 된 복합 자료형을 제공한다.
레코드형의 각각의 구성 요소가 되는 변수를 필드라고 한다.
Type
레코드형이름
= record // 예약어 record로써 레코드선언을 시작한다.
필드1 : 형1; // 각각의 필드마다 다른 형을 줄 수 있다.
…
필드n : 형n;
end; // 레코드 선언의 끝
Type
Tstudent = record
Name : String;
No : Integer;
Rec : Double;
end;
이렇게 선언한 레코드의 멤버는 다음과 같은 방법으로 다룰 수 있다.
var
MyRec : Tstudent;
Begin
MyRec.Name := '홍길동';
MyRec.No := 20;
MyRec.Rec := 2.4;
End;
이것은 With문을 사용하여 다음과 같이 사용할 수 있다.
With MyRec do
Begin
Name := '홍길동';
No := 20;
Rec := 2.4;
End;
▶ 포인터형
포인터는 다른 변수의 메모리 주소값을 갖는 변수이다. 포인터가 다른 변수의 주소값을 가지고 있으면 이를 포인터가 그 변수를 가리키고 있다고 말한다.
Procedure
Tform1.Button1Click(Sender: Tobject);
Var
X, Y : Integer;
P : ^Integer; // 정수형 변수를 가리키는 포인터 변수 P의 선언
Begin
X := 17;
Y := 0;
P := @X; // P에는 X의 주소가 대입된다.
Y := P^; // Y에는 P가 가리키고 있는 값이 대입된다.
ShowMessage(IntToStr(Y)); //확인 : 17
End;
포인터 변수의 사용법은 다음과 같다.
[포인터 변수의 선언]
위 예의 4번째 줄처럼 포인터 변수를 선언할 때는 그 포인터 변수가 가리킬 대상 변수의 형 앞에 꺽쇠 표시(^)를 붙여서 포인터임을 표시한다.
[포인터 변수에 주소값의 대입]
포인터 변수를 사용하려면 먼저 어떤 주소값을 가지도록 해야 한다. 가리키고자 하는 변수 이름 앞에 @ 연산자를 쓰면 그 변수의 주소값이 얻어진다. 8번째 줄을 참고하라.
[포인터 변수를 통한 값의 참조]
포인터 변수 자체는 주소값이므로 그를 통해 간접적으로 대상을 가리켜야 한다. 이를 위해 형 선언시와는 반대로 꺽쇠 표시(^)를 포인터 변수 뒤에 붙인다 9번째 줄을 참고하라.