C++, Java, C#의 네임스페이스와 유사한 개념입니다
동일 식별자 충돌
여러 유닛에 동일한 이름의 타입/함수/변수를 정의할 수 있으며, uses 목록에서 뒤쪽에 선언한 유닛이 앞쪽 유닛의 동일 식별자를 덮어씁니다.
유닛 한정 구문
유닛이름.식별자로 출처를 명시해 지정한 유닛의 정의를 강제로 사용하고 덮어쓰기로 인한 충돌을 해결합니다.
uses 두 구간은 각각 독립적으로 적용됩니다
interface uses:인터페이스 구간에만 적용;implementation uses:구현 구간에만 적용되며, 구현 구간의 유닛은 인터페이스 구간 유닛의 동일 식별자를 덮어씁니다.
예시
Graphics.pas 유닛 생성
unit Graphics;
{$mode objfpc}{$H+}
interface
type
TColor = LongInt;
const
clYellow = 10;
function Red(C:TColor):Integer;
function Green(C:TColor):Integer;
function Blue(C:TColor):Integer;
implementation
function Red(C:TColor):Integer; begin Result:=C shr 16; end;
function Green(C:TColor):Integer; begin Result:=(C shr 8) and 255; end;
function Blue(C:TColor):Integer; begin Result:=C and 255; end;
end.Code language: JavaScript (javascript)
그 다음 다른 유닛 GoogleMapsEngine.pas 생성
unit GoogleMapsEngine;
{$mode objfpc}{$H+}
interface
type
TColor = string; // Graphics.TColor와 완전히 다른 타입
implementation
end.Code language: PHP (php)
이제 이름은 같지만 타입이 다른 TColor가 두 개 존재합니다
메인 프로그램 작성
program showcolor;
{$mode objfpc}{$H+}
{$apptype CONSOLE}
uses Graphics, GoogleMapsEngine;
var
// Color: TColor; // 오류:뒤쪽 GoogleMapsEngine.TColor(문자열 타입)이 적용됨
Color: Graphics.TColor; // 정상, 유닛을 명시적으로 한정
begin
Color := clYellow;
WriteLn(Red(Color), ' ', Green(Color), ' ', Blue(Color));
ReadLn;
end.Code language: PHP (php)

컴파일 및 실행

접두사 Graphics.를 생략하면 기본적으로 GoogleMapsEngine.TColor가 사용되는데 이유는 무엇일까요?
메인 프로젝트에서 uses Graphics, GoogleMapsEngine;로 유닛을 불러올 때 GoogleMapsEngine이 뒤에 위치하므로 동일한 TColor 타입은 뒤쪽 유닛의 정의인 GoogleMapsEngine.TColor를 기본으로 인식합니다.
두 타입을 구분하려면 Graphics.TColor로 직접 명시하면 됩니다. 네임스페이스와 동일한 방식으로 충돌을 방지할 수 있습니다.
잘못된 예시
인터페이스와 구현 구간의 TColor 타입이 일치하지 않으면 컴파일 오류가 발생합니다
새 유닛 UnitUsingColors.pas 생성
unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine; // 구현 구간의 동일 TColor가 덮어씀
// 여기서 TColor는 GoogleMapsEngine.TColor를 가리킴
procedure ShowColor(const Color: TColor);
begin
end;
end.Code language: JavaScript (javascript)
메인 프로그램 mydemo.dpr에서 해당 유닛 참조
program showcolor;
{$mode objfpc}{$H+}
{$apptype CONSOLE}
uses UnitUsingColors;
begin
end.Code language: PHP (php)
내부 함수나 프로시저를 호출하지 않고 단순 참조만 해도 문제없으며, 호출하지 않을 경우 컴파일러는 UnitUsingColors.pas 컴파일을 건너뜁니다.

오류 원인 분석 (컴파일러 관점):
// 인터페이스 서명
procedure ShowColor(const Color: Graphics.TColor);
// 구현 서명
procedure ShowColor(const Color: GoogleMapsEngine.TColor);Code language: JavaScript (javascript)
아래와 같이 수정
unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Graphics의 TColor를 명시해 동일 타입 가리기 현상 방지
procedure ShowColor(const Color: Graphics.TColor);
begin
end;
end.Code language: JavaScript (javascript)

unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Graphics.TColor를 명시적으로 작성해 타입 통일
procedure ShowColor(const Color: Graphics.TColor);
begin
WriteLn(Red(Color), Green(Color), Blue(Color));
end;
end.Code language: JavaScript (javascript)
요약
유닛 한정 구문 유닛이름.식별자는 uses 순서를 수정하지 않고 타입 출처를 정밀 제어하여 이름 충돌을 막습니다.