객체 우선순위
객체 우선순위 (Precedence of Objects)
서로 다른 클래스의 객체를 섞어서 함수나 연산자에 넘기면, 어떤 클래스의 메서드를 호출할지 우선순위가 필요해요. Octave는 이를 superiorto와 inferiorto라는 두 함수로 정합니다. Octave 매뉴얼 34.4.3절을 정리해 볼게요.
본문
많은 함수와 연산자는 인자를 두 개 이상 받아요. 그런데 서로 다른 클래스의 객체가 섞여서 전달되는 상황은 쉽게 생깁니다. 그래서 혼합 객체가 함수나 연산자에 주어졌을 때 어떤 클래스의 어떤 메서드를 호출할지 결정하는 우선순위(precedence) 가 필요해요. 이를 위해 superiorto와 inferiorto 함수를 사용할 수 있습니다.
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-optimization —
subsasgn메서드의 인덱스 할당 최적화 - octave-expressions — 표현식과 연산자