Pascal/FPC is 타입 판단, as 안전 캐스트, TClass(X) 검사 없는 강제 캐스트
is와 as 사용법
1 is 연산자: 런타임 타입 감지
객체 인스턴스가 지정 클래스 또는 하위 클래스에 속하는지 판단하고 불리언 값 True/False를 반환하며 안전한 사전 검증에 사용합니다.
2 as 연산자: 안전 타입 변환
런타임 타입 검증 기반 업캐스트/다운캐스트; 타입이 일치하지 않으면 바로 예외를 발생시키며 안전성을 우선시합니다.
3 TMyClass(X) 검사 없는 강제 캐스트(unchecked typecast)
런타임 검사 없이 메모리를 직접 강제 재해석하며 실행 속도가 빠릅니다. 하지만 타입 불일치 시 정의되지 않은 동작(프로그램 크래시, 잘못된 메서드 호출, 메모리 오류)이 발생하므로 반드시 is로 타입 확인 후 사용해야 합니다.
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses
SysUtils;
type
// 기본 클래스
TFather = class
procedure FatherMethod;
end;
// TFather를 상속한 파생 클래스
TSon = class(TFather)
procedure SonMethod;
end;
procedure TFather.FatherMethod;
begin
WriteLn('FatherMethod');
end;
procedure TSon.SonMethod;
begin
WriteLn('SonMethod');
end;
var
Son: TSon;
C: TFather; // 기본 클래스 참조 변수
begin
Son := TSon.Create;
try
// 파생 클래스 인스턴스는 모든 메서드를 직접 호출 가능
Son.FatherMethod;
Son.SonMethod;
// 업캐스트: 파생 클래스를 기본 클래스 참조에 할당, 문법상 유효
C := Son;
C.FatherMethod; // 기본 클래스 참조는 자체 메서드 호출 가능
// C.SonMethod; // 컴파일 오류: TFather에 해당 메서드 없음
// 1. is 타입 판단 + as 안전 캐스트
if C is TSon then
(C as TSon).SonMethod;
finally
FreeAndNil(Son);
end;
end.Code language: JavaScript (javascript)
실행 결과
FatherMethod
SonMethod
FatherMethod
SonMethod

C는 원래 TFather 타입 참조 변수 C: TFather;이지만 실제 객체는 C := Son;으로 할당된 하위 클래스 인스턴스를 가리키며, 하위 클래스에서 상위 클래스 메서드 C.FatherMethod;를 호출할 수 있습니다.
하위 클래스 전용 메서드 (C as TSon).SonMethod; 를 호출하려면 먼저 is로 타입 검사 if C is TSon then를 진행해 런타임 오류를 방지해야 합니다.
as와 TFather(X) 캐스트 비교
1. X as TFather
안전한 타입 변환, 일반적인 상황에서 권장
- 내부적으로 런타임 타입 검사를 실행하며 암시적으로
X is TMyClass를 수행하는 것과 동일함; - 타입 불일치 시
EInvalidCast예외가 발생하고 프로그램에서 오류를 포착 가능; - 미세한 성능 오버헤드가 있으나 대부분 업무 코드에서 무시할 수 있음.
2. TFather(X) 강제 타입 캐스트
검사를 생략한 원시 캐스트로 고성능 요구 상황에만 사용하며 메모리를 직접 강제 해석합니다.
- 런타임 타입 검사를 완전히 건너뜀, 객체 포인터를 직접 강제 해석;
- 실행 속도가 약간 더 빠름;
- 위험:
X가 대상 클래스 인스턴스가 아닐 경우 메서드 호출 시 메모리 범위 초과, 스택 크래시, 무작위 예외(정의되지 않은 동작) 발생; - 사전에
is타입 검사를 거친 경우에만 사용 허용하여 타입 일치를 보장:
// 안전한 작성법1: as 캐스트 (범용)
if A is TFather then
(A as TFather).CallSomeMethodOfFather;
// 안전한 작성법2: 검사 없는 강제 캐스트 (최고 성능, 사전 is 검사 완료)
if A is TFather then
TMyClass(A).CallSomeMethodOfMyClass;Code language: JavaScript (javascript)
Previous: 생성자와 소멸자
Next: 속성(Property)