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
클래스입니다.
메서드
예제
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
메서드는 복사 동작에 대한 재정의할 수 없는 퍼블릭 인터페이스를 제공합니다. 이 메서드는 객체로 구성된 배열을 입력값으로 받고 차원이 동일한 배열을 반환합니다.
copyElement
는 copy
메서드가 입력 배열의 각 객체에 대해 복사 작업을 수행할 때 사용하는 보호 메서드입니다. 서브클래스에서 copyElement
를 재정의하면 상속된 copy
메서드의 동작을 사용자 지정할 수 있습니다.
복사 작업이 특정 속성값을 복사하는지 여부를 제어하려면 속성 NonCopyable
의 특성을 사용하십시오.
이 예제에서는 matlab.mixin.Copyable
의 서브클래스에서 copyElement
메서드를 재정의하여 handle
객체의 특정 클래스를 깊은 복사(Deep Copy)합니다.
다음과 같은 클래스가 있다고 가정하겠습니다.
ContainsHandles
— 두 속성에handle
객체를 포함하는matlab.mixin.Copyable
의 서브클래스DeepCp
—matlab.mixin.Copyable
의 서브클래스ShallowCp
—handle
의 서브클래스
다음은 간단히 표현된 클래스 정의입니다.
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
클래스 ShallowCp
는 matlab.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에 개발됨