유닛 (Units)

유닛(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로 패키징합니다.

답글 남기기

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