Main Content

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

클래스 생성자 메서드

클래스 생성자 메서드의 용도

생성자 메서드는 클래스의 인스턴스를 생성하는 특수 함수입니다. 일반적으로, 생성자 메서드는 입력 인수를 받아 속성에 저장된 데이터를 할당하고 초기화된 객체를 반환합니다.

기본 예제는 간단한 클래스 생성하기 항목을 참조하십시오.

클래스 생성자를 명시적으로 정의하지 않는 MATLAB® 클래스에는 디폴트 생성자 메서드가 있습니다. 이 메서드는 입력 인수 없이 생성된 클래스의 객체를 반환합니다. 클래스는 디폴트 생성자를 재정의하는 생성자 메서드를 정의할 수 있습니다. 명시적으로 정의된 생성자는 입력 인수를 받고, 속성값을 초기화하고, 다른 메서드를 호출하고, 클래스의 객체를 생성하는 데 필요한 다른 연산을 수행할 수 있습니다.

생성자 메서드의 기본적인 구조

생성자 메서드는 다음과 같은 세 가지 기본 섹션으로 구성될 수 있습니다.

  • 초기화 전 — 슈퍼클래스 생성자의 인수를 계산합니다.

  • 객체 초기화 — 슈퍼클래스 생성자를 호출합니다.

  • 초기화 후 — 서브클래스와 관련된 연산을 수행합니다. 여기에는 객체를 참조하고 객체에 값을 할당하고, 클래스 메서드를 호출하고, 객체를 함수에 전달하는 등의 연산이 포함됩니다.

이 코드에서는 각 섹션에서 수행되는 기본 연산을 보여줍니다.

classdef ConstructorDesign < BaseClass1
   properties
      ComputedValue
   end
   methods
      function obj = ConstructorDesign(a,b,c)
         
         %% Pre Initialization %%
         % Any code not using output argument (obj)
         if nargin == 0
            % Provide values for superclass constructor
            % and initialize other inputs
            a = someDefaultValue;
            args{1} = someDefaultValue;
            args{2} = someDefaultValue;
         else
            % When nargin ~= 0, assign to cell array,
            % which is passed to supclass constructor
            args{1} = b;
            args{2} = c;
         end
         compvalue = myClass.staticMethod(a);
         
         %% Object Initialization %%
         % Call superclass constructor before accessing object
         % You cannot conditionalize this statement
         obj = obj@BaseClass1(args{:});
         
         %% Post Initialization %%
         % Any code, including access to object
         obj.classMethod(arg);
         obj.ComputedValue = compvalue;
         ...
      end
   ...
   end
...
end

여느 함수와 마찬가지로 생성자를 호출하여 인수를 전달하고 클래스의 객체를 반환합니다.

obj = ConstructorDesign(a,b,c);

생성자 관련 지침

  • 생성자는 클래스와 동일한 이름을 가집니다.

  • 생성자는 여러 인수를 반환할 수 있지만, 첫 번째 출력값은 생성된 객체여야 합니다.

  • 출력 인수를 할당하지 않으려는 경우 생성자에서 객체 변수를 지우면 됩니다(출력 객체 표시 차단 참조).

  • 클래스 생성자를 생성하는 경우에는 이 생성자가 입력 인수 없이 호출될 수 있도록 해야 합니다. 입력 인수 없는 생성자 요구 사항를 참조하십시오.

  • 생성자가 슈퍼클래스 생성자를 명시적으로 호출하는 경우 이러한 호출은 생성된 객체에 대한 다른 참조 이전에 수행되어야 하고 return 문이 실행된 후에는 수행될 수 없습니다.

  • 슈퍼클래스 생성자에 대한 호출은 조건부일 수 없습니다. 루프, 조건, switch, try/catch 또는 중첩 함수 내에는 슈퍼클래스 생성 호출을 배치할 수 없습니다. 자세한 내용은 슈퍼클래스 생성자에 대한 조건부 호출은 허용되지 않음 항목을 참조하십시오.

디폴트 생성자

클래스가 생성자를 정의하지 않으면 MATLAB에서 디폴트 생성자를 제공하는데, 이 디폴트 생성자는 인수를 받지 않으며 속성이 속성 디폴트 값으로 초기화된 스칼라 객체를 반환합니다. 또한 MATLAB에서 제공하는 디폴트 생성자는 인수가 없는 모든 슈퍼클래스 생성자를 호출하거나 디폴트 서브클래스 생성자에 전달된 인수가 있는 모든 슈퍼클래스 생성자를 호출합니다.

