is와 as 요약

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를 진행해 런타임 오류를 방지해야 합니다.

asTFather(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)

답글 남기기

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