Main Content

이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

콜백 간 데이터 공유하기

데이터 공유 방법에 대한 개요

대다수의 앱에는 상호 종속적인 컨트롤, 메뉴, 그래픽스 객체가 포함되어 있습니다. 콜백 함수마다 고유한 범위를 가지므로 앱의 구성요소가 데이터에 액세스해야 하는 경우에는 명시적으로 데이터를 공유해야 합니다. 아래 표에는 앱 내부에서 데이터를 공유할 수 있는 몇 가지 방법이 설명되어 있습니다.

방법설명요건 및 장단점
UserData 또는 다른 객체 속성에 데이터 저장하기

구성요소 객체를 통해 직접 속성값을 가져오거나 설정합니다.

모든 UI 구성요소에는 어떤 MATLAB® 데이터도 저장할 수 있는 UserData 속성이 있습니다.

  • 속성을 설정하거나 가져오려면 구성요소에 액세스할 수 있어야 합니다.

  • UserData에는 한 번에 하나의 변수만 저장할 수 있지만, struct 배열 또는 셀형 배열을 사용하면 여러 개의 값을 저장할 수 있습니다.

데이터를 응용 프로그램 데이터로 저장하기

setappdata 함수를 사용하여 데이터와 특정 구성요소를 연결합니다. getappdata 함수를 사용하여 나중에 데이터에 액세스할 수 있습니다.

  • 응용 프로그램 데이터를 설정하거나 가져오려면 구성요소에 액세스할 수 있어야 합니다.

  • 여러 개의 변수를 공유할 수 있습니다.

중첩된 콜백 함수 만들기

메인 함수 내에 콜백 함수를 중첩합니다. 이렇게 하면 메인 함수의 모든 변수에 콜백 함수가 액세스할 수 있습니다.

  • 메인 함수를 코딩한 동일 파일에서 콜백 함수를 코딩해야 합니다.

  • 여러 개의 변수를 공유할 수 있습니다.

guidata 함수를 사용하여 데이터 저장하기

guidata 함수를 사용하여 Figure 창과 데이터를 공유합니다.

  • UI 구성요소를 통해 데이터를 저장하거나 가져옵니다.

  • 한 번에 하나의 변수만 저장할 수 있지만, struct 배열 또는 셀형 배열을 사용하여 여러 개의 값을 저장할 수 있습니다.

UserData 또는 다른 객체 속성에 데이터 저장하기

UI 구성요소는 자신의 속성에 유용한 정보를 저장합니다. 예를 들어, Value 속성을 쿼리하여 슬라이더의 현재 위치를 찾을 수 있습니다. 또한 모든 구성요소에는 어떤 MATLAB 변수도 저장할 수 있는 UserData 속성이 있습니다. 구성요소에 대한 액세스가 허용되는 한, 모든 콜백 함수는 UserData 속성에 저장된 값에 액세스할 수 있습니다.

일반적인 Figure를 사용하여 만든 앱에서 사용자 데이터 공유하기

점 표기법을 사용하여 일반적인 Figure의 속성을 설정하고 쿼리합니다.

hfig = figure;
figname = hfig.Name;
hfig.Name = 'My Window';

코드가 구성요소에 직접 액세스할 수 없으면 findobj 함수를 사용하여 구성요소를 검색합니다. 검색에 성공하면 findobj는 해당 구성요소를 출력값으로 반환합니다. 그러면 구성요소의 속성에 액세스할 수 있습니다.

다음 앱 코드는 UserData 속성을 사용하여 슬라이더에 대한 정보를 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
hfig = figure();
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'UserData',struct('val',0,'diffMax',1),...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	sval = hObject.Value;
	diffMax = hObject.Max - sval;
	data = struct('val',sval,'diffMax',diffMax);
	hObject.UserData = data;
end

function button_callback(hObject,eventdata)
	h = findobj('Tag','slider1');
	data = h.UserData;
	display([data.val data.diffMax]);
end
사용자가 슬라이더를 이동하면 slider_callback은 다음 명령을 사용하여 구조체에 데이터를 저장합니다.

  • data = struct('val',sval,'diffMax',diffMax)는 값 svaldiffMaxdata 구조체에 저장합니다.

  • hObject.UserData = datadata의 값을 슬라이더의 UserData 속성에 저장합니다.

사용자가 누름 버튼을 클릭하면 button_callback은 다음 명령을 사용하여 데이터를 가져옵니다.

  • h = findobj('Tag','slider1')은 슬라이더 구성요소를 찾습니다.

  • data = h.UserData는 슬라이더의 UserData 속성값을 가져옵니다.

데이터를 응용 프로그램 데이터로 저장하기

응용 프로그램 데이터를 저장하려면 setappdata 함수를 호출하십시오.

setappdata(obj,name,value);
첫 번째 입력값 obj는 데이터가 저장될 구성요소 객체입니다. 두 번째 입력값 name은 값을 설명하는 이름입니다. 세 번째 입력값 value는 저장하려는 값입니다.

응용 프로그램 데이터를 가져오려면 getappdata 함수를 사용하십시오.

data = getappdata(obj,name);
구성요소 obj는 데이터가 포함된 구성요소 객체여야 합니다. 두 번째 입력값 name은 데이터를 저장하는 데 사용한 이름과 일치해야 합니다. 변수를 하나만 포함하는 UserData 속성과 달리, setappdata를 사용하면 여러 개의 변수를 저장할 수 있습니다.

응용 프로그램 데이터 공유하기

이 앱은 응용 프로그램 데이터를 사용하여 2개의 값을 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
hfig = figure();
setappdata(hfig,'slidervalue',0);
setappdata(hfig,'difference',1);

slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	diffMax = hObject.Max - hObject.Value;
	setappdata(hObject.Parent,'slidervalue',hObject.Value);
	setappdata(hObject.Parent,'difference',diffMax);
end

function button_callback(hObject,eventdata)
	currentval = getappdata(hObject.Parent,'slidervalue');
	diffval = getappdata(hObject.Parent,'difference');
	display([currentval diffval]);
end
사용자가 슬라이더를 이동하면 slider_callback 함수가 diffMax를 계산합니다. 그런 다음, 함수는 다음 명령을 사용하여 응용 프로그램 데이터를 수정합니다.

  • setappdata(hObject.Parent,'slidervalue',hObject.Value) - 이름 'slidervalue'를 사용하여 현재 슬라이더 값을 Figure에 저장합니다. 이 경우, hObject.Parent가 Figure입니다.

  • setappdata(parentfig,'difference',diffMax) - 이름 'difference'를 사용하여 diffMax를 Figure에 저장합니다.

사용자가 누름 버튼을 클릭하면 button_callback 함수는 다음 명령을 사용하여 데이터를 가져옵니다.

  • currentval = getappdata(hObject.Parent,'slidervalue') - Figure에서 현재 슬라이더 값을 가져옵니다. 이 경우, hObject.Parent가 Figure입니다.

  • diffval = getappdata(hObject.Parent,'difference') - Figure에서 차이 값을 가져옵니다.

중첩된 콜백 함수 만들기

프로그래밍 방식 앱의 메인 함수 내에서 콜백 함수를 중첩할 수 있습니다. 이렇게 하면 중첩된 콜백 함수는 메인 함수와 작업 공간을 공유합니다. 결과적으로 중첩 함수는 메인 함수에 정의된 모든 UI 구성요소와 변수에 액세스할 수 있습니다. 다음 예제 코드에서는 중첩 함수를 사용하여 슬라이더 위치에 대한 데이터를 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
	hfig = figure();
	data = struct('val',0,'diffMax',1);
	slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
	button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);

	function slider_callback(hObject,eventdata)
		sval = hObject.Value;
		diffMax = hObject.Max - sval;
		data.val = sval;
		data.diffMax = diffMax;
	end

	function button_callback(hObject,eventdata)
		display([data.val data.diffMax]);
	end
end
메인 함수는 data라는 struct 배열을 정의합니다. 사용자가 슬라이더를 이동하면 slider_callback 함수는 data 구조체의 val 필드와 diffMax 필드를 업데이트합니다. 최종 사용자가 누름 버튼을 클릭하면 button_callback 함수는 data에 저장된 값을 표시합니다.

guidata 함수를 사용하여 데이터 저장하기

guidata 함수를 사용하면 Figure 창과 데이터를 공유할 수 있습니다. hObject 구성요소를 통해 어떤 콜백에서도 데이터를 저장하거나 가져올 수 있습니다. 다시 말해, UserData나 응용 프로그램 데이터와는 달리 데이터를 설정하거나 가져오기 위해 특정 구성요소에 액세스할 필요가 없다는 의미입니다. 2개의 입력 인수와 함께 guidata를 호출하여 데이터를 저장합니다.

guidata(object_handle,data);
첫 번째 입력값 object_handle은 UI 구성요소입니다(일반적으로 hObject). 두 번째 입력값 data는 저장할 변수입니다. 2개의 입력 인수를 사용하여 guidata를 호출할 때마다 MATLAB은 이전에 저장된 모든 데이터를 덮어씁니다. 즉, 한 번에 하나의 변수만 저장할 수 있습니다. 여러 개의 값을 공유하려면 데이터를 struct 배열 또는 셀형 배열로 저장합니다.

데이터를 가져오려면 입력 인수 하나와 출력 인수 하나를 사용하여 guidata를 호출하십시오.

data = guidata(object_handle);
데이터를 저장하기 위해 지정하는 구성요소는 데이터를 가져오기 위해 사용하는 구성요소와 동일하지 않아도 됩니다.

데이터가 struct 배열 또는 셀형 배열로 저장된 경우에 다른 요소를 변경하지 않고 하나의 요소만 업데이트하려면 데이터를 가져와 수정된 배열로 바꾸십시오.

data = guidata(hObject);
data.myvalue = 2;
guidata(hObject,data);

guidata를 사용하여 데이터를 저장하고 공유하기

프로그래밍 방식 앱에서 guidata를 사용하려면 메인 함수에서 일부 초기값을 사용하여 데이터를 저장하십시오. 그러면 모든 콜백 함수에서 데이터를 가져와 수정할 수 있습니다.

다음 코드는 프로그래밍 방식 앱에 대한 간단한 예제입니다. 이 앱에서는 guidata를 사용하여 2개의 필드가 포함된 구조체를 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
hfig = figure();
guidata(hfig,struct('val',0,'diffMax',1));
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	data = guidata(hObject);
	data.val = hObject.Value;
	data.diffMax = hObject.Max - data.val;
	guidata(hObject,data);
end

function button_callback(hObject,eventdata)
	data = guidata(hObject);
	display([data.val data.diffMax]);
end
사용자가 슬라이더를 이동하면 slider_callback 함수는 다음 명령을 실행하여 저장된 데이터를 가져온 후 수정합니다.

  • data = guidata(hObject)는 저장된 데이터를 구조체로 가져옵니다.

  • data.diffMax = maxval - data.val은 구조체의 diffMax 필드를 수정합니다.

  • guidata(hObject,data)는 수정된 구조체를 저장합니다.

사용자가 누름 버튼을 클릭하면 button_callback 함수는 guidata를 호출하여 저장된 구조체의 복사본을 가져옵니다. 그런 다음, 구조체에 저장된 2개의 값을 표시합니다.

관련 항목