서브클래스가 생성자를 정의하지 않으면 디폴트 생성자가 해당 입력값을 직속 슈퍼클래스 생성자에 전달합니다. 이 동작은 서브클래스가 생성자를 정의할 필요는 없지만 슈퍼클래스 생성자에 입력 인수가 필요한 경우 유용합니다.

생성자를 정의하는 경우

디폴트 생성자가 수행할 수 없는 객체 초기화를 수행하려는 경우 생성자 메서드를 정의해야 합니다. 클래스의 객체를 생성하기 위해 다음이 필요한 경우를 그러한 예로 들 수 있습니다.

  • 입력 인수

  • 클래스의 각 인스턴스에 대해 속성값 같은 객체 상태 초기화

  • 서브클래스 생성자에 의해 결정되는 값으로 슈퍼클래스 생성자 호출

관련 정보

열거형 생성과 관련된 자세한 내용은 시퀀스를 호출하는 열거형 클래스 생성자 항목을 참조하십시오.

생성자에 객체 배열을 생성하는 방법에 대한 자세한 내용은 객체 배열 생성하기 항목을 참조하십시오.

생성되는 클래스가 서브클래스이면 MATLAB이 각 슈퍼클래스의 생성자를 호출하여 객체를 초기화합니다. 이 경우 인수 없이 슈퍼클래스 생성자가 암시적으로 호출됩니다. 슈퍼클래스 생성자에 인수가 필요하면 서브클래스 생성자에서 인수를 명시적으로 호출하십시오. Control Sequence of Constructor Calls 항목을 참조하십시오.

생성자에서 객체 초기화하기

생성자 메서드는 출력 인수로 초기화된 객체를 반환합니다. 생성자가 실행될 때 코드의 첫 번째 라인을 실행하기 전에 출력 인수가 생성됩니다.

예를 들어, 다음 생성자는 객체의 속성 A에 대한 값을 첫 번째 명령문으로 할당할 수 있습니다. 객체 obj가 이미 MyClass의 인스턴스에 할당되어 있기 때문입니다.

function obj = MyClass(a,b,c)
   obj.A = a;
   ...
end

객체가 이미 초기화되었으므로 생성자에서 다른 클래스 메서드를 호출할 수 있습니다.

생성자는 속성이 디폴트 값을 가지는, 즉 속성 정의 블록에 빈 값([])이나 디폴트 값이 지정된 객체도 생성합니다.

예를 들어, 이 생성자는 입력 인수에 대해 연산을 수행하여 Value 속성의 값을 할당합니다.

function obj = MyClass(a,b,c)
   obj.Value = (a + b) / c;
   ...
end

생성자에서 객체 참조하기

속성에 값을 할당하는 등의 방법으로 객체를 초기화할 때에는 출력 인수의 이름을 사용하여 생성자 내에서 객체를 참조하십시오. 예를 들어, 다음 코드에서 출력 인수는 obj이고 객체는 obj로 참조됩니다.

% obj is the object being constructed
function obj = MyClass(arg)
   obj.propert1 = arg*10;
   obj.method1;
   ...
end

디폴트 속성값을 정의하는 방법에 대한 자세한 내용은 속성의 디폴트 값 항목을 참조하십시오.

입력 인수 없는 생성자 요구 사항

생성자가 입력 인수 없이 호출될 수 있어야 하는 경우가 있습니다.

  • 객체를 작업 공간으로 불러올 때 클래스 ConstructOnLoad 특성이 true로 설정되어 있으면 load 함수가 인수 없이 클래스 생성자를 호출합니다.

  • 일부 요소에 특정 값이 지정되지 않은 객체 배열을 생성하거나 확장하면 지정되지 않은 요소를 채우기 위해 인수 없이 클래스 생성자가 호출됩니다(예: x(10,1) = MyClass(a,b,c);). 이 경우, 생성자는 인수 없이 한 번만 호출되어 이 객체에 대한 복사본으로 빈 배열 요소(x(1:9,1))를 채웁니다.

