Main Content

matlab.mixin.Copyable 클래스

네임스페이스: matlab.mixin

핸들 객체용 복사 기능을 제공하는 슈퍼클래스

설명

matlab.mixin.Copyable 클래스는 핸들 객체 복사용 copy 메서드를 제공하는 추상 핸들 클래스입니다. copy 메서드는 객체를 얕은 복사합니다. 즉, 소스 객체의 Dependent 이외의 모든 속성을 대상 객체에 얕은 복사합니다. MATLAB®은 속성값에 포함된 핸들에 대해 copy를 재귀적으로 호출하지 않습니다.

matlab.mixin.Copyable을 서브클래스화하여 copy 메서드를 상속하는 핸들 클래스를 정의하십시오. copy 메서드는 클래스 생성자나 속성 설정 함수를 호출하지 않고 데이터를 복사합니다. 따라서 부수 효과가 발생하지 않습니다.

matlab.mixin.Copyable에서 서브클래스를 파생하고 copyElement 메서드를 재정의하면 복사 동작을 사용자 지정할 수 있습니다. 자세한 내용은 서브클래스 복사 동작 사용자 지정 예제를 참조하십시오.

matlab.mixin.Copyable 클래스는 handle 클래스입니다.

클래스 특성

Abstract
true
ConstructOnLoad
true
HandleCompatible
true

클래스 특성에 대한 자세한 내용은 클래스 특성 항목을 참조하십시오.

메서드

모두 확장

예제

Copy 메서드 추가하기

matlab.mixin.Copyable를 서브클래스화하여 핸들 클래스에 copy 메서드를 추가합니다.

classdef MyClass < matlab.mixin.Copyable
   properties
      Prop
   end
end

객체를 만듭니다.

a = MyClass;

객체의 복사본을 만듭니다.

b = copy(a);

자세한 내용은 Implement Copy for Handle Classes 항목을 참조하십시오.

서브클래스 복사 동작 사용자 지정

copy 메서드는 복사 동작에 대한 재정의할 수 없는 퍼블릭 인터페이스를 제공합니다. 이 메서드는 객체로 구성된 배열을 입력값으로 받고 차원이 동일한 배열을 반환합니다.

copyElementcopy 메서드가 입력 배열의 각 객체에 대해 복사 작업을 수행할 때 사용하는 보호 메서드입니다. 서브클래스에서 copyElement를 재정의하면 상속된 copy 메서드의 동작을 사용자 지정할 수 있습니다.

복사 작업이 특정 속성값을 복사하는지 여부를 제어하려면 속성 NonCopyable의 특성을 사용하십시오.

선택적 깊은 복사 구현하기

이 예제에서는 matlab.mixin.Copyable의 서브클래스에서 copyElement 메서드를 재정의하여 handle 객체의 특정 클래스를 깊은 복사(Deep Copy)합니다.

다음과 같은 클래스가 있다고 가정하겠습니다.

  • ContainsHandles — 두 속성에 handle 객체를 포함하는 matlab.mixin.Copyable의 서브클래스

  • DeepCpmatlab.mixin.Copyable의 서브클래스

  • ShallowCphandle의 서브클래스

다음은 간단히 표현된 클래스 정의입니다.

classdef ContainsHandles < matlab.mixin.Copyable
   properties
      Prop1
      Prop2
      DeepObj     % Contains a DeepCp object
      ShallowObj  % Contains a ShallowCp object
   end
   methods
      function obj = ContainsHandles(val1,val2,deepobj,shallowobj)
         if nargin > 0
            obj.Prop1 = val1;
            obj.Prop2 = val2;
            obj.DeepObj = deepobj;
            obj.ShallowObj = shallowobj;
         end
      end
   end
   methods(Access = protected)
      % Override copyElement method:
      function cpObj = copyElement(obj)
         % Make a shallow copy of all four properties
         cpObj = copyElement@matlab.mixin.Copyable(obj);
         % Make a deep copy of the DeepCp object
         cpObj.DeepObj = copy(obj.DeepObj);
      end
   end
end

DeepCp 클래스는 matlab.mixin.Copyable에서 파생됩니다.

classdef DeepCp < matlab.mixin.Copyable
   properties
      DpProp
   end
   methods
      function obj = DeepCp(val)
         ...
      end
   end
end

handle 클래스 ShallowCpmatlab.mixin.Copyable에서 파생되지 않으므로 copy 메서드가 없습니다.

classdef ShallowCp < handle
   properties
      ShProp
   end
   methods
      function obj = ShallowCp(val)
         ...
      end
   end
end

DeepObj 속성과 ShallowObj 속성에 두 핸들 객체를 포함하는 ContainsHandles 객체를 만듭니다.

