Main Content

핸들 객체 동작

둘 이상의 변수가 동일한 핸들 객체를 참조할 수 있습니다. 따라서 사용자는 값 클래스의 인스턴스와 다르게 핸들 클래스의 인스턴스와 상호 작용하게 됩니다. 핸들 객체가 어떻게 동작하는지를 이해하면 핸들 클래스를 구현해야 할지 아니면 값 클래스를 구현해야 할지 판단할 수 있습니다. 여기서는 이러한 상호 작용 중 몇 가지를 다룹니다.

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

핸들이란?

핸들은 MATLAB® 객체의 특정한 종류입니다. 변수가 핸들을 유지하는 경우, 실제로는 객체에 대한 참조 상태를 유지하는 것입니다.

핸들 객체를 사용하면 둘 이상의 변수가 동일한 객체를 참조할 수 있습니다. 핸들 객체의 동작은 핸들 객체를 복사하고 핸들 객체를 함수에 전달할 때 발생하는 결과에 영향을 미칩니다.

핸들의 복사본

핸들 객체 변수의 모든 복사본은 동일한 기본 객체를 참조합니다. 이 참조 동작은 h가 핸들 객체를 식별하는 경우,

h2 = h;

위의 명령은 h와 동일한 객체를 참조하는 또 다른 변수 h2를 생성한다는 것을 의미합니다.

예를 들어, MATLAB audioplayer 함수는 특정 소리 부분을 재생하는 오디오 소스 데이터를 포함하는 핸들 객체를 생성합니다. audioplayer 함수에서 반환된 변수는 오디오 데이터를 식별하여 사용자가 오디오를 재생할 수 있도록 객체 함수에 액세스할 수 있게 해줍니다.

MATLAB에는 audioplayer 객체를 생성할 수 있도록 불러오고 사용할 수 있는 오디오 데이터가 포함되어 있습니다. 다음 오디오 데이터 예제는 오디오 플레이어를 생성하고 오디오를 재생합니다.

load gong Fs y
gongSound = audioplayer(y,Fs);
play(gongSound)

gongSound 객체 핸들을 다른 변수(gongSound2)에 복사한다고 가정하겠습니다.

gongSound2 = gongSound;

변수 gongSoundgongSound2는 동일한 핸들의 복사본이므로 동일한 오디오 소스를 참조합니다. 두 변수 중 아무나 사용하여 audioplayer 정보에 액세스할 수 있습니다.

예를 들어, SampleRate 속성에 새 값을 할당하여 징 소리 오디오 소스에 대한 샘플 레이트를 설정해 보겠습니다. 먼저, 현재 샘플 레이트를 가져온 후 새 샘플 레이트를 설정합니다.

sr = gongSound.SampleRate;
disp(sr)
8192
gongSound.SampleRate = sr*2;

gongSound2를 사용하여 동일한 오디오 소스에 액세스할 수 있습니다.

disp(gongSound2.SampleRate)
16384

새 샘플 레이트로 징 소리를 재생합니다.

play(gongSound2)

함수에서 수정된 핸들 객체

인수를 함수에 전달하면 이 함수는 작업 공간의 변수를 복사하는데, 이 작업 공간의 변수는 함수의 작업 공간에 있는 파라미터 변수로 함수를 호출합니다.

핸들이 아닌 변수를 함수에 전달해도 호출자의 작업 공간에 있는 원래 변수에는 영향이 없습니다. 예를 들어, myFuncvar이라는 지역 변수를 수정하지만, 함수가 종료되면 지역 변수 var이 더 이상 존재하지 않게 됩니다.

function myFunc(var)
   var = var + 1;
end

변수를 정의하고 myfunc에 전달합니다.

x = 12;
myFunc(x)

myFunc(x)를 실행한 후에도 x의 값은 변경되지 않습니다.

disp(x)
12

myFunc 함수는 수정된 값을 반환할 수 있으며, 수정된 값은 동일한 변수 이름(x)이나 다른 변수에 할당할 수 있습니다.

function out = myFunc(var)
   out = var + 1;
end

myfunc에서 값을 수정합니다.

