이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

서브클래스 생성자 설계하기

슈퍼클래스 생성자를 명시적으로 호출하기

서브클래스 생성자에서 각 슈퍼클래스 생성자를 명시적으로 호출하면 다음과 같은 작업을 수행할 수 있습니다.

  • 인수를 슈퍼클래스 생성자에 전달

  • MATLAB®이 슈퍼클래스 생성자를 호출하는 순서 제어

서브클래스 생성자에서 슈퍼클래스 생성자를 명시적으로 호출하지 않으면 MATLAB이 이러한 생성자를 인수 없이 암시적으로 호출합니다. 슈퍼클래스 생성자가 암시적인 호출을 지원하려면 인수가 없는 구문을 지원해야 합니다.

MATLAB에서는 슈퍼클래스가 여러 개 있는 경우 특정한 호출 순서를 보장하지 않습니다. MATLAB이 슈퍼클래스 생성자를 호출하는 순서가 중요한 경우 서브클래스 생성자에서 슈퍼클래스 생성자를 명시적으로 호출하십시오.

서브클래스 생성자를 정의하지 않는 경우 슈퍼클래스 인수를 사용하여 디폴트 생성자를 호출할 수 있습니다. 자세한 내용은 디폴트 생성자 항목과 상속된 생성자에 대한 암시적인 호출 항목을 참조하십시오.

서브클래스에서 슈퍼클래스 생성자 호출하기

서브클래스 생성자 내에서 각 슈퍼클래스에 대한 생성자를 호출하려면 다음 구문을 사용하십시오.

obj@SuperClass1(args,...);

...

obj@SuperclassN(args,...);

여기서 obj는 서브클래스 생성자의 출력값이고, SuperClass...는 슈퍼클래스의 이름이며, args는 해당 슈퍼클래스 생성자에 필요한 인수입니다.

예를 들어, 클래스 정의의 다음 부분은 Assets라는 클래스의 서브클래스인 Stocks라는 클래스를 보여줍니다.

classdef Stocks < Assets
   methods
      function s = Stocks(asset_args,...)
         if nargin == 0
            % Assign values to asset_args
         end
         % Call asset constructor
         s@Assets(asset_args); 
         ...
      end
   end
end

서브클래스 생성자에 서브클래스 생성자 메서드를 생성하는 방법에 대한 자세한 내용이 나와 있습니다.

패키지에 포함된 슈퍼클래스 참조하기

슈퍼클래스가 패키지에 포함된 경우 패키지 이름을 포함시켜야 합니다. 예를 들어, Assests 클래스가 finance 패키지에 있는 경우 다음과 같이 하십시오.

classdef Stocks < finance.Assets
   methods
      function s = Stocks(asset_args,...)
         if nargin == 0
            ...
         end
         % Call asset constructor
         s@finance.Assets(asset_args); 
         ...
      end
   end
end

여러 슈퍼클래스를 사용하여 객체 초기화하기

여러 슈퍼클래스에서 클래스를 파생하려면 각 슈퍼클래스 생성자에 대한 호출을 사용하여 서브클래스 객체를 초기화해야 합니다.

classdef Stocks < finance.Assets & Taxable
   methods
      function s = Stocks(asset_args,tax_args,...)
         if nargin == 0
            ...
         end
         % Call asset and member class constructors
         s@finance.Assets(asset_args)
         s@Taxable(tax_args)
         ...
      end
   end
end

서브클래스 생성자 구현

클래스 생성자가 인수가 없는 구문을 지원하도록 하려면 슈퍼클래스 생성자를 호출하기 전에 디폴트 값을 입력 인수 변수에 할당해야 합니다. 슈퍼클래스 생성자에 대한 서브클래스의 호출을 조건화할 수 없습니다. 슈퍼클래스 생성자에 대한 호출을 조건부 코드 블록 외부에 두십시오.

예를 들어, Stocks 클래스 생성자는 if 문에서 인수가 없는 경우를 지원하는데, if 코드 블록 외부에서 슈퍼클래스 생성자를 호출합니다.

classdef Stocks < finance.Assets
   properties
      NumShares
      Symbol 
   end
   methods
      function s = Stocks(description,numshares,symbol)
         if nargin == 0
            description = '';
            numshares = 0;
            symbol = '';
         end
         s@finance.Assets(description);
         s.NumShares = numshares;
         s.Symbol = symbol;
      end
   end
end

생성자에서 직속 슈퍼클래스만 호출하기

서브클래스 생성자에서는 직속 슈퍼클래스 생성자만 호출합니다. 예를 들어, B 클래스가 A 클래스에서 파생되고 C 클래스가 B 클래스에서 파생된다고 가정하겠습니다. C 클래스에 대한 생성자는 A 클래스에 대한 생성자를 호출하여 속성을 초기화할 수 없습니다. B 클래스는 A 클래스의 속성을 초기화해야 합니다.

다음 A, B, C 클래스 구현에서 각 클래스에서 이러한 관계를 설계하는 방법을 보여줍니다.

A 클래스는 속성 xy를 정의하지만 x에만 값을 할당합니다.

classdef A
   properties
      x
      y
   end
   methods
      function obj = A(x)
         ...
            obj.x = x;
      end
   end
end

B 클래스는 A 클래스에서 속성 xy를 상속합니다. B 클래스의 생성자는 A 클래스의 생성자를 호출하여 x를 초기화한 후 값을 y에 할당합니다.

classdef B < A
   methods
      function obj = B(x,y)
         ...
         obj@A(x);
         obj.y = y;
      end
   end
end

C 클래스는 속성 xy에 대한 값을 받아 B 클래스의 생성자에 전달합니다. 그러면 이 생성자가 A 클래스의 생성자를 호출합니다.

classdef C < B
   methods
      function obj = C(x,y)
         ...
         obj@B(x,y);
      end
   end
end

관련 항목