Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

메서드 호출

호출할 메서드 결정하기

MATLAB®이 인수 목록이 있는 일반 메서드를 호출할 때 다음 조건을 사용하여 호출할 메서드를 결정합니다.

  • 다른 어떠한 인수의 클래스의 하위로도 지정되어 있지 않은, 가장 왼쪽에 있는 인수의 클래스가 우위(Dominant) 클래스로 선택되고 해당 메서드가 호출됩니다.

  • 호출된 메서드를 이 클래스에서 정의하고 있지 않다면, 그 이름을 가진 MATLAB 경로에 있는 함수가 호출됩니다.

  • 이러한 함수가 존재하지 않을 경우 MATLAB이 우위 클래스가 명명된 메서드를 정의하지 않음을 나타내는 오류를 발생시킵니다.

상위 인수

MATLAB은 상위 인수 디스패치를 사용하여 호출할 메서드의 버전을 결정합니다. 메서드 디스패치 도중 MATLAB은 호출에 포함된 인수 중에서 우위 클래스를 결정합니다. 일반적으로 classdef 구문을 사용하여 정의되는 모든 MATLAB 클래스는 메서드 디스패치를 위한 우선 순위가 동등합니다.

classdef 구문을 사용하여 정의된 클래스는 다음 MATLAB 클래스보다 우선합니다.

double, single, int64, uint64, int32, uint32, int16, uint16, int8, uint8, char, string, logical, cell, struct, function_handle.

일반적으로, 둘 이상의 객체가 인수 목록에 포함된 경우 가장 왼쪽에 있는 객체의 클래스에 대해 정의된 메서드가 호출됩니다. 하지만 사용자 정의 클래스는 특정 클래스의 상대적인 우위를 지정할 수 있습니다. 자세한 내용은 Class Precedence 항목을 참조하십시오.

예를 들어, classAclassB를 하위로 정의하고 두 클래스 모두 combine이라는 메서드를 정의한다고 가정하겠습니다.

classBclassA의 객체를 사용하여 메서드를 호출하면

combine(B,A)

실제로 호출되는 메서드는 classAcombine 메서드입니다. A가 상위 인수이기 때문입니다.

점 표기법과 함수 표기법 비교

MATLAB 클래스는 메서드 호출에 함수 표기법 구문과 점 표기법 구문을 모두 지원합니다. 예를 들어, setColor가 객체 X의 클래스에 대한 메서드이면 함수 표기법을 사용하여 setColor를 호출하는 구문은 다음과 같습니다.

X = setColor(X,'red');

점 표기법을 사용하는 동일한 메서드 호출은 다음과 같습니다.

X = X.setColor('red')

하지만 어떤 경우에는 MATLAB 디스패치가 작동하는 방식으로 인해 점 표기법의 결과가 달라질 수 있습니다.

  • 오버로드된 subsref가 있는 경우 점 표기법을 사용할 때마다 호출됩니다. 즉, 첨자를 사용한 값 할당인지 여부를 확인하기 위해 먼저 명령문을 테스트합니다.

  • 오버로드된 subsref가 없다면 setColorX의 메서드여야 합니다. 일반 함수 또는 클래스 생성자는 이 표기법을 사용하여 호출되는 경우가 없습니다.

  • 오로지 점의 왼쪽에 있는 인수 X만 디스패치에 사용됩니다. 그외 다른 인수는 설사 상위 인수라 하더라도 고려되지 않습니다. 따라서, 점 표기법은 X의 메서드만 호출할 수 있으며, 다른 인수의 메서드는 호출되지 않습니다.

결과가 다른 경우.  다음은 점 표기법과 함수 표기법이 다른 결과를 제공할 수 있는 경우를 보여주는 예입니다. 다음과 같은 클래스가 있다고 가정하겠습니다.

  • classAmethodA라는 메서드를 정의하며, 이 메서드는 classB의 객체를 인수로 가져야 합니다.

  • classBclassAclassB의 하위로 정의합니다.

classdef (InferiorClasses = {?classA}) classB
   ...
end

methodA 메서드에는 두 개의 입력 인수가 정의되었으며, 그중 하나는 classB의 객체입니다.

