함수, 프로시저 및 기본 원시 타입

지난 수업의 dpr 파일을 아래 내용으로 수정합니다

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
procedure MyProcedure(const A: Integer);
begin
  WriteLn('A + 10 is: ', A + 10);
end;
function MyFunction(const S: string): string;
begin
  Result := S + 'strings are automatically managed';
end;
var
  X: Single;
begin
  WriteLn(MyFunction('Note: '));
  MyProcedure(5);
  // / 나눗셈은 항상 부동소수점 결과를 반환하며 정수 나눗셈은 div 를 사용합니다
  X := 15 / 5;
  WriteLn('X is now: ', X); // 과학적 표기법 출력
  WriteLn('X is now: ', X:1:2); // 소수점 두 자리 제한
end.Code language: PHP (php)
D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
20 lines compiled, 0.0 sec, 39248 bytes code, 2484 bytes data

D:\fpcdemo>mydemo
Note: strings are automatically managed
A + 10 is: 15
X is now:  3.000000000E+00
X is now: 3.00

D:\fpcdemo>Code language: CSS (css)

아래는 주석 설명입니다. 영어 외 문자는 깨질 수 있으니 콘솔 한글 출력 설정을 진행하세요

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram; 
// 현재 프로그램 사용자 정의 이름. Pascal 콘솔 프로그램은 program 이름; 으로 시작 후 변수, 프로시저, 메인 실행 코드를 작성합니다

// 반환값 없음: procedure 프로시저. 호출해야 실행되며 호출하지 않으면 무시됨
procedure MyProcedure(const A: Integer);
begin
  WriteLn('A + 10 =:', A + 10);
end;

// 반환값 있음: function 함수
function MyFunction(const S: string): string;
begin
  Result := S + '문자열 메모리는 시스템이 자동 관리';
end;

// Object Pascal 에는 main 함수가 없고 가장 바깥 begin...end. 가 프로그램 진입점입니다. 아래가 메인 블록
var
  X: Single; // 단정밀도 부동소수 기본 타입
begin 
  // 실행할 모든 로직은 여기에 작성
  WriteLn(MyFunction('안내:'));
  MyProcedure(5);

  // / 연산은 부동소수 결과만 반환하며 정수 나눗셈은 div 사용
  X := 15 / 5;
  WriteLn('X is now:', X); // 자동으로 과학 표기법 출력
  WriteLn('X is now:', X:1:2); // 소수점 두 자리 고정 출력
end. // 끝에 end. (점 포함)으로 프로그램 전체 종료 표시Code language: PHP (php)

함수와 프로시저는 각각 한 쌍의 begin, end 를 가지며 함수 본문 시작과 끝을 표시하며 C/C++/JAVA 의 { } 와 동일한 역할입니다

WriteLn 은 콘솔에 내용을 출력하며 작은 따옴표 ‘ ‘ 는 문자열을 의미합니다. WriteLn(‘A + 10 =:’, A + 10); 은 문자열 A + 10 =: 와 연산 결과 A + 10 을 순서대로 출력합니다

프로그램에는 가장 바깥쪽 begin과 end. 가 단 한 세트만 존재하며 내부에서 다른 함수, 프로시저를 호출하는 메인 코드를 작성합니다

X := 15 / 5;
WriteLn(‘X is now: ‘, X); // 과학 표기법
WriteLn(‘X is now: ‘, X:1:2); // 소수점 두 자리

/ 는 부동소수 나눗셈으로 몫도 부동소수 타입입니다

맨 앞 두 줄은 전처리 명령어입니다

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}Code language: PHP (php)

해당 구문은 FPC 전용 조건 컴파일 지시자 입니다

  • {$ifdef FPC}:현재 컴파일러가 Free Pascal 일 때만 중간 설정을 실행
  • {$mode objfpc}:ObjFpc 문법 모드로 전환
  • {$H+}긴 문자열 활성화 (자동 메모리 관리 현대 string 타입으로 필수)
  • {$J-}:가변 상수 비활성화 (상수 값 중간 수정 불가로 안전성 강화)
  • {$endif}:조건 블록 종료

역할: FPC 로 컴파일할 때만 현대 문법을 적용하며 Delphi 컴파일러는 전체 구문을 건너뜁니다.

{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}Code language: PHP (php)

크로스 플랫폼 조건 컴파일 설정

  • MSWINDOWS:Windows 운영체제에서만 적용
  • {$apptype CONSOLE}:프로그램을 콘솔 앱으로 지정 (검은 터미널 창 실행, GUI 창 프로그램 아님). Linux/macOS 컴파일 시 해당 줄은 무시됩니다.

핵심 지식 포인트

  • string 기본 원시 타입으로 FPC/Delphi 가 메모리를 자동 관리하므로 수동 해제 불필요
  • procedure 프로시저:반환값 없음;function 함수:반환값 존재하며 내장 변수 Result 에 결과 저장
  • 나눗셈 구분: / 부동소수 나눗셈;div 정수 몫 나눗셈
  • 형식 출력 변수:총너비:소수자리수 로 부동소수 표시 제어
  • 매개변수 없는 재귀 함수는 모호함 방지를 위해 빈 괄호 () 필수
  • Exit(값) 을 통해 반환값을 지정하고 함수를 일찍 종료 가능
  • 반환값이 있는 함수도 결과를 무시하고 호출 가능하며 전역변수 수정 같은 부수 효과 로직에 활용

