지난 수업의 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(값)을 통해 반환값을 지정하고 함수를 일찍 종료 가능- 반환값이 있는 함수도 결과를 무시하고 호출 가능하며 전역변수 수정 같은 부수 효과 로직에 활용
함수 반환값 규칙
- 내장 특수 변수
Result가 함수 반환값을 저장하며 지역 변수와 동일하게 읽고 쓰기 가능
function MyFunction(const S: string): string;
begin
Result := S + 'One';
Result := Result + 'Two';
end;
Code language: PHP (php)
- 구식 문법으로 함수명에 직접 값 할당(
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 구분 설명:
SumIntegersUntilZero()→ 함수를 호출 실행하고 재귀한 뒤 반환값 획득SumIntegersUntilZero→ 함수 내부의Result(자신의 반환값 변수) 참조
괄호를 삭제한 코드
Result := Result + SumIntegersUntilZero;
컴파일러는 아래와 해석합니다:
Result := Result + Result;
Result := Result * 2 와 동일하며 재귀 로직이 완전히 깨져 무한 반복되고 숫자가 계속 두 배로 커집니다.
이 예제 로직은 입력 숫자가 0 이 될 때까지 자기 자신을 재귀 호출하며 0 이 아닌 한 계속 재귀합니다.
Exit 로 일찍 종료
- 매개변수 없는 Exit: 즉시 함수를 빠져나가고 현재 할당된 Result 반환
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 블록 안에 선언한 변수는 전역변수로 프로그램 모든 프로시저, 함수에서 사용 가능
함수, 프로시저 및 기본 원시 타입