Main Content

객체 복사

두 가지 복사 동작

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; 

vobj1vobj2에 복사한 후 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은 생성된 객체를 참조하는 핸들입니다. hobj1hobj2에 복사하면 동일한 객체를 참조하는 다른 핸들이 생성됩니다.

hobj2 = hobj1
hobj2 = 

  HdClass with properties:

    Data: 8

핸들은 객체를 참조하므로 핸들을 새 변수 이름으로 복사하더라도 복사본 핸들은 계속해서 동일한 객체를 참조하게 됩니다. 예를 들어, hobj1이 속성 Data를 가지는 핸들 객체라고 가정하겠습니다.

hobj1.Data
ans =

     8

hobj1Data 속성에 대한 값을 변경하면 복사된 객체의 Data 속성에 대한 값도 변경됩니다.

hobj1.Data = 5;
hobj2.Data
ans =

     5

hobj2hobj1은 동일한 객체에 대한 핸들이므로 복사본 hobj2를 변경하면 핸들 hobj1을 통해 액세스하는 데이터도 변경됩니다.

hobj2.Data = 17;
hobj1.Data
ans =

    17

핸들 변수 다시 할당

핸들 변수를 다시 할당하면 임의의 MATLAB 변수를 다시 할당하는 것과 동일한 결과가 생성됩니다. 객체를 생성하여 hobj1에 할당하면

hobj1 = HdClass(3.14);

hobj1은 새 객체를 참조하며, 이전에 참조한 객체(hobj2에서는 여전히 참조함)는 더 이상 참조하지 않습니다.

핸들 변수 지우기

작업 공간에서 핸들을 지우면 MATLAB은 해당 변수를 제거하지만, 다른 핸들에서 참조하는 객체는 제거하지 않습니다. 그러나 객체에 대한 참조가 없는 경우 MATLAB은 해당 객체를 제거합니다.

동일한 객체를 참조하는 hobj1hobj2가 있다고 가정할 경우, 객체에 영향을 미치지 않고 두 핸들 중 하나를 지울 수 있습니다.

hobj1.Data = 2^8;
clear hobj1
hobj2
hobj2 = 

  HdClass with properties:

    Data: 256

hobj1hobj2를 모두 지우면 객체에 대한 참조가 더 이상 없으므로 MATLAB은 이 객체를 삭제하고 해당 객체에 사용된 메모리를 해제합니다.

핸들 객체 삭제

임의 개수의 핸들에서 참조되는 객체를 제거하려면 delete를 사용하십시오. 동일한 객체를 참조하는 hobj1hobj2가 있다고 가정할 경우, 두 핸들 중 하나를 삭제하면 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

hobjcontainers.Map 객체이기도 합니다.

isa(hobj,'containers.Map')
ans =

     1

hobj의 클래스를 쿼리하면 클래스가 containers.Map 객체임을 보여줍니다.

class(hobj)
ans =

containers.Map

class 함수는 객체의 클래스 값을 반환합니다.

관련 항목