함수 반환값 규칙

  1. 내장 특수 변수 Result 가 함수 반환값을 저장하며 지역 변수와 동일하게 읽고 쓰기 가능
function MyFunction(const S: string): string;
begin
  Result := S + 'One';
  Result := Result + 'Two';
end;
Code language: PHP (php)
  1. 구식 문법으로 함수명에 직접 값 할당(MyFunction := xxx) 가능하지만 가독성이 나빠 권장하지 않으며 통일적으로 Result 사용하십시오.

C/C++/Java/C# 은 = 할당, == 비교 연산자로 사용하지만 Pascal 은 반대로 := 가 변수 할당, 단독 = 가 등호 비교로 수학 표기와 동일합니다.

Pascal 에는 == 연산자가 없습니다

앞 예제의 MyFunction 을 위 함수로 교체하세요. 이 함수는 호출 시 전달한 문자열 끝에 One 을 붙이고 다시 Two 를 이어 붙입니다

최종 반환 문자열: 원본 문자열 + One + Two

재귀 호출

매개변수 없는 함수를 재귀 호출할 때 빈 괄호 () 를 붙여 “함수 호출 실행”과 “현재 반환값 읽기”를 구분해야 합니다:

function SumIntegersUntilZero: Integer;
var I: Integer;
begin
  ReadLn(I);
  Result := I;
  if I <> 0 then
    Result := Result + SumIntegersUntilZero(); // 재귀 호출 시 () 필수
end;
Code language: JavaScript (javascript)

매개변수 없는 함수 SumIntegersUntilZero 구분 설명:

  1. SumIntegersUntilZero()함수를 호출 실행하고 재귀한 뒤 반환값 획득
  2. SumIntegersUntilZero → 함수 내부의 Result (자신의 반환값 변수) 참조

괄호를 삭제한 코드

Result := Result + SumIntegersUntilZero;

컴파일러는 아래와 해석합니다:

Result := Result + Result;

Result := Result * 2 와 동일하며 재귀 로직이 완전히 깨져 무한 반복되고 숫자가 계속 두 배로 커집니다.

이 예제 로직은 입력 숫자가 0 이 될 때까지 자기 자신을 재귀 호출하며 0 이 아닌 한 계속 재귀합니다.

Exit 로 일찍 종료

  1. 매개변수 없는 Exit: 즉시 함수를 빠져나가고 현재 할당된 Result 반환
  2. Exit(값):반환값을 직접 지정하고 함수 종료, C언어 return x 와 동일
function AddName(const ExistingNames, NewName: string): string;
begin
  if ExistingNames = '' then
    Exit(NewName); // NewName 반환 후 즉시 종료
  Result := ExistingNames + ', ' + NewName;
end;
Code language: PHP (php)
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
procedure MyProcedure(const A: Integer);
begin
  WriteLn('A + 10 is: ', A + 10);
end;

function AddName(const ExistingNames, NewName: string): string;
begin
  if ExistingNames = '' then
    Exit(NewName); 
  Result := ExistingNames + ', ' + NewName;
end;

var
  X: Single;
begin
  WriteLn(AddName('Tom','Jack'));
  WriteLn(AddName('Tom',''));
  WriteLn(AddName('','Jack'));
end.Code language: PHP (php)

반환값을 버리고 프로시저처럼 함수 호출

반환값이 있는 함수라도 로직만 실행하고 결과를 무시할 수 있으며 전역변수 수정 같은 부수 효과 처리에 적합합니다:

var
  Count, MyCount: Integer;
function CountMe: Integer;
begin
  Inc(Count); // 부수 효과: 전역변수 증가
  Result := Count;
end;
begin
  Count := 10;
  CountMe;   // 반환값 버리고 실행만, Count = 11
  MyCount := CountMe; // 반환값 저장, Count = 12
end.
Code language: PHP (php)

전체 실행 예시

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;

var
  Count, MyCount: Integer;

function CountMe: Integer;
begin
  Inc(Count); 
  Result := Count;
end;

begin
  Count := 10;
  WriteLn(CountMe);   
  MyCount := CountMe;
  WriteLn(MyCount);
end.Code language: PHP (php)

Inc 는 Pascal(FPC/Delphi) 내장 표준 함수로 변수 값을 1 증가시킵니다.

var 는 Pascal 의변수 선언 키워드로 변수를 정의하는 역할입니다.

var
  Count, MyCount: Integer;Code language: JavaScript (javascript)

var:변수 선언 영역 시작

Count, MyCount:두 개의 변수명

Integer:정수 타입

위 예제 var 블록 안에 선언한 변수는 전역변수로 프로그램 모든 프로시저, 함수에서 사용 가능

함수, 프로시저 및 기본 원시 타입

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다