본문 바로가기

Developement/DELPHI (pascal)

[DELPHI] 기본적인 문법 - 시작과 끝, 함수와 변수.

델파이는 기본적으로 pascal 문법을 사용하며, object pascal 형태로 C++ 과 함께 사용될 수 있습니다.
즉, DLL 을 class 로 만든 경우, 델파이에서도 그에 대응하는 class 를 구성함 으로서 사용이 가능하다는 것 입니다.
하지만 이런 방법 이전에 델파이가 사용하는 pascal 의 문법부터 알아 보는 시간을 가져야 겠습니다.

초창기의 pascal 은 매우 단순한 변수형들만 지원을 했습니다만, 컴파일러가 진화 하면서 점점 다양해 지기 시작 했습니다.
또한 pascal 은 상위언어에 속하는 지라 대소문자를 가리지 않습니다. (단, int64 와 Int64 는 다릅니다.)

기본적으로 수를 다루는 함수 형태는 다음과 같이 존재 합니다.
Integer data types :
Byte ( 0 to 255 )
ShortInt ( -127 to 127 )
Word ( 0 to 65,535 )
SmallInt ( -32,768 to 32,767 )
LongWord ( 0 to 4,294,967,295 )
Cardinal ( 0 to 4,294,967,295 )
LongInt ( -2,147,483,648 to 2,147,483,647 )
Integer ( -2,147,483,648 to 2,147,483,647 )
int64 ( -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 )

Decimal data types :
Single ( -38 to +38 , 7 자리 부동소수점 표시)
Currency (고정 소수점 , 50+ 이상)
Double ( -308 to +308 , 15자리 까지 부동소수점 표시)
Extended ( -4932 to +4932 , 19자리 까지 부동소수점 표시)


이 형태들은 C 의 데이터 타입과 byte-order 나 형태 모두 동일 합니다.
다음은 문자열 타입 들 입니다.
Char (문자셋 1바이트 처리만 가능, C 처럼 수를 대입 불가능)
WideCha (유니코드를 위한 2바이트 문자셋 하나를 처리)
AnsiChar (문자셋 1바이트 처리.)
ShortString (255자 까지의 짧은 문자열을 처리)
String (길이제한이 없는 1바이트 문자열)
AnsiString (ansiChar로 처리되는 문자열)
WideString (wideChar 로 처리되는 문자열)

다음은 논리 연산형으로 C 의 bool 이나 BOOL 에 해당하는 형태 입니다.
값은 True,False 이며 , C 와 달리 수를 대입 할 수는 없습니다.
Boolean

또한 C 에서의 Enum 처럼 각 element 를 지정하여 사용 할 수 도 있습니다.
type
  TSuit = (Hearts, Diamonds, Clubs, Spades);
var
  suit : TSuit;

사용은 suit := Hearts; 와 같이 대입연산자만 C 와 다를뿐 사용 방법이 동일 합니다만 C 에서 처럼 enum 값을 숫자로 대칭해서 사용한 것은 어렵습니다. (type casting 문제 입니다)

또한 델파이엔 set 이라는 것이 있어서 다음과 같이 정의가 가능합니다.
type
  TWeek = Set of 1..7;
var
  week : TWeek;

사용은 week := [1,2,3]; 으로 정의가 가능하여 여러개의 set 을 지정하여 property 로 사용이 가능합니다.

또한 편리한 배열 사용을 할 수 있습니다.
배열은 두가지 방법이 조재 하는데, 단순히 길이를 정하여 쓰는 정적배열 과 길이를 설정 할 수 있는 동적배열 입니다.
두 차이는 다음과 같이 정의 될 수 있습니다.
var
    staticArrayBytes :  array[0..1023]of BYTE;
    dynamicArrayBytes : array of BYTE;

델파이는 C 와 달리 배열의 마지막에 NULL 을 처리 하지 않아도 됩니다.
모든 배열은 길이를 가져 올 수 있으며 , 사용되는 함수는 Length(const any); 입니다.
staticArrayBytes 의 길으를 만약 가져 온다면? arrayLen = Length(staticArrayBytes); 로 쓸 수 있으며, return 되는 값은 1024가 되겠지요.
하지만 동적배열은 길이를 정하지 않은 상태 라면 0 을 return 합니다.
그럼 동적 배열은 어떻게 정의 할 수 있을까요?
바로 setLength(length,array); 함수를 사용 할 수 있습니다. setLength() 함수로 대부분의 문자열을 포함해서 대부분의 배열의 길이를 정 할 수 있습니다.
만약 1024byte 만큼 할당 하고 싶으면 .. setLength(1024,dynamicArrayBytes); 와 같이 할 수 있겠습니다.
또한 배열을 사용하고 나서 메모리를 해제 하고 싶으면 간단히 길이를 0 으로 주면 됩니다. setLength(0,dynamicArrayBytes);

여기서 두 배열의 차이는 동적으로 C 에서 malloc() 을 사용하듯이 할당 할 수 있다는 점이 있겠습니다.
하지만 정적배열은 사용에 따라 시작점을 0 이 아닌 다른 수로 정의 할 수 있다는 차이가 있습니다. (크게 사용되진 않습니다만)
그래서 만약 특정 수 부터 사용이 되도록 하고 싶으면 ...
var
    dataOne = array[10..30] of BYTE;
와 같이 정의가 가능합니다.
하지만 C 언어를 많이 쓰던 사람이 쓰게 된다면 이렇게 쓸 일은 그리 많지 않을것 같습니다 ^^;

그럼 이제 간단히 pascal 에서 전체적인 모습을 한번 보도록 할까요?
C 에서 대충 이런 모습으로 hello world! 가 시작되죠?
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    printf("HelloWorld\n");
    return 0;
}

델파이도 Pascal 과 동일하게 다음과 같이 시작 됩니다.
uses
    SysUtils;

begin
    writeln('HelloWorld');
end.

C 에서는 #include 로 각 header 를 추가 하지만, 델파이에서는 uses 로 원하는 기능의 unit 을 선언 합니다.
브레이스를 쓰는 C 와 달리 델파이는 begin ~ end; 또는 begin ~ end. 를 사용하게 됩니다.
주의 해야 할 점은 begin ~ end; 와 begin ~ end. 의 차이가 있다는 점 입니다.
C 에서의 main 에 해당하는 부분은 begin ~ end. 로 마지막에 . 이 들어간다는 것이고 , 사용자가 만든느 변수나 main 에 해당하는 부분 내에서의 구문 등엔 begin ~ end; 로 ; 가 사용되는 차이가 있다는 점 입니다.

기본적으로 간단한 구문 출력의 경우만 해도 C 에서는 printf(""); 내에서 문자열을 " 로 묶는 대신 델파이는 ' 로 묶습니다.
또한 델파이는 탭문자 처리가 따로 없습니다. 그럼으로 마지막 개행이 되는 처리 또한 C 와 델파이는 다릅니다.
문장이 끝나고 개행을 처리 할 때엔 wirteln() 을, 아닐겨우는 write() 함수를 사용합니다.

이에 대해서는 좀 더 자세히 다음 시간으로 미뤄 보도록 하고, 둘의 기본적인 차이점에 대해 이해를 하는 것이 가장 우선되는 것이라 하겠습니다.

이제 시작과 끝을 알았으니,
변수지정 방법과 사용자 함수 지정 등을 다음 시간에 배워 보도록 하겠습니다.
감사합니다.