x = 12;
x = myFunc(x);
disp(x)
13

인수가 핸들 변수이면 함수는 핸들로 식별된 객체 대신 핸들만 복사합니다. 두 핸들 모두(원본 및 로컬 복사본) 동일한 객체를 참조합니다.

함수가 객체 핸들이 참조하는 데이터를 수정하면, 수정된 객체를 반환하지 않고도 호출하는 작업 공간의 핸들 변수에서 수정 내용에 액세스할 수 있습니다.

예를 들어, modifySampleRate 함수는 audioplayer의 샘플 레이트를 변경합니다.

function modifySampleRate(audioObj,sr)
   audioObj.SampleRate = sr;
end

audioplayer 객체를 생성하고 modifySampleRate 함수에 전달합니다.

load gong Fs y
gongSound = audioplayer(y,Fs);
disp(gongSound.SampleRate)
8192
modifySampleRate(gongSound,16384)
disp(gongSound.SampleRate)
16384

audioplayer 객체가 핸들 객체이기 때문에 modifySampleRate 함수가 수정된 gongSound 객체를 반환할 필요가 없습니다.

객체가 핸들인지 여부 확인하기

핸들 객체는 handle 클래스의 멤버입니다. 따라서 항상 isa 함수를 사용하여 객체를 핸들로 식별할 수 있습니다. isa는 핸들 변수 여부를 테스트할 때 논리값 true(1)를 반환합니다.

load gong Fs y
gongSound = audioplayer(y,Fs);
isa(gongSound,'handle')

변수가 유효한 핸들 객체인지 여부를 확인하려면 isaisvalid를 사용하십시오.

if isa(gongSound,'handle') && isvalid(gongSound)
   ...
end

삭제된 핸들 객체

핸들 객체가 삭제되었어도 이 객체를 참조한 핸들 변수는 계속 존재할 수 있습니다. 이 변수가 참조한 객체가 더 이상 존재하지 않기 때문에 이 변수는 유효하지 않게 됩니다. 객체에 대해 delete를 호출하면 객체가 제거되지만 핸들 변수는 지워지지 않습니다.

예를 들어, audioplayer 객체를 생성해 보겠습니다.

load gong Fs y
gongSound = audioplayer(y,Fs);

출력 인수 gongSound는 핸들 변수입니다. delete를 호출하면 객체 및 객체가 포함하는 오디오 소스 정보가 모두 삭제됩니다.

delete(gongSound)

하지만 핸들 변수는 계속 존재하게 됩니다.

disp(gongSound)
handle to deleted audioplayer

whos 명령은 gongSoundaudioplayer 객체로 표시합니다.

whos
  Name               Size             Bytes  Class          Attributes

  Fs                 1x1                  8  double                   
  gongSound          1x1                  0  audioplayer              
  y              42028x1             336224  double      

참고

많은 변수가 동일한 데이터를 참조할 수 있으므로 whos 명령에서 반환된 Bytes의 값은 핸들이 참조하는 데이터를 포함하지 않습니다.

isvalid 핸들 메서드로 보여지는 바와 같이 핸들 gongSound는 더 이상 유효한 객체를 참조하지 않습니다.

isvalid(gongSound)
ans =

  logical

   0

삭제된 핸들에 대해 delete를 호출해도 아무런 작업이 수행되지 않고 오류가 발생하지 않습니다. 유효한 핸들과 유효하지 않은 핸들을 모두 포함하는 배열을 delete에 전달할 수 있습니다. MATLAB은 유효한 핸들은 삭제하지만 이미 유효하지 않은 핸들이 나타나도 오류를 발생시키지 않습니다.

유효하지 않은 핸들 변수를 사용해서는 속성에 액세스할 수 없습니다.

gongSound.SampleRate
Invalid or deleted object.

객체 속성에 액세스하는 함수와 메서드는 오류를 일으킵니다.

play(gongSound)
Invalid or deleted object.

변수 gongSound를 제거하려면 clear를 사용하십시오.

clear gongSound
whos
  Name          Size             Bytes  Class     Attributes

  Fs            1x1                  8  double              
  y         42028x1             336224  double   

관련 항목