프로시저와 함수
독립적인 문장(프로그램 코드) 블록, 코드를 독립(분리)하고 재사용 가능
프로시저
1 2 3 4 5 6 7 8 9 10 11 12 13 | procedure 프로시저이름(매개변수 목록); { 선언부 : 구현부에서 사용할 변수,상수,타입 지정 } begin { 구현부 } end; porcedure TForm1.WriteLog(AValue: string); var S: string; begin S := FormatDateTime('HH:NN:SS', Now) + ' ' + AValue; Memo1.Lines.Add(S); end; |
begin...end 사이의 구현부 실행, 매개변수로 받은 데이터 사용 가능
구현부에서 사용할 변수(var), 상수(const), 타입(type) 선언부에 선언
다른 문장에서 프로시저 호출. 프로시저 이름과 매개변수로 전달할 데이터(매개변수와 같은 자료형) 사용
함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function 함수이름(매개변수 목록): 반환값타입; { 선언부 } begin { 구현부 } Result := 반환값; end; function Add(ANum1, ANum2: Integer): Integer; var Sum: Integer; begin Sum := ANum1 + ANum2; Result := Sum; // Add := Sum; 함수이름 변수 사용가능 // Exit(Sum); // Exit 함수 사용시 문장을 빠져나감 end; var Num: Integer; begin Num := Add(10, 20); ShowMessage('10과 20을 더한 값 = ' + IntToStr(Num)); end; |
구현부 문장 실행 후 Result 변수에 반환값 할당(함수이름 변수 사용 가능)
Result 대입 코드 후 다음 줄의 문장 실행 됨(빠져나가지 않음), Exit(반환값); 함수 사용 시 함수 빠져나감
매개변수(Parameter)
함수와 프로시저는 0개 이상의 매개변수 목록을 가진다. 여러개의 매개변수 사용 시 세미콜론(;)으로 구분. 같은 자료형 사용 시 쉼표로 구분 가능
1 2 3 4 | procedure Test; procedure TestStr(AStr: string); procedure TestStrInt(AStr: string; AInt: Integer); procedure TestInts(AInt1, AInt2: Integer); |
매개변수의 전달방식
- 값 매개변수(기본)
- 변수(var) 매개변수
- 상수(const) 매개변수
- 출력(out) 매개변수
값 매개변수와 변수 매개변수
값 매개변수는 값에 의해 전달. 변수 매개변수는 참조에 의해 전달
(값 매개변수와 변수 매개변수를 가장 많이 사용)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function DoubleByVal(X: Integer): Integer; begin X := X * 2; Result := X; end; function DoubleByRef(var X: Integer): Integer; begin X := X * 2; Result := X; end; var I, J, V, R: Integer; begin I := 4; J := 4; V := DoubleByVal(I); // V = 8, I = 4 R := DoubleByRef(J); // R = 8, J = 8 R := DoubleByRef(4); // 오류발생 end; |
상수 매개변수
읽기 전용 값 매개변수. 값 매개변수와 비슷하지만, 컴파일러가 코드 최적화 가능
1 2 3 4 5 | function DoubleByConst(const X: Integer): Integer; begin // X := X * 2; // 오류발생 Result := X * 2; end; |
출력 매개변수
변수 매개변수와 같은 참조에 의해 전달. 참조되는 변수의 초기 값은 전달 시 버려짐
1 2 3 4 5 | procedure DoubleByOut(X: Integer; out Value: Integer); begin X := X * 2; Value := X; end; |
타입 미지정 매개변수
var, const, out 매개변수를 선언 시 타입 지정 생략 가능
1 2 3 | procedure DoSomthingVar(var Value); procedure DoSomthingConst(const Value); procedure DoSomthingOut(out Value); |
함수 내에서 매개변수 형변환 후 사용
배열 매개변수
1 2 3 4 | procedure DoSomethingDynArray(Value: array of Integer); type TNumbers = array[1..4] of Integer; procedure DoSomethingArrayType(Value: TNumbers); |
가변형(Variant) 배열 매개변수
1 | procedure DoSomething(Value: array of const); |
array of const로 지정 시 타입이 다른 배열을 매개변수로 전달 가능
매개변수 기본값 지정
매개변수 선언 시 기본값 지정 가능, 맨 뒤의 매개변수 부터 연속적으로 기본값 지정 가능
1 2 3 4 5 6 7 8 9 10 11 | procedure StrDef(AStr: string = ''); procedure StrsDef(AStr1: string = 'a'; AStr2: string = 'b'); procedure IntDef(ANum: Integer = 0); procedure IntsDef(ANum1: Integer; ANum2: Integer = 0); procedure IntsDef(ANum1, ANum2: Integer = 0); // 오류발생 begin StrDef('안녕하세요.'); StrDef; end; |
같은 이름의 함수(overload)
overload 지시어 사용 사용 시 같은 이름의 함수, 프로시저 사용 가능. 단, 매개변수 자료형이 달라야 함.
1 2 3 | procedure WriteValue(AString: string); overload; procedure WriteValue(ANumber: Integer); overload; procedure WriteValue(AArray: array of string); overload; |