연산자 선언

연산자 선언 (Operator declarations)

연산자의 동작을 정의하는 것은 함수를 정의하는 것과 아주 비슷해요.

출처: 문서

본문

연산자의 동작을 정의하는 것은 함수 정의와 아주 비슷해요. 연산자 정의의 기본 골격을 정리하면 다음과 같아요.

operator definition ── operator ── operator symbol ( parameter list )
                               ── result identifier : result type ;
                               ── subroutine block

연산자 정의는 크게 네 가지로 나뉘어요.

  • 대입 연산자 정의 (assignment operator definition) : := (값 매개변수)
  • 산술 연산자 정의 (arithmetic operator definition) : +, -, *, /, ><
  • 비교 연산자 정의 (comparison operator definition) : =, <=, >, >=, <>, in
  • 논리 연산자 정의 (logical operator definition) : and, or, xor, not
  • 기타 연산자 정의 (other operator definition) : enumerator(열거자), dec

비교 연산자나 산술 연산자의 매개변수 목록은 항상 두 개의 매개변수를 포함해야 해요. 단, 단항 마이너스·플러스(unary minus or plus) 는 하나의 매개변수만 필요해요. 비교 연산자의 결과 타입은 반드시 Boolean이어야 해요.

연산자에는 사용자 정의 단순 타입뿐 아니라 레코드(record)와 배열(array) 도 사용할 수 있어요. 다만 연산자 오버로딩에는 몇 가지 제한이 있어요.

  • 이 방식의 연산자 선언은 ObjFPC와 FPC 모드에서만 지원돼요.
  • 클래스(class) 에는 연산자를 정의할 수 없어요.
  • 열거형 타입(enumerated types) 에는 +- 연산자를 정의할 수 없어요.
  • ArrayOperators 모드 스위치가 활성화되면({$modeSwitch ArrayOperators}) 동적 배열+ 연산자를 오버로딩할 수 없어요. 컴파일러가 내부적으로 처리하기 때문이에요.

참고: ObjFPC 모드로 컴파일하면 결과 식별자를 생략할 수 있어요. 결과는 표준 Result 기호로 접근할 수 있죠. 결과 식별자를 생략했는데 해당 모드가 아니라면, 문법 오류가 발생해요.

문장 블록(statement block) 에는 연산 결과를 결정하는 데 필요한 문장들이 들어가요. 임의로 큰 코드 조각을 넣을 수 있고, 연산이 어떤 표현식에서 만나질 때마다 실행돼요. 문장 블록의 결과는 항상 정의되어야 해요. 컴파일러가 오류 조건을 검사하지 않으므로, 코드가 모든 가능한 경우를 스스로 처리해야 하며 오류 조건을 만나면 런타임 오류를 발생시켜야 해요.

이제 세 가지 유형의 연산자 정의를 차례로 살펴볼게요. 이 장 전체에서 다음 타입을 오버로딩 연산자를 정의하는 예시로 사용할 거예요.

type
  complex = record
    re : real;
    im : real;
  end;

complex 타입은 모든 예시에서 사용돼요.

런타임 라이브러리의 소스에는 연산자 오버로딩을 많이 사용하는 두 개의 유닛이 있어요.

  • ucomplex : 복소수에 대한 완전한 계산을 포함하는 유닛이에요.
  • matrix : 행렬에 대한 완전한 계산을 포함하는 유닛이에요.

더 알아보기