유닛(Unit)은 공유하는 타입, 함수, 프로시저, 상수, 변수 등 선언을 묶어 다른 유닛이나 메인 프로그램에서 호출할 수 있게 하며, 다른 프로그래밍 언어의 모듈 / 패키지와 동일한 개념입니다.
유닛 생성하기
유닛은 두 가지 핵심 영역으로 나뉩니다:
interface 인터페이스 영역: 외부에 공개되는 내용으로 다른 파일에서 불러온 뒤 직접 접근 가능;
implementation 구현 영역: 내부 비공개 코드로 현재 유닛에서만 보이고 외부에서 호출할 수 없습니다.
예시
MyUnit.pas 파일을 생성하여 하나의 유닛 코드를 작성합니다.
unit MyUnit;
{$ifdef FPC}
{$mode objfpc}{$H+}{$J-}
{$endif}
// 인터페이스 영역: 외부 공개
interface
procedure MyProcedure(const A: Integer);
function MyFunction(const S: string): string;
// 구현 영역: 비공개 로직 코드
implementation
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;
end.Code language: JavaScript (javascript)

자세히 보면 맨 끝 end.에 대응하는 begin이 없다는 점을 발견할 수 있습니다.
Pascal 유닛(
unit) 문법 구조는 프로그램(program)과 다릅니다
program메인 프로그램: 프로그램 실행 진입점으로begin ... end.가 필수
unit유닛: 전역 begin이 필요하지 않음전체 유닛은
end.로 마무리합니다 (점 기호로 파일 종료를 표시하며 대응하는 전역 begin 없음)
interface안에 함수/프로시저 원형, 타입, 상수, 전역 변수를 선언하며 외부에서uses로 불러오면 호출 가능;implementation에는 함수 완전 구현만 작성하며 여기 정의한 지역 프로시저, 비공개 변수는 다른 유닛에서 보이지 않음;- 유닛 파일은
unit 이름;으로 시작하고end.로 끝납니다.
메인 프로그램에서 유닛 불러오기
메인 프로그램 파일은 mydemo.pas입니다
uses 키워드로 사용자 정의 유닛을 로드합니다
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
// 사용자 정의 유닛 MyUnit 불러오기
uses
MyUnit;
begin
WriteLn(MyFunction('Note: '));
MyProcedure(5);
ReadLn;
end.Code language: PHP (php)
위 uses 아래 적힌 MyUnit;은 파일 이름이 아닌 유닛 이름을 의미합니다.
즉 MyUnit.pas 첫 줄에 작성한 unit MyUnit;의 이름을 말합니다.
파일 이름과 유닛 이름을 다르게 지정할 수 있지만 동일하게 맞추는 것을 권장합니다. 이름이 달라도 uses에는 파일명이 아닌 유닛명을 적어야 합니다.

이제 컴파일 후 실행하면 메인 프로그램에서 유닛 내 함수를 호출합니다.

이제 컴파일 후 실행

컴파일이 완료되면 프로젝트 폴더에 파일 두 개가 새로 생성됩니다

.ppu (Pascal Unit File, 유닛 컴파일 정보 파일)
유닛 파일(unit)을 컴파일할 때만 생성되며 메인 프로그램 program에서는 ppu 파일이 생성되지 않습니다
- 유닛
interface영역의 컴파일 메타데이터 저장: 함수 원형, 타입, 상수, 내보내기 심볼; - 다른 파일에서
uses MyUnit을 사용할 때 컴파일러가 MyUnit.pas 전체 소스를 다시 분석하지 않고 .ppu 파일을 직접 읽어 인터페이스를 빠르게 검증; - 대형 프로젝트 컴파일 속도를 크게 높이며 FPC 증분 컴파일의 핵심 파일입니다.
MyUnit.o: MyUnit.pas를 컴파일한 이진 기계 명령어 (구현 영역 전체 코드)
mydemo.o: mydemo.pas 메인 프로그램의 기계 코드 이진 파일
컴파일러는 먼저 pas 파일을 독립적인 이진 .o 오브젝트 파일로 변환하고, 마지막 링커가 모든 .o 파일을 합쳐 실행 파일 .exe로 패키징합니다.