이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
둘 이상의 변수가 동일한 핸들 객체를 참조할 수 있습니다. 따라서 사용자는 값 클래스의 인스턴스와 다르게 핸들 클래스의 인스턴스와 상호 작용하게 됩니다. 핸들 객체가 어떻게 동작하는지를 이해하면 핸들 클래스를 구현해야 할지 아니면 값 클래스를 구현해야 할지 판단할 수 있습니다. 여기서는 이러한 상호 작용 중 몇 가지를 다룹니다.
핸들 클래스에 대한 자세한 내용은 핸들 클래스 항목을 참조하십시오.
핸들은 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
whos
명령은 gongSound
를 audioplayer
객체로 표시합니다.
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