sc = ShallowCp(7);
dc = DeepCp(7);
a = ContainsHandles(4,5,dc,sc);
a.DeepObj
ans = 

  DeepCp with properties:

    DpProp: 7
a.ShallowObj
ans = 

  ShallowCp with properties:

    ShProp: 7

ContainsHandles 객체를 복사합니다.

b = copy(a);

복사되어 반환된 b는 객체 sc의 얕은 복사(Shallow Copy)와 객체 dc의 깊은 복사를 포함합니다. 즉, ContainsHandles 생성자에 전달된 dc 객체는 이제 복사 작업의 결과로 새 독립적 객체가 됩니다. 이제 복사에 영향을 주지 않고 dc 객체를 변경할 수 있습니다. 얕은 복사된 객체 sc는 여전히 복사에 영향을 줄 수 있습니다.

핸들 객체의 속성값을 변경합니다.

sc.ShProp = 5;
dc.DpProp = 5;

깊은 복사된 객체는 영향을 받지 않습니다.

b.DeepObj
ans = 

  DeepCp with properties:

    DpProp: 7

얕은 복사된 객체는 여전히 동일한 데이터를 참조합니다.

b.ShallowObj
ans = 

  ShallowCp with properties:

    ShProp: 5
계층 구조에서 복사 동작 재정의하기

슈퍼클래스의 copyElement 메서드는 서브클래스의 프라이빗 데이터에 액세스할 수 없습니다.

matlab.mixin.Copyable의 서브클래스에서 copyElement를 재정의하고 해당 서브클래스를 슈퍼클래스로 사용하는 경우 프라이빗 속성을 포함하는 모든 서브클래스에서 copyElement를 재정의해야 합니다. 서브클래스에서 copyElement를 재정의하면 이전 예제에서처럼 해당 슈퍼클래스에서 copyElement를 호출해야 합니다.

간단히 표현된 다음 코드가 이러한 접근 방식을 보여줍니다.

classdef SuperClass < matlab.mixin.Copyable
   properties(Access = private)
      super_prop
   end
   methods
        ...
 
      function cpObj = copyElement(obj)
            ...
         cpObj = copyElement@matlab.mixin.Copyable(obj); 
            ...
      end
   end
end



classdef SubClass1 < SuperClass
   properties(Access=private)
      sub_prop1
   end
   methods
      function cpObj = copyElement(obj)
         % Copy super_prop
         cpObj = copyElement@SuperClass(obj);
         % Copy sub_prop1 in subclass
         % Assignment can introduce side effects
         cpObj.sub_prop1 = obj.sub_prop1;
      end
   end
end

SubClass1에서 copyElement를 재정의하면 슈퍼클래스가 서브클래스의 프라이빗 데이터에 액세스할 수 없기 때문에 프라이빗 서브클래스 속성이 복사됩니다.

참고

SubClass1에서 copyElement 재정의 시 sub_prop1을 통해 값을 대입하면, 속성 set 메서드가 호출되며, 진행 중인 복사 작업에 부수 효과가 발생할 수 있습니다.

특정 입력값에 대한 복사 동작

다음과 같은 형식의 matlab.mixin.Copyable copy 메서드를 호출한 경우를 살펴보겠습니다.

B = copy(A);

copy에 대한 이러한 호출은 다음 조건 각각에 대해 설명된 결과를 생성합니다.

  • A에 동적 속성이 있을 경우 — copy는 동적 속성을 복사하지 않습니다. 필요한 경우 서브클래스에서 동적 속성 복사를 구현할 수 있습니다.

  • A에 Dependent 이외의 속성이 없을 경우 — copy는 클래스 생성자를 호출하지 않고 속성값이 없는 새 객체를 만들어 부수 효과를 방지합니다.

  • A에 삭제된 핸들이 포함될 경우 — copy는 출력 배열에 동일한 클래스의 '삭제된 핸들'을 만듭니다.

  • A에 연결된 리스너가 있을 경우 — copy는 리스너를 복사하지 않습니다.

  • A에 열거형 클래스의 객체가 포함될 경우 — 열거형 클래스는 matlab.mixin.Copyable을 서브클래스화할 수 없습니다.

  • delete 메서드가 copy를 호출할 경우 — copy는 정상적인 복사본을 만들며 다른 용도에 적용되는 모든 동작을 준수합니다.

참고

생성 가능한 인스턴스는 enumeration 블록 안에 정의된 인스턴스로 제한되기 때문에 matlab.mixin.Copyable에서 열거형 클래스를 파생할 수 없습니다. 열거형 클래스에 대한 자세한 내용은 열거형 클래스 정의하기 항목을 참조하십시오.

세부 정보

모두 확장

버전 내역

R2011a에 개발됨

참고 항목