Main Content

핸들 클래스와 값 클래스 비교

기본적인 차이점

클래스 생성자는 할당되는 변수와 연결된 객체를 반환합니다. 이 변수를 다시 할당하면 MATLAB®은 원래 객체에 대한 독립적인 복사본을 생성합니다. 이 변수를 함수에 전달하여 수정하는 경우 함수는 수정된 객체를 출력 인수로 반환해야 합니다. 값 클래스 동작에 대한 자세한 내용은 불필요한 데이터 복사본 방지하기 항목을 참조하십시오.

핸들 클래스 생성자는 생성된 객체에 대한 참조인 핸들 객체를 반환합니다. 사용자는 핸들 객체를 여러 변수에 할당하거나 함수에 전달할 수 있으며, 이때 MATLAB은 원래 객체의 복사본을 생성하지 않습니다. 입력 인수로 전달되는 핸들 객체를 수정하는 함수는 객체를 반환할 필요가 없습니다.

모든 핸들 클래스는 추상 handle 클래스에서 파생됩니다.

값 클래스 생성하기

기본적으로 MATLAB 클래스는 값 클래스입니다. 다음 정의는 MyValueClass라는 값 클래스를 생성합니다.

classdef MyValueClass 
   ...
end 

핸들 클래스 생성하기

handle 클래스를 생성하려면 handle 클래스에서 클래스를 파생하십시오.

classdef MyHandleClass < handle
   ...
end 

MATLAB 내장 클래스의 동작

MATLAB 기본 클래스는 값 클래스(숫자형, logical형, char형, cell형, struct형 및 함수 핸들)입니다. 예를 들어, int32형 클래스의 객체를 생성하고 이 객체의 복사본을 생성하면 그 결과로 두 개의 독립적인 객체가 생성됩니다. a의 값을 변경해도 b의 값은 변경되지 않습니다. 이 동작은 값을 나타내는 클래스의 일반적인 동작입니다.

a = int32(7);
b = a;
a = a^4;
b
   7

MATLAB 그래픽스 객체는 시각적 요소를 나타내기 때문에 핸들 객체로 구현됩니다. 예를 들어, 그래픽스 line 객체를 생성하고 그 핸들을 다른 변수로 복사해 보겠습니다. 두 변수 모두 동일한 line 객체를 참조합니다.

x = 1:10; y = sin(x);
l1 = line(x,y);
l2 = l1;

핸들의 두 복사본 중 하나를 사용하여 line 객체의 속성을 설정합니다.

set(l2,'Color','red') 
set(l1,'Color','green') 
get(l2,'Color')
ans =

     0     1     0

l2 핸들에 대해 delete 함수를 호출하면 line 객체가 소멸됩니다. 라인 l1에서 Color 속성을 설정하려고 하면 set 함수가 오류를 반환합니다.

delete(l2)
set(l1,'Color','blue')
Error using matlab.graphics.primitive.Line/set
Invalid or deleted object.

기존 핸들 중 하나를 삭제하여 객체를 삭제하면 모든 핸들이 참조하는 단일 객체가 삭제되기 때문에 모든 복사본이 이제 유효하지 않게 됩니다.

핸들 객체를 삭제하는 것은 핸들 변수를 지우는 것과 같지 않습니다. 그래픽스 객체 계층 구조에서 객체의 부모는 객체에 대한 참조를 유지합니다. 예를 들어, 부모 axes는 l1l2에서 참조하는 line 객체에 대한 참조를 유지합니다. 작업 공간에서 두 변수를 모두 지워도 객체는 여전히 존재합니다.

핸들 객체의 동작에 대한 자세한 내용은 핸들 객체 동작 항목을 참조하십시오.

사용자 정의 값 클래스

MATLAB은 객체를 할당 받는 변수와 값 클래스의 객체를 연결합니다. 값 객체를 다른 변수에 복사하거나 값 객체를 함수에 전달하면 MATLAB이 객체 및 객체가 포함하는 모든 데이터의 독립적인 복사본을 생성합니다. 새 객체는 원래 객체의 변경과 관련이 없습니다. 값 객체는 MATLAB 숫자형 클래스 및 struct형 클래스처럼 동작합니다. 각 속성은 기본적으로 MATLAB 배열처럼 동작합니다.

값 객체는 하나의 작업 공간이나 임시 변수와 항상 연결됩니다. 값 객체의 변수가 범위를 벗어나거나 지워지면 값 객체도 범위를 벗어나게 됩니다. 값 객체에 대한 참조는 없으며, 독립적 객체인 복사본만 존재합니다.

값 객체 동작

다음은 자신의 Number 속성에 값을 저장하는 값 클래스입니다. 디폴트 속성값은 숫자 1입니다.

classdef NumValue
   properties
      Number = 1
   end
end

NumValue 객체를 생성하여 변수 a에 할당합니다.

a = NumValue
a = 

  NumValue with properties:

    Number: 1

a의 값을 다른 변수 b에 할당합니다.

b = a
b = 

  NumValue with properties:

    Number: 1

변수 ab는 서로 독립적입니다. aNumber 속성값을 변경해도 bNumber 속성에는 영향을 미치지 않습니다.

a.Number = 7
a = 

  NumValue with properties:

    Number: 7
b
b = 

  NumValue with properties:

    Number: 1

함수에서 값 객체 수정하기

값 객체를 함수에 전달하면 MATLAB이 함수 작업 공간에서 객체의 복사본을 생성합니다. 값 객체의 복사본은 독립적이기 때문에 함수가 호출자의 작업 공간에 있는 객체를 수정하지 않습니다. 따라서, 값 객체를 수정하는 함수는 호출자의 작업 공간에 재할당되도록 수정된 객체를 반환해야 합니다.