입력 인수가 없는 경우 생성자는 디폴트 속성값만 사용하여 객체를 생성합니다. 클래스 생성자에 인수가 없음을 확인하는 검사를 추가하여 다음과 같은 두 경우 중 하나가 발생할 경우 오류가 발생하지 않도록 방지하는 것이 좋습니다.

function obj = MyClass(a,b,c)
   if  nargin > 0
      obj.A = a;
      obj.B = b;
      obj.C = c;
      ...
   end
end

슈퍼클래스 생성자를 처리하는 방법은 생성자 메서드의 기본적인 구조 항목을 참조하십시오.

서브클래스 생성자

서브클래스 생성자는 슈퍼클래스 생성자를 명시적으로 호출하여 인수를 슈퍼클래스 생성자에 전달할 수 있습니다. 서브클래스 생성자는 슈퍼클래스 생성자에 대한 호출에 이러한 인수를 지정해야 하고 생성자 출력 인수를 사용하여 이 호출을 형성해야 합니다. 구문은 다음과 같습니다.

classdef MyClass < SuperClass
   methods
      function obj = MyClass(a,b,c,d)
         obj@SuperClass(a,b);
         ...
      end
   end
end

서브클래스 생성자는 객체(obj)를 참조하기 전에 먼저 슈퍼클래스 생성자에 대한 호출을 모두 수행해야 합니다. 이러한 제약은 속성값을 할당하거나 일반 클래스 메서드를 호출하는 것도 포함합니다. 또한, 서브클래스 생성자는 슈퍼클래스 생성자를 한 번만 호출할 수 있습니다.

지정된 슈퍼클래스만 참조하기

classdef가 클래스를 슈퍼클래스로 지정하지 않으면 생성자가 이 구문에서 슈퍼클래스 생성자를 호출할 수 없습니다. 즉, 서브클래스 생성자는 classdef 라인에 나열된 직속 슈퍼클래스 생성자만 호출할 수 있습니다.

classdef MyClass < SuperClass1 & SuperClass2

MATLAB은 왼쪽에서 오른쪽으로 classdef 라인에 지정된 순서로 호출되지 않은 생성자를 모두 호출합니다. MATLAB은 이러한 호출에서 인수를 전달하지 않습니다.

슈퍼클래스 생성자에 대한 조건부 호출은 허용되지 않음

슈퍼클래스 생성자에 대한 호출은 조건부가 아니어야 합니다. 주어진 슈퍼클래스에 대해 호출을 한 번만 할 수 있습니다. 속성값 할당이나 클래스 메서드 호출 같은 객체 사용 이전에 슈퍼클래스 생성자를 호출하여 객체의 슈퍼클래스 부분을 초기화하십시오.

조건에 따라 다른 인수를 사용하여 슈퍼클래스 생성자를 호출하려면 인수로 구성된 셀형 배열을 만들고 생성자에 대한 단일 호출을 지정하십시오.

예를 들어, Cube 클래스 생성자는 Cube 생성자가 인수 없이 호출된 경우 디폴트 값을 사용하여 슈퍼클래스 Shape 생성자를 호출합니다. Cube 생성자가 네 개의 입력 인수로 호출된 경우 upvectorviewangle을 슈퍼클래스 생성자에 전달하십시오.

classdef Cube < Shape
   properties
      SideLength = 0
      Color = [0 0 0]
   end
   methods
      function cubeObj = Cube(length,color,upvector,viewangle)
         % Assemble superclass constructor arguments
         if nargin == 0
            super_args{1} = [0 0 1];
            super_args{2} = 10;
         elseif nargin == 4
            super_args{1} = upvector;
            super_args{2} = viewangle;
         else
            error('Wrong number of input arguments')
         end

         % Call superclass constructor
         cubeObj@Shape(super_args{:});

         % Assign property values if provided
         if nargin > 0 
            cubeObj.SideLength = length;
            cubeObj.Color = color;
         end
         ...
      end
   ...
   end
end

인수가 없거나 1개 이상인 슈퍼클래스

인수 없이 슈퍼클래스 생성자를 호출하는 구문을 지원하려면 다음 구문을 명시적으로 제공하십시오.

Cube 클래스 예제에서 Shape 슈퍼클래스 및 Cube 서브클래스의 모든 속성값이 클래스 정의에 지정된 디폴트 값을 가진다고 가정하겠습니다. 그러면 슈퍼클래스 생성자나 서브클래스 생성자에 인수를 지정하지 않고 Cube의 인스턴스를 생성할 수 있습니다.

