[DELPHI] 기본 문법 - 함수형, unit
Developement/DELPHI (pascal)
2009. 5. 12. 19:23
델파이에서 사용되는 함수 형태는 크게 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 등의 차이점 때문에 발생하는 것이 아닌가 합니다.
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);로 호출하는 것과 같은 동작이 되려면 어떻게 해야하는 건가요??
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;