레코드 연산자 — 확장 레코드에서 연산자 정의하기
레코드 연산자 — 확장 레코드에서 연산자 정의하기
연산자 오버로딩은 연산자 오버로딩 장(15장, 846페이지)에서 자세히 다뤄요. 다만 Delphi가 연산자 오버로딩을 고급 레코드의 일부로 구현했기 때문에, 여기서 몇 마디 언급할 필요가 있어요.
본문
확장 레코드의 문법 다이어그램에서 볼 수 있듯이, FPC는 확장 레코드의 연산자에 대한 Delphi 문법을 지원해요. 이 문법은 ObjFPC와 Delphi 모드 둘 다에서 사용할 수 있어요.
objfpc 모드
objfpc 모드에서는 일반 연산자 오버로딩과 마찬가지로 연산자를 기호 이름과 함께 정의해야 해요.
{$mode objfpc}
{$modeswitch advancedrecords}
Type
TComplex = record
Re,Im : Double;
class operator +(a,b : TComplex) : TComplex;
end;
class operator TComplex.+ (a,b : TComplex) : TComplex;
begin
Result.re:=A.re+B.re;
Result.im:=A.im+B.im;
end;
이 연산자들은 일반 FPC 연산자 문법으로 정의한 것과 똑같이 동작하지만, 이 문법은 당연히 레코드 타입으로 한정돼요. 구현에서 class 키워드가 앞에 붙고 레코드 타입 이름이 앞에 붙는다는 점을 주목하세요.
Delphi 모드
위에서 말했듯이 ObjFPC 모드에서는 연산자를 기호 이름으로 표시해야 해요. 반면 Delphi 모드에서는 Delphi에서와 비슷한 문법으로 연산자의 이름도 사용할 수 있어요.
{$mode delphi}
Type
TComplex = record
Re,Im : Double;
class operator add(a,b : TComplex) : TComplex;
end;
class operator TComplex.add (a,b : TComplex) : TComplex;
begin
Result.re:=A.re+B.re;
Result.im:=A.im+B.im;
end;
물론 이는 문법이 Delphi와 호환되어야 하기 때문이에요.
연산자 이름 표
아래 표는 기호 연산자 이름을 평문 이름으로 연결해 준 거예요. 일부 FPC 연산자는 Delphi 이름으로 대응하는 것이 없어요.
| Symbol | Name |
|---|---|
+ |
add or positive |
- |
subtract or negative |
* |
multiply |
/ |
divide |
** |
(no equivalent) |
>< |
(no equivalent) |
= |
equal |
< |
lessthan |
<= |
lessthanorequal |
> |
greaterthan |
>= |
greaterthanorequal |
<> |
notequal |
:= |
implicit |
in |
in |
shr |
rightshift |
shl |
leftshift |
div |
intdivide |
mod |
modulus |
and |
bitwiseand or logicaland |
or |
bitwiseor or logicalor |
xor |
bitwisexor |
not |
logicalnot |
예를 들어 거듭제곱 연산자(**)는 Delphi 모드에서 기호 이름을 사용할 수 있어요.
{$mode delphi}
{$modeswitch advancedrecords}
Type
TComplex = record
Re,Im : Double;
class operator **(a,b : TComplex) : TComplex;
end;
class operator TComplex.** (a,b : TComplex) : TComplex;
begin
Result.re:=-B.re;
Result.im:=-B.im;
end;
Var
a,b : TComplex;
begin
a:=a**b;
end.
연산자 오버로딩에 대한 더 자세한 내용은 연산자 오버로딩 장(15장, 846페이지)을 참고하세요.
핵심은 Delphi 스타일의 레코드 연산자를 쓸 때, ObjFPC 모드에서는 기호로, Delphi 모드에서는 이름으로 정의할 수 있다는 거예요. 표에서 대응 이름이 없는 연산자(**, ><)는 Delphi 이름 대신 기호로만 써야 해요.
더 알아보기
- 연산자 오버로딩 기본 개념은 Operator overloading and generics에서 다뤄요
- 확장 레코드의 기초는 Definition을 참고하세요