Unit scope — 유닛 식별자의 유효 범위

Unit scope — 유닛 식별자의 유효 범위

유닛을 여러 모듈에 나눠 쓰다 보면, 어느 식별자가 어디까지 보이는지가 헷갈릴 수 있어요. 유닛 단위의 유효 범위 규칙을 정리해 드릴게요.

출처: Unit scope - Free Pascal Reference

본문

유닛의 interface 부분에 있는 모든 식별자는 선언된 지점부터 유닛이 끝날 때까지 유효해요. 게다가 그 유닛을 uses 절에 둔 프로그램이나 다른 유닛에서도 그 식별자를 알 수 있어요.

다만 간접적으로 의존하는 유닛(in-directly dependent units)의 식별자는 사용할 수 없어요. 즉 A가 B를, B가 C를 쓴다고 해서 A에서 C의 식별자를 바로 쓸 수 있는 건 아니에요. 그리고 유닛의 implementation 부분에서 선언한 식별자는 선언 지점부터 유닛이 끝날 때까지만 유효해요.

참고로 system 유닛은 모든 유닛과 프로그램에서 자동으로 사용돼요. 그래서 system 유닛의 식별자는 모든 Pascal 프로그램, 라이브러리, 유닛에서 항상 알려져 있어요.

유닛 스코프 규칙 때문에 한 유닛의 식별자를 다른 데서 다시 정의(redefine)할 수도 있어요. 현재 유닛에서 재선언된 다른 유닛의 식별자에 접근하고 싶다면, 그 유닛의 이름을 앞에 붙여 주면 돼요.

unit unitA;
interface
Type
   MyType = Real;
implementation
end.
Program prog;
Uses UnitA;

{ Redeclaration of MyType }
Type MyType = Integer;
Var A : Mytype;         { Will be Integer }
    B : UnitA.MyType { Will be real }
begin
end.

여기서 A는 재선언된 Integer 타입의 MyType을 쓰고, BUnitA.MyType처럼 유닛 이름을 붙여 원래 Real 타입의 MyType을 참조해요. 이 기법은 특히 system 유닛의 식별자를 재선언할 때 유용해요.

더 알아보기

  • Block scope — 블록 안에서의 변수 유효 범위
  • Record scope — 레코드 필드 식별자의 유효 범위
  • Class scope — 클래스 컴포넌트 식별자의 유효 범위