메서드

메서드 (Methods)

클래스의 모든 메서드는 methods 블록 안에 정의해야 해요. 이 블록에는 접근 권한이나 정적(static) 여부 같은 추가 속성을 줄 수 있죠. Octave의 classdef 기반 클래스 메서드를 매뉴얼 34.6.3절을 중심으로 살펴볼게요.

출처: Methods

본문

모든 클래스 메서드는 methods 블록 안에서 정의되어야 합니다. 이 규칙의 예외 하나는 이 하위 절 끝에서 설명해요. methods 블록에는 접근 권한을 지정하거나, 메서드가 정적(static)인지—즉 클래스의 객체를 만들지 않고도 호출할 수 있는지—를 지정하는 추가 속성을 붙일 수 있어요.

classdef some_class
  methods
    function obj = some_class ()
      disp ("New instance created.");
    endfunction

    function disp (obj)
      disp ("Here is some_class.");
    endfunction
  endmethods

  methods (Access = mode)
    function r = func (obj, r)
      r = 2 * r;
    endfunction
  endmethods

  methods (Static = true)
    function c = circumference (radius)
      c = 2 * pi () .* radius;
    endfunction
  endmethods
endclassdef

클래스의 생성자는 methods 블록 안에 선언되며, 클래스와 같은 이름을 가져야 하고 정확히 하나의 출력 인자(자기 클래스의 객체)를 돌려줘야 해요.

또한 위 예시의 disp 함수처럼 내장 또는 상속된 메서드를 오버로드할 수 있어요. 이렇게 하면 Octave에 some_class의 객체가 어떻게 표시되어야 하는지를 알려줄 수 있습니다 (Class Methods 참고).

일반적으로 메서드 정의의 첫 번째 인자는 항상 그 메서드가 호출된 객체예요. 클래스 메서드는 그 객체를 첫 번째 인자로 전달해 호출하거나, 객체 뒤에 점(.)과 메서드 이름, 그리고 이후 인자들을 붙여 호출할 수 있어요.

>> obj = some_class ();
New instance created.
>> disp (obj);   # both are
>> obj.disp ();  # equal

some_class에서 메서드 funcAccess 속성을 mode로 설정한 methods 블록 안에 정의되어 있어요. mode는 다음 중 하나입니다.

public — 메서드를 어디서든 접근할 수 있어요. private — 다른 클래스 메서드에서만 접근할 수 있어요. 그 클래스의 서브클래스는 접근할 수 없습니다. protected — 다른 클래스 메서드와 그 클래스의 서브클래스에서만 접근할 수 있어요.

메서드의 기본 접근 권한은 public이에요.

마지막으로 메서드 circumference는 정적 methods 블록 안에 정의되어 있어서, some_class의 객체를 만들지 않고도 사용할 수 있어요. 이는 클래스 속성에 의존하지 않는 메서드에 유용합니다. 정적 메서드는 클래스 이름과 정적 메서드 이름을 점(.)으로 구분해 호출해요. 비정적 메서드와 달리, some_class의 객체를 사용해 호출하더라도 객체가 첫 번째 인자로 전달되지는 않습니다.

>> some_class.circumference (3)
⇒  ans =  18.850
>> obj = some_class ();
New instance created.
>> obj.circumference (3)
⇒  ans =  18.850

추가로, 클래스 메서드는 클래스 이름 앞에 @ 기호를 붙인 같은 이름의 폴더 안에서 함수로 정의할 수도 있어요 (Creating a Class 참고). 기본 classdef 파일도 이 클래스 폴더에 저장해야 합니다.

더 알아보기

  • octave-precedence-of-objects — 객체 우선순위와 superiorto/inferiorto
  • octave-indexed-assignment-optimizationsubsasgn 메서드의 인덱스 할당 최적화
  • octave-function-files — 함수 파일과 @ 폴더