메서드 호출
MATLAB® 클래스는 메서드 호출에서 점 구문과 함수 구문을 모두 지원합니다. 이 항목에서는 두 구문을 보여주고 MATLAB에서 호출할 메서드를 어떻게 결정하는지 설명합니다.
점 구문과 함수 구문
한 개의 인수 arg
를 가진 비정적 메서드를 호출하려면 점 구문이나 함수 구문을 사용하십시오. 여기서 obj
는 해당 메서드를 정의하는 클래스의 객체입니다.
obj.methodName(arg) methodName(obj,arg)
예를 들어 dataSetSummary
는 해당 데이터의 평균과 중앙값 및 범위와 함께 숫자형 데이터 집합을 저장합니다. 이 클래스는 2개의 메서드를 정의합니다. showDataSet
는 데이터 속성에 저장된 현재 데이터를 표시하고, newDataSet
는 data
의 현재 값을 바꾸고 그 데이터의 평균과 중앙값 및 범위를 계산합니다.
classdef dataSetSummary properties (SetAccess=private) data {mustBeNumeric} dataMean dataMedian dataRange end methods function showDataSet(obj) disp(obj.data) end function obj = newDataSet(obj,inputData) obj.data = inputData; obj.dataMean = mean(inputData); obj.dataMedian = median(inputData); obj.dataRange = range(inputData); end end end
dataSetSummary
의 인스턴스를 만들고 newDataSet
를 호출하여 데이터를 객체에 추가합니다. 점 구문을 사용하여 newDataSet
를 호출합니다. dataSetSummary
가 값 클래스이므로, 결과를 다시 원래 변수에 할당하여 변경 내용을 유지합니다.
a = dataSetSummary; a = a.newDataSet([1 2 3 4])
a = dataSetSummary with properties: data: [1 2 3 4] dataMean: 2.5000 dataMedian: 2.5000 dataRange: 3
showDataSet
메서드를 호출합니다. 하지만 이번 호출에는 함수 구문을 사용합니다.
showDataSet(a)
1 2 3 4
표현식으로 메서드 이름 참조하기
표현식을 괄호로 묶어 동적으로 클래스 메서드를 호출할 수 있습니다.
obj.(expression)
이 표현식은 메서드의 이름에 해당하는 문자형 벡터 또는 string형이어야 합니다. 예를 들어 dataSetSummary
클래스의 객체 a
에 대해 다음 두 명령문은 동등합니다.
a.showDataSet a.("showDataSet")
이 기법은 함수 구문을 사용할 때는 해당되지 않습니다.
메서드 호출 결과의 요소 참조하기
객체 속성이나 구조체 필드 이름처럼 점 인덱싱이 정의되어 있는 값을 반환하는 메서드라면 그러한 메서드의 결과에 점 인덱싱을 사용할 수 있습니다. 예를 들어, 구조체에 저장된 모든 데이터를 반환하는 새 메서드 returnSummary
를 dataSetSummary
클래스에 추가해 보겠습니다.
function outStruct = returnSummary(obj) outStruct = struct("Data",obj.data,... "Mean",obj.dataMean,... "Median",obj.dataMedian,... "Range",obj.dataRange); end
returnSummary
를 호출하고 점 인덱싱을 사용하여 데이터 세트의 중앙값을 반환합니다.
a.returnSummary.Median
ans = 2.5000
함수 호출 결과의 요소를 참조하는 방법에 대한 자세한 내용은 함수 호출 결과의 요소 참조하기 항목을 참조하십시오.
호출할 메서드 결정하기
메서드 호출에 점 구문이 사용되는 경우 MATLAB은 점의 왼쪽에 있는 객체의 클래스로 정의된 메서드를 호출합니다. 예를 들어, classA
와 classB
가 모두 plus
라는 메서드를 정의하는 경우, 다음 코드는 항상 classA
로 정의된 plus
메서드를 호출합니다.
A = classA; B = classB; A.plus(B)
그 외 다른 인수는 고려되지 않습니다. 다른 인수의 메서드는 호출되지 않으며 함수도 호출되지 않습니다.
그 외 다른 구문에서 MATLAB은 가능한 다양한 버전의 연산자 또는 함수 중 어떤 것을 호출해야 할지를 주어진 상황에서 결정해야 합니다. 디폴트 동작은 가장 왼쪽에 있는 인수와 연결된 메서드를 호출하는 것입니다. 다음 두 명령문에서는 classA
로 정의된 plus
메서드가 호출됩니다.
objA + objB plus(objA,objB)
하지만 이 디폴트 동작은 한 객체가 다른 객체보다 우선할 경우 변경될 수 있습니다.
객체의 우선 순위
메서드 디스패치에 있어 클래스의 객체는 클래스의 정의 방법에 따라 다른 객체보다 우선할 수 있습니다.
classdef
구문을 사용하여 정의된 클래스는 다음 MATLAB 클래스보다 우선합니다.double
,single
,int64
,uint64
,int32
,uint32
,int16
,uint16
,int8
,uint8
,char
,string
,logical
,cell
,struct
,function_handle
.classdef
구문을 사용하여 정의된 클래스는InferiorClasses
특성을 사용하여 다른 클래스에 대한 상대적 우선 순위를 지정할 수 있습니다.
Representing Polynomials with Classes 항목에서 DocPolynom
클래스는 DocPolynom
객체를 더할 수 있는 plus
메서드를 정의합니다. DocPolynom
인스턴스를 생성합니다.
p = DocPolynom([1 0 -2 -5])
p = x^3 - 2*x - 5
다음 명령문은 double형을 DocPolynom
인스턴스에 더합니다. double
이 1 + p
에서 가장 왼쪽에 있는 인수이지만 DocPolynom
클래스가 내장된 double
형 클래스보다 우선합니다. 다음 코드는 DocPolynom
plus
메서드를 호출하여 다항식을 더합니다.
1 + p
ans = x^3 - 2*x - 4
또한 클래스 특성에 우선 순위가 낮은 클래스를 나열하여, classdef
구문으로 정의된 클래스의 상대적 우선 순위를 지정할 수도 있습니다. InferiorClasses
특성은 이 특성의 인수로 나열된 클래스보다 더 높은 우선 순위를 해당 클래스에 부여합니다. 다음과 같이 classdef
명령문에서 InferiorClasses
특성을 정의합니다.
classdef (InferiorClasses = {?class1,?class2}) myClass
이 특성에 의해 클래스의 상대적 우선 순위가 클래스 나열 순서로 정의되어 설정됩니다. 자세한 내용은 Class Precedence 항목을 참조하십시오.