정수형 (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까지의 정수만을 사용할 있는 범위형을 정의한다면 다음과 같이 있다.

Type

   MyNumber = 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번째 줄을 참고하라.

+ Recent posts