객체 복사
두 가지 복사 동작
MATLAB® 객체는 핸들 객체와 값 객체라는 두 가지 기본 유형으로 나뉩니다.
값 객체는 복사 작업과 관련하여 MATLAB 기본 유형처럼 동작합니다. 복사본은 독립된 값입니다. 객체에 대해 수행하는 작업은 해당 객체의 복사본에 영향을 미치지 않습니다.
핸들 객체는 해당하는 핸들 변수에서 참조합니다. 그 핸들 변수의 복사본도 동일한 객체를 참조합니다. 핸들 객체에 대해 수행하는 작업은 해당 객체를 참조하는 모든 핸들 변수에서 인식됩니다.
핸들 객체 복사
클래스를 정의하는데 핸들 객체 복사를 지원하려는 경우에는 Implement Copy for Handle Classes 항목을 참조하십시오.
값 객체 복사 동작
MATLAB 숫자형 변수는 값 객체입니다. 예를 들어, a
를 변수 b
에 복사하는 경우 두 변수는 서로 독립적입니다. a
의 값을 변경해도 b
의 값이 변경되지 않습니다.
a = 8; b = a;
a
에 값을 다시 할당합니다. 그래도 b
는 변경되지 않습니다.
a = 6; b
b = 8
a
를 지워도 b
에는 영향이 없습니다.
clear a
b
b = 8
값 객체 속성
값 객체에 속성으로 저장된 값의 복사 동작은 숫자형 변수와 동일합니다. 예를 들어, vobj1
이 속성 a
를 갖는 값 객체라고 가정하겠습니다.
vobj1.a = 8;
vobj1
을 vobj2
에 복사한 후 vobj1
의 속성 a
의 값을 변경하면 복사된 객체의 속성 vobj2.a
의 값은 영향을 받지 않습니다.
vobj2 =vobj1; vobj1.a = 5; vobj2.a
ans = 8
핸들 객체 복사 동작
아래에는 Data
라는 속성을 정의하는 HdClass
라는 핸들 클래스가 나와 있습니다.
classdef HdClass < handle properties Data end methods function obj = HdClass(val) if nargin > 0 obj.Data = val; end end end end
다음과 같이 이 클래스의 객체를 생성합니다.
hobj1 = HdClass(8)
이 명령문이 세미콜론으로 끝나지 않으므로 MATLAB은 객체에 대한 정보를 표시합니다.
hobj1 = HdClass with properties: Data: 8
변수 hobj1
은 생성된 객체를 참조하는 핸들입니다. hobj1
을 hobj2
에 복사하면 동일한 객체를 참조하는 다른 핸들이 생성됩니다.
hobj2 = hobj1
hobj2 = HdClass with properties: Data: 8
핸들은 객체를 참조하므로 핸들을 새 변수 이름으로 복사하더라도 복사본 핸들은 계속해서 동일한 객체를 참조하게 됩니다. 예를 들어, hobj1
이 속성 Data
를 가지는 핸들 객체라고 가정하겠습니다.
hobj1.Data
ans = 8
hobj1
의 Data
속성에 대한 값을 변경하면 복사된 객체의 Data
속성에 대한 값도 변경됩니다.
hobj1.Data = 5; hobj2.Data
ans = 5
hobj2
와 hobj1
은 동일한 객체에 대한 핸들이므로 복사본 hobj2
를 변경하면 핸들 hobj1
을 통해 액세스하는 데이터도 변경됩니다.
hobj2.Data = 17; hobj1.Data
ans = 17
핸들 변수 다시 할당
핸들 변수를 다시 할당하면 임의의 MATLAB 변수를 다시 할당하는 것과 동일한 결과가 생성됩니다. 객체를 생성하여 hobj1
에 할당하면
hobj1 = HdClass(3.14);
hobj1
은 새 객체를 참조하며, 이전에 참조한 객체(hobj2
에서는 여전히 참조함)는 더 이상 참조하지 않습니다.
핸들 변수 지우기
작업 공간에서 핸들을 지우면 MATLAB은 해당 변수를 제거하지만, 다른 핸들에서 참조하는 객체는 제거하지 않습니다. 그러나 객체에 대한 참조가 없는 경우 MATLAB은 해당 객체를 제거합니다.
동일한 객체를 참조하는 hobj1
및 hobj2
가 있다고 가정할 경우, 객체에 영향을 미치지 않고 두 핸들 중 하나를 지울 수 있습니다.
hobj1.Data = 2^8; clear hobj1 hobj2
hobj2 = HdClass with properties: Data: 256
hobj1
과 hobj2
를 모두 지우면 객체에 대한 참조가 더 이상 없으므로 MATLAB은 이 객체를 삭제하고 해당 객체에 사용된 메모리를 해제합니다.
핸들 객체 삭제
임의 개수의 핸들에서 참조되는 객체를 제거하려면 delete
를 사용하십시오. 동일한 객체를 참조하는 hobj1
과 hobj2
가 있다고 가정할 경우, 두 핸들 중 하나를 삭제하면 MATLAB은 이 객체를 삭제합니다.
hobj1 = HdClass(8); hobj2 = hobj1; delete(hobj1) hobj2
hobj2 = handle to deleted HdClass
작업 공간에서 변수를 제거하려면 clear
를 사용하십시오.
객체 수정
객체를 함수에 전달할 때 MATLAB은 객체의 복사본을 함수 작업 공간에 전달합니다. 함수에서 객체를 수정하는 경우 MATLAB은 함수 작업 공간에 있는 객체의 복사본만 수정합니다. 핸들 클래스 복사 동작과 값 클래스 복사 동작 간에는 아래와 같은 상이점이 있으니, 이에 유의해야 합니다.
값 객체 — 함수는 객체의 수정된 복사본을 반환해야 합니다. 호출자의 작업 공간에서 객체를 수정하려면 동일한 이름의 변수에 함수의 출력값을 대입하십시오.
핸들 객체 — 함수 작업 공간의 복사본은 동일한 객체를 참조합니다. 따라서, 함수는 수정된 복사본을 반환할 필요가 없습니다.
핸들 클래스(Handle Class)나 값 클래스(Value Class) 테스트하기
객체가 핸들 객체인지 확인하려면 isa
함수를 사용하십시오. obj
가 어떤 클래스의 객체라고 가정할 경우 다음 명령문으로 obj
가 핸들인지 확인할 수 있습니다.
isa(obj,'handle')
예를 들어, containers.Map
클래스는 핸들 객체를 생성합니다.
hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'}); isa(hobj,'handle')
ans = 1
hobj
는 containers.Map
객체이기도 합니다.
isa(hobj,'containers.Map')
ans = 1
hobj
의 클래스를 쿼리하면 클래스가 containers.Map
객체임을 보여줍니다.
class(hobj)
ans = containers.Map
class
함수는 객체의 클래스 값을 반환합니다.