다음은 Cube 생성자에서 이 동작을 구현하는 방법입니다.

methods
   function cubeObj = Cube(length,color,upvector,viewangle)
      % Assemble superclass constructor arguments
      if nargin == 0 
         super_args = {};
      elseif nargin == 4
         super_args{1} = upvector;
         super_args{2} = viewangle;
      else
         error('Wrong number of input arguments')
      end

      % Call superclass constructor
      cubeObj@Shape(super_args{:});

      % Assign property values if provided
      if nargin > 0 
         cubeObj.SideLength = length;
         cubeObj.Color = color;
      end
   ...
   end
end

서브클래스에 대한 추가 정보

서브클래스를 생성하는 방법에 대한 자세한 내용은 서브클래스 생성자 설계하기 항목을 참조하십시오.

상속된 생성자에 대한 암시적인 호출

MATLAB은 디폴트 서브클래스 생성자에서 슈퍼클래스 생성자로 인수를 암시적으로 전달합니다. 이러한 동작으로 인해 슈퍼클래스 생성자로 인수만 전달하는 상황에서는 서브클래스에 대한 생성자 메서드를 구현할 필요가 없습니다.

예를 들어, 다음 클래스 생성자에는 CurrentDate 속성에 할당할 하나의 입력 인수(datetime 객체)가 필요합니다.

classdef BaseClassWithConstr
   properties
      CurrentDate datetime
   end
   methods
      function obj = BaseClassWithConstr(dt)
         obj.CurrentDate = dt;
      end
   end        
end

BaseClassWithConstr의 서브클래스를 생성하되, 서브클래스에 명시적인 생성자 메서드가 필요하지 않다고 가정하겠습니다.

classdef SubclassDefaultConstr < BaseClassWithConstr
   ...
end

슈퍼클래스 인수와 함께 디폴트 생성자를 호출하여 SubclassDefaultConstr의 객체를 생성할 수 있습니다.

obj = SubclassDefaultConstr(datetime);

서브클래스 생성자에 대한 자세한 내용은 서브클래스 생성자디폴트 생성자 항목을 참조하십시오.

클래스 생성 시 발생하는 오류

핸들 클래스의 경우, 다음과 같은 조건에서 오류가 발생하면 MATLAB이 delete 메서드를 호출합니다.

  • 객체에 대한 참조가 코드에서 오류가 발생한 지점 앞에 있습니다.

  • 초기 return 문이 코드에서 오류가 발생한 지점 앞에 있습니다.

MATLAB이 객체에 대해 delete 메서드를 호출하고, 속성에 포함된 객체에 대해 delete 메서드를 호출하며, 초기화된 기본 클래스에 대해 delete를 호출합니다.

오류가 발생한 시점에 따라 MATLAB은 객체가 완전히 생성되기 전에 클래스 소멸자를 호출할 수 있습니다. 따라서 클래스의 delete 메서드가 일부 속성에 대해 값을 가지고 있지 않을 수 있는 부분적으로 생성된 객체에 대해 연산을 수행할 수 있어야 합니다. 자세한 내용은 부분적으로 생성된 객체에 대한 소멸 지원 항목을 참조하십시오.

객체가 소멸되는 방법에 대한 자세한 내용은 핸들 클래스 소멸자 항목을 참조하십시오.

출력 객체 표시 차단

생성자에 대한 호출에서 출력 변수가 할당되지 않은 경우 ans 변수에 대한 클래스 인스턴스의 값 할당 표시를 차단할 수 있습니다. 이 기법은 생성된 객체에 고정되는 그래픽 인터페이스 창을 생성하는 앱에 유용합니다. 이러한 앱에서는 객체를 반환할 필요가 없습니다.

nargout을 사용하여 생성자가 출력 인수를 사용하여 호출되었는지 여부를 확인할 수 있습니다. 예를 들어, 출력값이 할당되지 않은 상태로 MyApp 클래스에 대한 클래스 생성자가 호출된 경우 이 생성자가 객체 변수인 obj를 지웁니다.

classdef MyApp
   methods
      function obj = MyApp
         ...
         if nargout == 0
            clear obj
         end
      end
      ...
   end
end

클래스 생성자가 객체를 반환하지 않으면 MATLAB이 meta.class InstanceCreated 이벤트를 트리거하지 않습니다.

관련 항목