classdef classA
methods
   function methodA(obj,obj_classB)
      ...
   end
end

classBmethodA와 동일한 이름으로 메서드를 정의하지 않았습니다. 따라서, 다음 구문을 실행하면 두 번째 인수가 우위(Dominant) 클래스의 객체이기 때문에 MATLAB이 methodA와 동일한 이름을 갖는 함수에 대한 경로를 검색합니다. 이 이름을 갖는 함수가 경로에 있으면 MATLAB이 classA의 메서드 대신 이 함수를 호출하려고 시도하고 구문 오류를 반환할 가능성이 큽니다.

obj = classA(...);
methodA(obj,obj_classB)

점 표기법은 동작 측면에서 더 엄격합니다. 예를 들어, 다음과 같은 methodA 호출을 실행하면

obj = classA(...);
obj.methodA(obj_classB)

obj의 클래스에 대한 methodA만 호출할 수 있습니다.

표현식으로 이름 참조하기—동적 참조

점-괄호 구문에 표현식을 사용하여 객체의 속성이나 메서드를 참조할 수 있습니다.

obj.(expression)

이 표현식은 char형 벡터의 속성 또는 메서드의 이름이어야 합니다. 예를 들어, 다음 명령문은 서로 동일합니다.

obj.Property1
obj.('Property1')

이 경우, objProperty1이라는 속성을 정의하는 클래스의 객체입니다. 따라서, char형 변수를 괄호로 묶어 전달하여 속성을 참조할 수 있습니다.

propName = 'Property1';
obj.(propName)

메서드를 호출하고 다른 괄호 집합을 사용하여 메서드에 대한 입력 인수를 전달할 수 있습니다.

obj.(expression)(arg1,arg2,...)

이 표기법을 사용하면 structs의 필드에 대한 동적 참조를 생성하는 방법과 동일하게 속성 및 메서드에 대한 동적 참조를 생성할 수 있습니다.

이에 대한 예로 객체에 각 요일에 해당하는 메서드가 있다고 가정하겠습니다. 이러한 메서드는 요일과 동일한 이름을 가집니다(Monday, Tuesday 등). 또한, 이 메서드는 char형 벡터 입력 인수로 현재의 날(날짜)을 받습니다. 이제, 현재의 날에 대한 올바른 메서드를 호출하는 데 필요한 함수를 작성한다고 가정하겠습니다.

date 함수 및 datestr 함수로 생성된 표현식을 사용합니다.

obj.(datestr(date,'dddd'))(datestr(date,'dd'))

표현식 datestr(date,'dddd')char형 벡터로 현재의 요일을 반환합니다. 예를 들면 다음과 같습니다.

datestr(date,'dddd')

ans =

Tuesday

표현식 datestr(date,'dd')char형 벡터로 현재의 날짜를 반환합니다. 예를 들면 다음과 같습니다.

datestr(date,'dd')

ans =

11

따라서, 점-괄호를 사용하는 표현식(11일 화요일에 대해 호출됨)은 다음과 같습니다.

obj.Tuesday('11')

메서드 호출 결과의 요소 참조하기

메서드 호출 결과에 점 인덱싱을 사용하여 값을 구할 수 있습니다. 예를 들어, 다음 클래스는 속성과 생성자 메서드를 정의합니다. 생성자는 입력 인수를 사용하여 표현식을 실행한 후 속성값을 설정합니다.

classdef polyEval
    properties
        Result
    end
    methods
        function obj = polyEval(x)
            if nargin
                obj.Result = 2*x.^3 + 7*x.^2 + 2*x + 7;
            end
        end
    end
end

생성자 메서드 호출 결과의 요소를 참조하여 속성값에 액세스할 수 있습니다. 예를 들어, polyEval()에 대한 다음 호출은 속성에 할당된 값을 반환합니다. polyEval 클래스의 인스턴스는 임시 변수로 생성되며 작업 공간에 저장되지 않습니다.

 polyEval(-3.5).Result
ans =

     0

이 경우, 표현식 polyEval(-3.5).Result는 값 0을 나타냅니다(값 -3.5는 다항식의 근임). 이 표현식의 실행 결과를 변수에 할당하거나 다른 표현식에서 사용할 수 있습니다.

