델파이에서 사용되는 함수 형태는 크게 procedure 와 function 두가지 입니다.
이 둘의 차이는 C 에서 void 형인가 아닌가의 차이겠군요.
즉, 함수 자체가 인자를 받아서 함수 자체가 결과 값을 되돌려 주지 않는가 또는 주는가의 차이라 하곘습니다.
차이는 다음과 같이 알 수 있습니다.
procedure testProc(input1 : integer);
function testFunc(input1 : integer) : integer;
function testFunc(input1 : integer) : integer;
procedure 인 testProc 는 입력인자로 integer 형으로 input1 이란 걸 받고 뭔가를 처리 할 것입니다.
반면 function 인 testFunc 는 입력으로 input1 을 받아서 뭔가를 다시 integer 형태로 결과를 돌려 주게 됩니다.
한때 컴파일러가 변경 되면서 procedure 도 function 처럼 값을 돌려줄 수 있었습니다만 이는 좋은 방법이 아니므로 사용하지 않도록 해야 겠습니다.
procedure 든 function 이든 인자는 여러개 일 수 있지만 function 의 경우는 돌려받는 결과값이 제한 될 수 밖에 없습니다.
그래서 인자값 자체가 출력으로 사용되는 경우가 반드시 있겠습니다.
C 에서는 포인터를 받으므로 해당 인자값의 포인터에 다시 결과값을 기록 할 수 있죠.
델파이도 물론 가능 합니다.
포인터 형으로 인자를 받을 때엔 심볼 앞에 var 를 붙입니다.
function multipleFunc(in1 : integer; var out1 : integer; var out2 : integer) : boolean;
이 함수는 어떤경우 일까요 ?
전체적으로 입력이 1개에 출력이 총 3개가 되는 경우라 하겠습니다.
함수 자체는 해당 기능의 성공이나 실패를 판가름 하기 위해 boolean 형으로 TRUE 나 FALSE 둘 중 하나를 반환 하겠죠.
그리고 뭔가 입력 값 1개에 대한 처리 는 out1 과 out2 에 저장 되겠죠.
이로서 복잡한 기능을 여러 함수로 분리하여 처리 하여 중복적인 코딩을 피하고 체계적인 호출을 지정하여 효율적인 코딩이 가능 할 것입니다.
다음은 유닛에 대한 설명 입니다.
델파이는 기본적으로 여러개의 unit 으로 구성 되어 있습니다.
이 unit 은 C 에서 header 와 code 를 나눠서 용도별로 여러개의 파일을 나누는 것과 동일 하다고 하겠습니다.
하지만 델파이는 C 처럼 header 와 code 가 나뉘지 않고 하나의 pas 파일 내에 정의 되는 구조 이므로 이를 이해 해야 할 필요가 있습니다.
일단 다음 기본 unit 구조를 보도록 하겠습니다.
unit testUnit;
interface
type
TcallBack = procedure;
function setCallBack(aCallBack : TcallBack):boolean;
implementation
var
interCallBack : TcallBack;
function setCallBack(aCallBack : TcallBack):boolean;
begin
interCallBack := aCallBack;
result := true;
interface
type
TcallBack = procedure;
function setCallBack(aCallBack : TcallBack):boolean;
implementation
var
interCallBack : TcallBack;
function setCallBack(aCallBack : TcallBack):boolean;
begin
interCallBack := aCallBack;
result := true;
end;
begin
interCallBack := NIL;
end.
begin
interCallBack := NIL;
end.
델파이에서는 interface 와 implementation 으로 외부에서 볼 수 있는 심볼군 과 구현부를 구분 합니다.
쉽게 말해 C 에서 header 는 interface 부에 속하고, code 는 implementation 에 속한다고 하겠습니다.
또한 unit 의 이름과 실제 파일의 이름은 같을 필요는 없습니다만 관례적으로 동일하게 가도록 하고 있습니다. (DOS 시절이나 win3.1 시절의 구 컴파일러는 unit 과 파일이름이 다르면 오류라 표시 하기도 했습니다)
interface 에 선언되는 함수나 변수는 모두 사용되는 다른 유닛에서 접근,변경이 가능합니다.
하지만 implementation 에 있는 구현부에 선언된 변수나 함수는 다른 유닛에서 접근이 불가능 하게 됩니다.
실제 C 에서도 동일한 것입니다만, C 처럼 심볼 자체를 가져다 쓸 수 있는 extern 같은 것은 존재 하지 않습니다.
unit 예제를 보면 마지막에 begin~end. 가 있는 것을 볼 수 있습니다.
실제는 begin 이 없더라도 되지만 꼭! end. 는 있어야 합니다.
즉, 뭔가 내부적으로 초기화를 위해 begin 을 end. 앞에 선언해서 코딩을 해도 되지만 반드시 end. 는 존재 해야 한다는 점 입니다.
실제 이 unit 이 다른 코드에서 사용 되려면 해당 코드 내에서 uses 로 사용 하려는 unit 의 이름을 정의 하면 됩니다.
uses
testUnit;
testUnit;
C 에서 #include 를 통해서 사용하려는 기능을 추가 하는 것과 동일 하다고 하겠습니다.
델파이를 쓰던 사람이 C 를 쓰게 되면 서로 다른 점을 쉽게 이해 할수 있는 편 입니다만 C 를 쓰던 사람이 델파이의 하나의 파일 내에서 모든걸 쓰는 것을 이해하는 일은 잘 없었던 것 같습니다만, 이는 제 개인적으로 C 가 Pascal 이후에 나오면서 늘어난 편리성과 심볼단위의 LINK 등의 차이점 때문에 발생하는 것이 아닌가 합니다.