Main Content

클래스 정의에서 함수 오버로드하기

함수를 오버로드하는 이유

클래스는 MATLAB® 함수와 동일한 이름을 가지는 메서드를 구현함으로써 이 함수를 재정의할 수 있습니다. 기존의 MATLAB 유형처럼 동작하기를 원하는 특화된 유형을 정의하는 경우 오버로드가 유용합니다. 예를 들어, 관계 연산, 플로팅 함수 및 기타 일반적으로 사용되는 MATLAB 함수가 클래스의 객체를 사용하여 작업을 수행하도록 구현할 수 있습니다.

이러한 동작을 제어하는 특정 함수를 구현하여 디폴트 동작을 수정할 수도 있습니다. 디폴트 동작을 수정하는 함수에 대한 자세한 내용은 Methods That Modify Default Behavior 항목을 참조하십시오.

오버로드된 MATLAB 함수 구현하기

클래스 메서드는 그 클래스의 인스턴스에서만 연산을 수행하는 MATLAB 함수의 구현을 제공할 수 있습니다. 이러한 제약이 가능한 이유는 MATLAB은 어떤 객체가 어느 클래스에 속하는지 항상 식별할 수 있기 때문입니다.

MATLAB은 상위 인수를 사용하여 호출하려는 함수의 버전을 결정합니다. 상위(Dominant) 인수가 객체이고 그 객체의 클래스가 존재한다면 MATLAB은 그 객체의 클래스에서 정의된 메서드를 호출합니다.

클래스가 전역 함수와 이름이 같은 메서드를 정의했을 때 이를 클래스의 함수 구현이 원래의 전역 구현을 오버로드한다고 말합니다.

MATLAB 함수를 오버로드하려면 다음과 같이 하십시오.

  • 오버로드할 함수와 이름이 같은 메서드를 정의합니다.

  • 메서드 인수 목록이 클래스의 객체를 받도록 합니다. MATLAB에서는 이 객체를 사용하여 호출하려는 버전을 결정합니다.

  • 메서드에서 함수를 구현하는 데 필요한 단계를 수행합니다. 예를 들어, 객체 속성에 액세스하여 데이터를 조작합니다.

일반적으로, 함수를 오버로드하는 메서드는 MATLAB 함수와 유사한 결과를 생성합니다. 하지만 오버로드하는 메서드를 구현하는 방식과 관련한 요구 사항은 없습니다. 오버로드하는 메서드는 오버로드된 함수의 시그니처와 일치하지 않아도 됩니다.

참고

MATLAB에서는 동일한 클래스에 이름은 같지만 시그니처가 다른 여러 개의 메서드를 정의할 수 없습니다.

bar 함수 오버로드하기

일반적으로 사용되는 함수를 오버로드하여 클래스의 객체를 사용해서 작업하도록 하면 편리합니다. 예를 들어, 사용자가 자주 그래프로 그리는 데이터를 저장하는 속성을 정의한 클래스가 있다고 가정해 보겠습니다. MyData 클래스는 bar 함수를 재정의하고 제목을 그래프에 추가합니다.

classdef MyData
   properties
      Data
   end
   methods
      function obj = MyData(d)
         if nargin > 0
            obj.Data = d;
         end
      end
      function bar(obj)
         y = obj.Data;
         bar(y,'EdgeColor','r');
         title('My Data Graph')
      end
   end
end

MyData bar 메서드의 이름이 MATLAB bar 함수와 동일합니다. 하지만 MyData bar 메서드에는 MyData 객체가 입력값으로 필요합니다. 이 메서드는 MyData 객체에 대해 특화되어 있기 때문에 Data 속성에서 데이터를 추출하고 특화된 그래프를 생성할 수 있습니다.

bar 메서드를 사용하려면 다음과 같이 객체를 생성해야 합니다.

y = rand(1,10);
md = MyData(y);

이 객체를 사용하여 메서드를 호출합니다.

bar(md)

점 표기법을 사용할 수도 있습니다.

md.bar

MATLAB 연산자 구현하기

새 MATLAB 데이터형을 구현하도록 설계된 클래스는 일반적으로 특정 연산자(예: 더하기, 빼기 또는 등호)를 정의합니다.

예를 들어, 두 다항식을 더하는 연산은 단순한 덧셈으로 정의될 수 없기 때문에 표준 MATLAB 덧셈(+)으로는 두 다항식을 더할 수 없습니다. 하지만 polynomial 클래스에 자신만의 plus 메서드를 정의하면 사용자가 + 기호를 사용할 때 MATLAB 언어에서 이 메서드를 호출하여 polynomial 객체에 대한 덧셈을 수행할 수 있습니다.

p1 + p2

연산자를 오버로드하는 방법에 대한 자세한 내용은 연산자 오버로드 항목을 참조하십시오.

충돌을 피하기 위한 명명 규칙

메서드, 속성, 이벤트 이름의 범위는 클래스로 설정됩니다. 따라서, 이름이 충돌하지 않도록 다음 규칙을 따라야 합니다.

  • 관련 없는 클래스에서 사용한 이름은 재사용할 수 있습니다.

  • 멤버가 퍼블릭 액세스나 보호 액세스를 갖지 않는 경우 서브클래스에서 이름을 재사용할 수 있습니다. 그러면 이러한 이름이 슈퍼클래스 정의에 영향을 미치지 않고 완전히 다른 메서드, 속성 및 이벤트를 참조합니다.

  • 한 클래스 내에서 모든 이름은 동일한 네임스페이스에 존재하며 고유해야 합니다. 한 클래스가 동일한 이름을 갖는 두 개의 메서드를 정의할 수 없으며 메서드와 이름이 같은 로컬 함수를 정의할 수도 없습니다.

  • 정적 메서드의 이름은 클래스 접두사가 없는 것으로 간주됩니다. 따라서, 클래스 접두사가 없는 정적 메서드 이름이 다른 메서드의 이름과 일치해서는 안 됩니다.

관련 항목