자세한 내용은 객체 수정 항목을 참조하십시오.

사용자 정의 핸들 클래스

handle 클래스에서 파생되는 클래스의 인스턴스는 기본 객체 데이터에 대한 참조입니다. 핸들 객체를 복사하면 MATLAB이 핸들을 복사하지만, 객체 속성에 저장된 데이터는 복사하지 않습니다. 이 복사본은 원래 핸들과 동일한 객체를 참조합니다. 원래 객체의 속성값을 변경하면 복사된 핸들이 동일한 변경 사항을 참조합니다.

핸들 객체 동작

다음은 자신의 Number 속성에 값을 저장하는 핸들 클래스입니다. 디폴트 속성값은 숫자 1입니다.

classdef NumHandle < handle
   properties
      Number = 1
   end
end

NumHandle 객체를 생성하여 변수 a에 할당합니다.

a = NumHandle
a = 

  NumHandle with properties:

    Number: 1

a의 값을 다른 변수 b에 할당합니다.

b = a
b = 

  NumHandle with properties:

    Number: 1

변수 ab는 동일한 기본 객체를 참조합니다. aNumber 속성값을 변경하면 bNumber 속성도 변경됩니다. 즉, ab는 동일한 객체를 참조합니다.

a.Number = 7
a = 

  NumHandle with properties:

    Number: 7
b
b = 

  NumHandle with properties:

    Number: 7

함수에 포함된 핸들 객체 수정하기

함수에 핸들 객체를 전달하면 MATLAB이 함수 작업 공간에서 핸들의 복사본을 생성합니다. 핸들의 복사본이 동일한 기본 객체를 참조하기 때문에 핸들 객체를 수정하는 함수가 실제로 호출자의 작업 공간에 포함된 객체도 수정합니다. 따라서, 입력 인수로 전달된 핸들 객체를 수정하는 함수가 수정된 객체를 호출자에 반환할 필요가 없습니다.

자세한 내용은 객체 수정 항목을 참조하십시오.

핸들 삭제하기

핸들 delete 메서드를 명시적으로 호출하여 핸들 객체를 소멸시킬 수 있습니다. 핸들 클래스 객체의 핸들을 삭제하면 모든 핸들이 유효하지 않게 됩니다. 예를 들면 다음과 같습니다.

a = NumHandle;
b = a;
delete(a)
b.Number
Invalid or deleted object.

핸들 객체에 대해 delete를 호출하면 해당 객체에 대한 소멸자 함수가 호출됩니다. 자세한 내용은 핸들 클래스 소멸자 항목을 참조하십시오.

핸들 객체를 포함하도록 속성 초기화하기

properties 블록에서 속성을 디폴트 값으로 초기화하는 것과 생성자 내부에서 속성을 초기화하는 것 간의 차이점에 대한 자세한 내용은 속성값 초기화하기객체 배열을 만들고 초기화하기 항목을 참조하십시오.

객체의 동일성 확인하기

값 객체의 동일성은 객체가 동일한 클래스이고 동일한 상태를 갖는다는 것을 의미합니다.

핸들 객체의 동일성은 핸들 변수가 동일한 객체를 참조한다는 것을 의미합니다. 또한 동일한 클래스의 서로 다른 객체가 상태도 동일한 경우, 이들 객체를 참조하는 핸들 변수들도 동일한 것으로 간주할 수 있습니다.

값 객체의 동일성

값 객체의 크기가 동일하고 객체에 담긴 값도 동일한지 확인하려면 isequal을 사용하십시오. 예를 들어, 앞에서 정의한 NumValue 클래스를 사용하여 두 인스턴스를 생성하고 서로 동일한지 테스트해 보겠습니다.

a = NumValue;
b = NumValue;
isequal(a,b)
ans =

     1

ab는 독립적이므로 둘은 별개의 객체입니다. 하지만 모두 동일한 값을 나타냅니다.

값 객체로 나타낸 값을 변경하면 객체가 더 이상 동일하지 않습니다.

a = NumValue;
b = NumValue;
b.Number = 7;
isequal(a,b)
ans =

     0

값 클래스에는 == 연산을 구현하는 디폴트 eq 메서드가 없습니다.

핸들 객체의 동일성

핸들 객체는 handle 기본 클래스에서 eq 메서드를 상속합니다. ==isequal을 사용하여 핸들 객체 간의 두 가지 서로 다른 관계를 테스트할 수 있습니다.

  • 핸들이 같은 객체를 참조합니다. 이 경우 ==isequaltrue를 반환합니다.

  • 핸들이 클래스가 동일하고 값도 동일하지만 서로 별개인 객체들을 참조합니다. 이 경우 isequaltrue를 반환합니다.

앞에서 정의한 NumHandle 클래스를 사용하여 객체를 생성하고 핸들을 복사합니다.

a = NumHandle;
b = a;

==isequal을 사용하여 동일성을 테스트합니다.

a == b
ans =

     1
isequal(a,b)
ans =

     1

디폴트 값을 사용하여 NumHandle 클래스의 두 인스턴스를 생성합니다.

a = NumHandle;
b = NumHandle;

ab가 동일한 객체를 참조하는지 확인합니다.

a == b
ans =

     0

ab가 동일한 값을 갖는지 확인합니다.

isequal(a,b)
ans =

     1

핸들 클래스에서 지원되는 기능

handle 클래스에서 파생된 클래스에서는 다음이 가능합니다.

핸들 클래스와 그 메서드에 대한 자세한 내용은 핸들 슈퍼클래스 항목을 참조하십시오.

관련 항목