객체 우선순위

객체 우선순위 (Precedence of Objects)

서로 다른 클래스의 객체를 섞어서 함수나 연산자에 넘기면, 어떤 클래스의 메서드를 호출할지 우선순위가 필요해요. Octave는 이를 superiortoinferiorto라는 두 함수로 정합니다. Octave 매뉴얼 34.4.3절을 정리해 볼게요.

출처: Precedence of Objects

본문

많은 함수와 연산자는 인자를 두 개 이상 받아요. 그런데 서로 다른 클래스의 객체가 섞여서 전달되는 상황은 쉽게 생깁니다. 그래서 혼합 객체가 함수나 연산자에 주어졌을 때 어떤 클래스의 어떤 메서드를 호출할지 결정하는 우선순위(precedence) 가 필요해요. 이를 위해 superiortoinferiorto 함수를 사용할 수 있습니다.

superiorto (class_name, …) — 클래스 생성자 안에서 호출하면, 지금 만들고 있는 객체가 class_name보다 더 높은 우선순위를 가진다고 표시해요. 한 번의 호출로 여러 클래스를 지정할 수도 있어요. 이 함수는 클래스 생성자 안에서만 호출할 수 있습니다. See also: inferiorto.

inferiorto (class_name, …) — 클래스 생성자 안에서 호출하면, 지금 만들고 있는 객체가 class_name보다 더 낮은 우선순위를 가진다고 표시해요. 한 번의 호출로 여러 클래스를 지정할 수도 있어요. 이 함수는 클래스 생성자 안에서만 호출할 수 있습니다. See also: superiorto.

다항식(polynomial) 클래스를 예로 들어 볼게요. 다음처럼 "double" 클래스의 객체와 "polynomial" 클래스의 객체가 섞이는 경우를 생각해 보죠.

2 * polynomial ([1, 0, 1]);

이 경우 반환 타입은 "polynomial"이어야 해요. 그래서 클래스 생성자에서 superiorto 함수를 사용하죠. 특히 다항식 클래스 생성자는 다음과 같이 수정됩니다.

## -*- texinfo -*-
## @deftypefn  {} {} polynomial ()
## @deftypefnx {} {} polynomial (@var{a})
## Create a polynomial object representing the polynomial
##
## @example
## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n
## @end example
##
## @noindent
## from a vector of coefficients [a0 a1 a2 @dots{} an].
## @end deftypefn

function p = polynomial (a)

  if (nargin == 0)
    p.poly = [0];
    p = class (p, "polynomial");
  else
    if (strcmp (class (a), "polynomial"))
      p = a;
    elseif (isreal (a) && isvector (a))
      p.poly = a(:).';  # force row vector
      p = class (p, "polynomial");
    else
      error ("@polynomial: A must be a real vector");
    endif
  endif

  superiorto ("double");

endfunction

참고로 사용자 클래스는 항상 내장 Octave 타입보다 높은 우선순위를 가져요. 그래서 다항식 클래스를 "double" 클래스보다 높다고 표시하는 것은 사실 필요하지 않습니다. 우선순위가 같은 두 객체가 마주치면, Octave는 인자 목록에서 먼저 나타난 객체의 메서드를 사용해요.

더 알아보기

  • octave-methods — 메서드 블록과 접근 제어
  • octave-indexed-assignment-optimizationsubsasgn 메서드의 인덱스 할당 최적화
  • octave-expressions — 표현식과 연산자