델파이에서 사용되는 함수 형태는 크게 procedure 와 function 두가지 입니다.
이 둘의 차이는 C 에서 void 형인가 아닌가의 차이겠군요.
즉, 함수 자체가 인자를 받아서 함수 자체가 결과 값을 되돌려 주지 않는가 또는 주는가의 차이라 하곘습니다.
차이는 다음과 같이 알 수 있습니다.

procedure testProc(input1 : 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;
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;

C 에서 #include 를 통해서 사용하려는 기능을 추가 하는 것과 동일 하다고 하겠습니다.
델파이를 쓰던 사람이 C 를 쓰게 되면 서로 다른 점을 쉽게 이해 할수 있는 편 입니다만 C 를 쓰던 사람이 델파이의 하나의 파일 내에서 모든걸 쓰는 것을 이해하는 일은 잘 없었던 것 같습니다만, 이는 제 개인적으로 C 가 Pascal 이후에 나오면서 늘어난 편리성과 심볼단위의 LINK 등의 차이점 때문에 발생하는 것이 아닌가 합니다.

Posted by 견족자K rageworx
  • Favicon of https://gunnih.tistory.com BlogIcon gunnih
    2009.05.13 11:21 신고

    여기서 질문이요!!!

    var
    testValue : Integer;

    라고 선언하고 위의 예제처럼

    function multipleFunc(in1 : integer; var out1 : integer; var out2 : integer) : boolean;

    에 두번째 인자 out1에 testValue를 넘겨주는 경우에...

    @testValue라고 넘겨줘야하는건가요 아니면 그냥 testValue로 넘겨주면 되는건가요???

    C에서 f1(int *p);에 int tmp;를 넘겨줄 때, f1(&tmp);로 호출하는 것과 같은 동작이 되려면 어떻게 해야하는 건가요??

    • Favicon of https://rageworx.pe.kr BlogIcon 견족자K rageworx
      2009.05.13 18:09 신고

      var
      testValue : integer;
      로 선언된 상태에서 multipleFunc() 를 호출할떄 두번째 out 인자인 경우 델파이는 그냥 testValue 를 넣으면 됩니다. 약간 C 를 쓰다가 쓰면 헤깔리는데 인자는 그냥 넘겨 주면 됩니다. 즉, 다음과 같이 사용,
      var
      in : integer;
      out1 : integer;
      out2 : integer;
      retB : boolean;
      begin
      in := 10;
      retB := multipleFunc(in,out1,out2);
      end;