본문 바로가기

Developement/DELPHI (pascal)

[DELPHI] 기본 문법 - 구조체, 사용자 정의.


델파이는 기본적으로 구조체를 record 로 정의 하고 있습니다.
또한 이름은 관례적으로 T 를 앞에 붙이고 있습니다.

type
    TstructExample = record
        testInt : integer;
        testByte : byte;
        testString : string;
    end; // of TstructExample;

이렇게 선언된 구조체는 class 내나 변수선언 부 에서 정의 할 수 있습니다.

var
    structExample : TstructExample;

또한 이 구조체를 포인터로만 선언 하고 싶다면 다음과 같이 선언 할 수 있습니다.

var
    pStructExample : ^TstructExample;

C 에서 * 을 붙이는 것과 비슷하게 ^을 붙임으로서 포인터로 사용이 가능합니다.
하지만 델파이에서 포인터 사용은 C 에서처럼 유연하고 편리하게 사용이 어려움 으로서 type casting 에 유의 하면서 써야 합니다. (하지만 조금만 머리를 굴리면 pointer 형태를 가지고 C 에서처럼 사용이 가능하긴 합니다만 그 편리함은 떨어 집니다)

여기서 알수 있는 차이가 하나 있다면 C 에서는 포인터 참조일 경우 구조체 및 class member 접근시 링크 표시인 -> 을 사용하지만 델파이선 그냥 . 을 이용합니다.

예로 다음 두 코드를 비교해 보도록 하겠습니다.

typedef
    struct {
        int testInt;
        unsigned char testByte;
        char *testString;
    }TstructExample;

int main(int argc; char *argv[])
{
    TstructExample structExample;
    TstructExample *pStructExample;

    pStructExample = &structExample;
    pStructExample->testInt = 1000000;
    structExample.testByte = 100;
    structExample.testString = "TEST STRING";

    return 0;
}

type
    TstructExample = record
        testInt : integer;
        testByte : byte;
        testString : string;
    end;

var
    structExample : TstructExample;
    pStructExample : ^TstructExample;
begin
    pStructExample := @structExample;
    pStructExample.testInt := 1000000;
    structExample.testByte := 100;
    structExample.testString := 'TEST STRING';
end.

두 예제를 보면 문법적인 차이 외엔 C 나 델파이나 크게 다를게 없어 보인다고 생각이 듭니다.
실제 DLL 등을 만들고 나서 사용함에 있어 PACKED 형으로 선언하는 경우가 아니라면 C 에서 만들어진 struct 와 델파이에서 만들어진 record 의 메모리나 디스크에 저장되는 파일의 구조는 동일 합니다.

C 에서는 포인터 대입 연산자가 & 임에 반해, 델파이에서는 @ 라는 차이를 제외 한다면 C 를 쓰던 사람이 델파이를 쓰기에 어려움이 없고, 델파이를 쓰던 사람이 쉽게 C 를 할 수 있는 이유도 이런 차이라 생각 합니다.
두가지 언어를 모두 함께 사용하면서 어느 목적에 맞게 선택적으로 컴파일러를 고르는 것도 중요한 일이 아닐까 하는군요.

자, 이제 그럼 사용자 정의 는 어떻게 이루어 지는 걸까요 ?
불행히 델파이에서는 C 에서처럼 #define 을 통한 매크로를 만들 수 는 없습니다.
하지만 {$DEFINE xxxx} 처럼 C 에서처럼 선언은 가능하지만 {$DEFINE xxxx} 으로 선언된 것들이 코드 내에서 그대로 사용은 불가능 합니다.

그래서 존재 하는것이 const 입니다.
이 const 는 값을 참조만 할 수 있고 대입은 불가능한 변수형태 입니다. 실제로 #define AAAA 10 처럼 AAAA 심볼은 pre-compile 시 10 이 대입 되는 것과 동일 하게 사용이 가능합니다.

const
    AAAAA = 10;

const 시엔 #define 과 같이 데이터 형을 꼭 정의 할 필요는 없습니다만 메모리절약 등이나 typecast 를 위해 정의를 할 수도 있습니다.

const
    AAAAA : integer = 10;

이때 주의 해야 할 점은 const 에서 정의 되는 심볼엔 대입연산자 := 가 사용되지 않는 다는 차이가 있습니다.
이를 헤깔리면 컴파일 할때 오류가 나겠지요 ^^;

또한 C 에서의 typedef 처럼 특정 타입을 재정의 하는 것이 가능합니다.
예로 100byte 의 크기를 가지는 배열을 ThundredByte; 라는 형태로 정의 하고자 한다면 이렇게 되겠죠.

type
    ThundredBytes = array[0..99]of byte;

사용은 record 에서처럼 var 내에서 정의 해서 사용하면 됩니다.

이로서 기본적인 델파이 문법의 설명이 끝나 가는군요.
다음은 델파이의 unit 에 대해 배워 보도록 하겠습니다.