속성 또는 필드 이름을 사용하여 인덱싱할 수 있는 객체나 구조체처럼 점 인덱싱이 정의되어 있는 결과를 반환하는 메서드라면 그러한 메서드의 결과에 점 인덱싱을 사용할 수 있습니다. 인수가 없는 경우에도 모든 인덱싱 표현식에 괄호를 포함해야 합니다. 예를 들어, 입력값이 없는 polyEval() 생성자를 호출한 결과의 요소를 참조하려면 다음 표현식을 사용하십시오.

 polyEval().Result

함수 호출 결과의 요소를 참조하는 방법에 대한 자세한 내용은 함수 호출 결과의 요소 참조하기 항목을 참조하십시오.

메서드에 대한 액세스 제어하기

클래스 내에 내부 계산에 사용할 메서드를 생성하고 싶지만 이 메서드를 클래스의 퍼블릭 인터페이스로 게시하고 싶지 않은 상황이 있을 수 있습니다. 이러한 경우 Access 특성을 사용하여 다음 옵션 중 하나로 액세스를 설정하면 됩니다.

  • public — 클래스의 객체에 대한 액세스를 갖는 코드는 모두 이 메서드에 액세스할 수 있습니다(디폴트 값).

  • private — 서브클래스를 제외한 정의 클래스로 메서드 액세스를 제한합니다. 서브클래스는 프라이빗 메서드를 상속하지 않습니다.

  • protected — 정의 클래스와 그 정의 클래스에서 파생된 서브클래스로 메서드 액세스를 제한합니다. 서브클래스는 이 메서드를 상속합니다.

  • 액세스 목록 — 액세스 목록에 포함된 클래스로 메서드 액세스를 제한합니다. 자세한 내용은 클래스 멤버 액세스 항목을 참조하십시오.

메서드 파일 내부에 있는 로컬 함수 및 중첩 함수는 메서드와 동일한 액세스를 가집니다. 클래스 정의 파일 내부에 있는 로컬 함수는 동일한 파일에 정의된 클래스에 대해 프라이빗 액세스를 가집니다.

서브클래스 메서드에서 슈퍼클래스 메서드 호출하기

서브클래스는 슈퍼클래스에 정의된 메서드의 구현을 재정의할 수 있습니다. 서브클래스 메서드가 슈퍼클래스 메서드를 완전히 대체하는 대신 추가 코드를 실행해야 하는 경우 MATLAB 클래스는 슈퍼클래스 메서드와 동일한 이름의 서브클래스 구현으로부터 슈퍼클래스 메서드를 호출하는 특수한 구문을 사용할 수 있습니다.

서브클래스 메서드에서 슈퍼클래스 메서드를 호출하는 구문은 @ 기호를 사용합니다.

MethodName@SuperclassName

예를 들어, 다음 disp 메서드는 Asset 클래스에서 파생된 Stock 클래스에 대해 정의되었습니다. 이 메서드는 먼저 Asset 클래스의 disp 메서드를 호출함으로써 Stock 객체를 전달하여 Stock 객체의 Asset 구성요소가 표시될 수 있도록 합니다. Assetdisp 메서드가 반환한 후에는 Stockdisp 메서드가 두 개의 Stock 속성을 표시합니다.

classdef Stock < Asset
   methods   
      function disp(s)
         disp@Asset(s) % Call base class disp method first
         fprintf(1,'Number of shares: %g\nShare price: %3.2f\n',...
         s.NumShares,s.SharePrice);
      end % disp
   end
end

사용 제한 사항

슈퍼클래스 메서드 호출에는 다음과 같은 제한 사항이 적용됩니다. 다음 내부에서만 이 표기법을 사용할 수 있습니다.

  • 호출하려는 슈퍼클래스 메서드와 동일한 이름을 갖는 메서드 내에서

  • 호출하려는 메서드의 슈퍼클래스의 서브클래스인 클래스 내에서

내장 함수 호출하기

MATLAB builtin 함수를 사용하면 메서드에 의해 오버로드된 함수의 내장 버전을 호출할 수 있습니다.

관련 항목