핸들 객체 동작
둘 이상의 변수가 동일한 핸들 객체를 참조할 수 있습니다. 따라서 사용자는 값 클래스의 인스턴스와 다르게 핸들 클래스의 인스턴스와 상호 작용하게 됩니다. 핸들 객체가 어떻게 동작하는지를 이해하면 핸들 클래스를 구현해야 할지 아니면 값 클래스를 구현해야 할지 판단할 수 있습니다. 여기서는 이러한 상호 작용 중 몇 가지를 다룹니다.
핸들 클래스에 대한 자세한 내용은 핸들 클래스 항목을 참조하십시오.
핸들이란?
핸들은 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;
변수 gongSound
와 gongSound2
는 동일한 핸들의 복사본이므로 동일한 오디오 소스를 참조합니다. 두 변수 중 아무나 사용하여 audioplayer
정보에 액세스할 수 있습니다.
예를 들어, SampleRate
속성에 새 값을 할당하여 징 소리 오디오 소스에 대한 샘플 레이트를 설정해 보겠습니다. 먼저, 현재 샘플 레이트를 가져온 후 새 샘플 레이트를 설정합니다.
sr = gongSound.SampleRate; disp(sr)
8192
gongSound.SampleRate = sr*2;
gongSound2
를 사용하여 동일한 오디오 소스에 액세스할 수 있습니다.
disp(gongSound2.SampleRate)
16384
새 샘플 레이트로 징 소리를 재생합니다.
play(gongSound2)
함수에서 수정된 핸들 객체
인수를 함수에 전달하면 이 함수는 작업 공간의 변수를 복사하는데, 이 작업 공간의 변수는 함수의 작업 공간에 있는 파라미터 변수로 함수를 호출합니다.
핸들이 아닌 변수를 함수에 전달해도 호출자의 작업 공간에 있는 원래 변수에는 영향이 없습니다. 예를 들어, myFunc
는 var
이라는 지역 변수를 수정하지만, 함수가 종료되면 지역 변수 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')
변수가 유효한 핸들 객체인지 여부를 확인하려면 isa
와 isvalid
를 사용하십시오.
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
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