GUIDE에서 콜백 작성하기
참고
GUIDE 환경은 향후 릴리스에서 제거될 예정입니다. GUIDE가 제거된 후에도 기존 GUIDE 앱은 MATLAB®에서 계속 실행할 수 있지만 GUIDE에서 편집할 수는 없게 됩니다.
기존의 GUIDE 앱을 계속 편집하려면 GUIDE 마이그레이션 전략 항목에서 향후 MATLAB 릴리스와의 앱 호환성을 유지하는 방법에 대한 내용을 참고하십시오. 대화형 방식으로 새 앱을 만들려면 앱 디자이너를 사용하여 앱 개발하기 항목을 대신 참조하십시오.
여러 사용자 동작에 대한 콜백
UI 컴포넌트와 그래픽스 컴포넌트에는 특정 콜백 함수에 연결할 수 있는 속성이 있습니다. 각 속성은 특정 사용자 동작에 해당합니다. 예를 들어, uicontrol에는 Callback
속성이 있습니다. 이 속성의 값을 콜백 함수에 대한 핸들, 익명 함수 또는 MATLAB 표현식이 포함된 문자형 벡터로 설정할 수 있습니다. 이 속성을 설정하면 사용자가 uicontrol과 상호 작용할 때 앱이 응답하게 됩니다. Callback
속성에 값을 지정하지 않으면 사용자가 uicontrol과 상호 작용할 때 어떤 동작도 일어나지 않습니다.
다음 표에는 사용할 수 있는 콜백 속성, 콜백 함수를 트리거하는 사용자 동작, 콜백 속성을 사용하는 가장 일반적인 UI 컴포넌트와 그래픽스 컴포넌트가 나열되어 있습니다.
콜백 속성 | 사용자 동작 | 이 속성을 사용하는 컴포넌트 |
---|---|---|
ButtonDownFcn | 포인터가 컴포넌트 또는 Figure 위에 있을 때 최종 사용자가 마우스 버튼을 누릅니다. | |
Callback | 최종 사용자가 컴포넌트를 트리거합니다. 예를 들어, 메뉴 항목 선택, 슬라이더 이동, 누름 버튼 누르기 등이 이에 해당합니다. | |
CellEditCallback | 셀을 편집할 수 있는 테이블에서 최종 사용자가 값을 편집합니다. | |
CellSelectionCallback | 최종 사용자가 테이블에서 셀을 선택합니다. | |
ClickedCallback | 최종 사용자가 푸시 툴 또는 토글 툴을 마우스 왼쪽 버튼으로 클릭합니다. | |
CloseRequestFcn | Figure가 닫힙니다. | |
CreateFcn | MATLAB이 객체를 만들면 이 객체가 표시되기 전에 콜백이 실행됩니다. |
|
DeleteFcn | MATLAB이 Figure를 삭제하기 직전에 콜백이 실행됩니다. |
|
KeyPressFcn | 포인터가 객체 위에 있을 때 최종 사용자가 키보드 키를 누릅니다. | |
| 포인터가 객체 위에 있을 때 최종 사용자가 키보드 키를 놓습니다. | |
OffCallback | 토글 툴의 | |
OnCallback | 토글 툴의 | |
| 최종 사용자가 | |
SelectionChangedFcn | 최종 사용자가 버튼 그룹 내에서 여러 라디오 버튼 또는 토글 버튼을 선택합니다. | |
WindowButtonDownFcn | 포인터가 Figure 창에 있을 때 최종 사용자가 마우스 버튼을 누릅니다. | |
WindowButtonMotionFcn | 최종 사용자가 Figure 창 내에서 포인터를 이동합니다. | |
WindowButtonUpFcn | 최종 사용자가 마우스 버튼을 놓습니다. | |
WindowKeyPressFcn | 포인터가 Figure 또는 Figure의 자식 객체 위에 있을 때 최종 사용자가 키를 누릅니다. | |
WindowKeyReleaseFcn | 포인터가 Figure 또는 Figure의 자식 객체 위에 있을 때 최종 사용자가 키를 놓습니다. | |
| 포인터가 Figure 위에 있을 때 최종 사용자가 마우스 휠을 돌립니다. |
GUIDE로 생성한 콜백 함수와 속성값
GUIDE에서 콜백 함수와 속성을 관리하는 방법
uicontrol
컴포넌트, uimenu
컴포넌트 또는 uicontextmenu
컴포넌트를 UI에 추가하면 UI를 저장하기 전에 GUIDE가 Callback
속성을 값 %automatic
으로 채웁니다. 이 값은 GUIDE가 콜백 함수의 이름을 생성한다는 것을 나타냅니다.
UI를 저장하면 GUIDE는 코드 파일에 빈 콜백 함수 정의를 추가하고 컨트롤의 Callback
속성을 익명 함수로 설정합니다. 다음 함수 정의는 GUIDE로 생성한, 누름 버튼에 대한 콜백 함수의 예입니다.
function pushbutton1_Callback(hObject,eventdata,handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) end
myui
로 이 UI를 저장하면 GUIDE는 누름 버튼의 Callback
속성을 다음 값으로 설정합니다.@(hObject,eventdata)myui('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
pushbutton1_Callback
에 대한 참조 역할을 하는 익명 함수입니다. 이 익명 함수에는 4개의 입력 인수가 있습니다. 첫 번째 인수는 콜백 함수의 이름입니다. 나머지 3개 인수는 MATLAB에서 제공되며 섹션 GUIDE 콜백 구문에서 다룹니다.참고
GUIDE는 테이블, 패널, 버튼 그룹과 같은 기타 UI 컴포넌트에 대해서는 콜백 함수를 자동으로 생성하지 않습니다. 이러한 컴포넌트에서 콜백 함수를 실행하도록 하려면 레이아웃에서 컴포넌트를 마우스 오른쪽 버튼으로 클릭하고 상황별 메뉴의 콜백 보기 아래에서 항목을 선택하여 콜백을 만들어야 합니다.
GUIDE 콜백 구문
모든 콜백은 최소 3개 이상의 입력 인수를 받아야 합니다.
hObject
— 콜백을 트리거하는 UI 컴포넌트입니다.eventdata
— 특정 마우스 동작 또는 키보드 동작에 대한 자세한 정보가 포함된 변수입니다.handles
— UI의 모든 객체가 포함된struct
입니다. GUIDE는guidata
함수를 사용하여 이 구조체를 저장하고 관리합니다.
콜백 함수가 추가 인수를 받을 수 있도록 하려면 함수 정의에서 인수 목록 끝에 추가 인수를 포함시켜야 합니다.
eventdata 인수
eventdata
인수는 특정 콜백 함수에 자세한 정보를 제공합니다. 예를 들어, 최종 사용자가 KeyPressFcn
을 트리거하면 MATLAB은 최종 사용자가 누른 특정 키 또는 키 조합에 관한 정보를 제공합니다. eventdata
를 콜백 함수에서 사용할 수 없으면 MATLAB은 이 인수를 빈 배열로 전달합니다. 다음 표에는 eventdata
를 사용하는 콜백과 컴포넌트가 나열되어 있습니다.
콜백 속성 이름 | 컴포넌트 |
---|---|
WindowKeyPressFcn WindowKeyReleaseFcn WindowScrollWheel | figure |
KeyPressFcn | figure , uicontrol , uitable |
KeyReleaseFcn | figure , uicontrol , uitable |
SelectionChangedFcn | uibuttongroup |
CellEditCallback CellSelectionCallback | uitable |
GUIDE 콜백 간 데이터 공유하기
상호 종속적인 컨트롤, 메뉴, 그래픽스 객체를 앱에 만들려면 그러한 컴포넌트에 액세스할 필요가 있는 앱의 특정 부분들과 반드시 명시적으로 데이터를 공유해야 합니다.
방법 | 설명 | 요건 및 장단점 |
---|---|---|
UserData 사용하기 | 컴포넌트 객체를 통해 직접 속성값을 가져오거나 설정합니다. 모든 UI 컴포넌트에는 어떤 MATLAB 데이터도 저장할 수 있는 |
|
애플리케이션 데이터 공유하기 |
|
|
guidata 사용하기 |
|
|
GUIDE 앱에서 UserData 공유하기
UI 컴포넌트는 자신의 속성에 유용한 정보를 저장합니다. 예를 들어, Value
속성을 쿼리하여 슬라이더의 현재 위치를 찾을 수 있습니다. 또한 모든 컴포넌트에는 어떤 MATLAB 변수도 저장할 수 있는 UserData
속성이 있습니다. 컴포넌트에 대한 액세스가 허용되는 한, 모든 콜백 함수는 UserData
속성에 저장된 값에 액세스할 수 있습니다.
GUIDE 앱이 UserData
속성과 슬라이더 데이터를 공유하도록 설정하려면 다음 단계를 수행하십시오.
명령 창에
guide
를 입력하여 빈 GUI를 새로 엽니다.컴포넌트 팔레트에 UI 컴포넌트 이름을 표시합니다.
파일 > 기본 설정 > GUIDE를 선택합니다.
컴포넌트 팔레트에 이름 표시를 선택합니다.
확인을 클릭합니다.
레이아웃 편집기 왼쪽의 컴포넌트 팔레트에서 누름 버튼 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.
레이아웃 편집기 왼쪽의 컴포넌트 팔레트에서 슬라이더 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.
파일 > 저장을 선택합니다. UI를
myslider.fig
로 저장합니다. 그러면 MATLAB이 편집기에서 코드 파일을 엽니다.개시 함수
myslider_OpeningFcn
에서UserData
속성의 초기값을 설정합니다. 이 함수는 UI가 사용자에게 표시되기 직전에 실행됩니다.myslider_OpeningFcn
에서 명령handles.output = hObject
바로 아래에 다음 명령을 삽입합니다.이 명령을 추가하면data = struct('val',0,'diffMax',1); set(handles.slider1,'UserData',data);
myslider_OpeningFcn
은 다음과 같이 표시됩니다.function myslider_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to junk (see VARARGIN) % Choose default command line output for myslider handles.output = hObject; data = struct('val',0,'diffMax',1); set(handles.slider1,'UserData',data); % Update handles structure guidata(hObject, handles); % UIWAIT makes myslider wait for user response % uiwait(handles.figure1);
handles
가myslider_OpeningFcn
에 대한 입력 인수라는 것을 알 수 있습니다.handles
변수는 UI의 모든 컴포넌트가 포함된 구조체입니다. 이 구조체의 각 필드는 개별 컴포넌트에 해당합니다. 각 필드 이름은 해당 컴포넌트의Tag
속성과 일치합니다. 따라서handles.slider1
은 이 UI의 슬라이더 컴포넌트입니다. 명령set(handles.slider1,'UserData',data)
는 변수data
를 슬라이더의UserData
속성에 저장합니다.데이터를 수정하려면 슬라이더 콜백에 코드를 추가합니다. 함수
slider1_Callback
의 끝에 다음 명령을 추가합니다.이 명령을 추가하면maxval = get(hObject,'Max'); sval = get(hObject,'Value'); diffMax = maxval - sval; data = get(hObject,'UserData'); data.val = sval; data.diffMax = diffMax; % Store data in UserData of slider set(hObject,'UserData',data);
slider1_Callback
은 다음과 같이 표시됩니다.% --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider maxval = get(hObject,'Max'); sval = get(hObject,'Value'); diffMax = maxval - sval; data = get(hObject,'UserData'); data.val = sval; data.diffMax = diffMax; % Store data in UserData of slider set(hObject,'UserData',data);
hObject
가slider1_Callback
함수에 대한 입력 인수라는 것을 알 수 있습니다.hObject
는 항상 콜백을 트리거하는 컴포넌트입니다(이 경우에는 슬라이더). 따라서set(hObject,'UserData',data)
는data
변수를 슬라이더의UserData
속성에 저장합니다.데이터를 가져오려면 누름 버튼 콜백에 코드를 추가합니다. 함수
pushbutton1_Callback
의 끝에 다음 명령을 추가합니다.이 명령을 추가하면% Get UserData from the slider data = get(handles.slider1,'UserData'); currentval = data.val; diffval = data.diffMax; display([currentval diffval]);
pushbutton1_Callback
은 다음과 같이 표시됩니다.% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get UserData from the slider data = get(handles.slider1,'UserData'); currentval = data.val; diffval = data.diffMax; display([currentval diffval]);
이 코드는 핸들 구조체를 사용하여 슬라이더에 액세스합니다. 명령
data = get(handles.slider1,'UserData')
가 슬라이더의UserData
속성을 가져옵니다. 그런 다음,display
함수가 저장된 값을 표시합니다.편집기 툴스트립에서 저장을 눌러 코드를 저장합니다.
GUIDE 앱에서 애플리케이션 데이터 공유하기
애플리케이션 데이터를 저장하려면 setappdata
함수를 호출하십시오.
setappdata(obj,name,value);
obj
는 데이터가 저장될 컴포넌트 객체입니다. 두 번째 입력값 name
은 값을 설명하는 이름입니다. 세 번째 입력값 value
는 저장하려는 값입니다.애플리케이션 데이터를 가져오려면 getappdata
함수를 사용하십시오.
data = getappdata(obj,name);
obj
는 데이터가 포함된 컴포넌트 객체여야 합니다. 두 번째 입력값 name
은 데이터를 저장하는 데 사용한 이름과 일치해야 합니다. 변수를 하나만 포함하는 UserData
속성과 달리, setappdata
를 사용하면 여러 개의 변수를 저장할 수 있습니다.GUIDE 앱이 애플리케이션 데이터를 공유하도록 설정하려면 다음 단계를 수행하십시오.
명령 창에
guide
를 입력하여 빈 GUI를 새로 엽니다.컴포넌트 팔레트에 UI 컴포넌트 이름을 표시합니다.
파일 > 기본 설정 > GUIDE를 선택합니다.
컴포넌트 팔레트에 이름 표시를 선택합니다.
확인을 클릭합니다.
레이아웃 편집기 왼쪽의 컴포넌트 팔레트에서 누름 버튼 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.
레이아웃 편집기 왼쪽의 컴포넌트 팔레트에서 슬라이더 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.
파일 > 저장을 선택합니다. UI를
myslider.fig
로 저장합니다. 그러면 MATLAB이 편집기에서 코드 파일을 엽니다.개시 함수
myslider_OpeningFcn
에서 애플리케이션 데이터의 초기값을 설정합니다. 이 함수는 UI가 사용자에게 표시되기 직전에 실행됩니다.myslider_OpeningFcn
에서 명령handles.output = hObject
바로 아래에 다음 명령을 삽입합니다.이 명령을 추가하면setappdata(handles.figure1,'slidervalue',0); setappdata(handles.figure1,'difference',1);
myslider_OpeningFcn
은 다음과 같이 표시됩니다.function myslider_OpeningFcn(hObject,eventdata,handles,varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to junk (see VARARGIN) % Choose default command line output for junk handles.output = hObject; setappdata(handles.figure1,'slidervalue',0); setappdata(handles.figure1,'difference',1); % Update handles structure guidata(hObject, handles); % UIWAIT makes junk wait for user response (see UIRESUME) % uiwait(handles.figure1);
handles
가myslider_OpeningFcn
에 대한 입력 인수라는 것을 알 수 있습니다.handles
변수는 UI의 모든 컴포넌트가 포함된 구조체입니다. 이 구조체의 각 필드는 개별 컴포넌트에 해당합니다. 각 필드 이름은 해당 컴포넌트의Tag
속성과 일치합니다. 이 경우,handles.figure1
은 Figure 객체입니다. 따라서setappdata
는 이 Figure 객체를 사용하여 데이터를 저장합니다.데이터를 변경하려면 슬라이더 콜백에 코드를 추가합니다. 함수
slider1_Callback
의 끝에 다음 명령을 추가합니다.이 명령을 추가하면maxval = get(hObject,'Max'); currval = get(hObject,'Value'); diffMax = maxval - currval; % Store application data setappdata(handles.figure1,'slidervalue',currval); setappdata(handles.figure1,'difference',diffMax);
slider1_Callback
은 다음과 같이 표시됩니다.이 콜백 함수는function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider maxval = get(hObject,'Max'); currval = get(hObject,'Value'); diffMax = maxval - currval; % Store application data setappdata(handles.figure1,'slidervalue',currval); setappdata(handles.figure1,'difference',diffMax);
handles
구조체에 액세스할 수 있기 때문에setappdata
명령은handles.figure1
에 데이터를 저장합니다.데이터를 가져오려면 누름 버튼 콜백에 코드를 추가합니다. 함수
pushbutton1_Callback
의 끝에 다음 명령을 추가합니다.이 명령을 추가하면% Retrieve application data currentval = getappdata(handles.figure1,'slidervalue'); diffval = getappdata(handles.figure1,'difference'); display([currentval diffval]);
pushbutton1_Callback
은 다음과 같이 표시됩니다.이 콜백 함수는% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Retrieve application data currentval = getappdata(handles.figure1,'slidervalue'); diffval = getappdata(handles.figure1,'difference'); display([currentval diffval]);
handles
구조체에 액세스할 수 있기 때문에getappdata
명령은handles.figure1
에서 데이터를 가져옵니다.편집기 툴스트립에서 저장을 눌러 코드를 저장합니다.
guidata
를 사용하여 GUIDE 앱에 데이터를 저장하고 공유하기
GUIDE는 guidata
함수를 사용하여 모든 UI 컴포넌트가 포함된 handles
구조체를 저장합니다. 그러면 MATLAB은 handles
배열을 모든 콜백 함수에 전달합니다. guidata
를 사용하여 추가 데이터를 공유하려면 개시 함수에서 handles
구조체에 필드를 추가합니다. 개시 함수는 코드 파일 상단에 정의되어 있는 함수로, 이름에 _OpeningFcn
이 포함되어 있습니다.
콜백 함수에서 데이터를 수정하려면 handles
구조체를 수정한 다음, guidata
함수를 사용하여 저장하십시오. 다음 슬라이더 콜백 함수에서는 GUIDE 콜백 함수에서 handles
구조체를 수정하여 저장하는 방법을 보여줍니다.
function slider1_Callback(hObject, eventdata,handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range handles.myvalue = 2; guidata(hObject,handles); end
GUIDE 예제: guidata를 사용하여 슬라이더 데이터 공유하기
다음은 사전 작성된 GUIDE 앱으로, guidata
함수를 사용하여 슬라이더와 텍스트 필드 간에 데이터를 공유합니다. 슬라이더를 이동하면, 텍스트 필드에 표시된 숫자가 새로운 슬라이더 위치에 맞게 변경되어 표시됩니다.
GUIDE 예제: 2개의 앱 간에 데이터 공유하기
다음은 사전 작성된 GUIDE 앱으로, 애플리케이션 데이터와 guidata
함수를 사용하여 두 대화 상자 간에 데이터를 공유합니다. 두 번째 대화 상자에 텍스트를 입력하고 OK를 클릭하면 첫 번째 대화 상자에서 버튼 레이블이 변경됩니다.
changeme_main.m
에서 buttonChangeMe_Callback
함수는 다음 명령을 실행하여 두 번째 대화 상자를 표시합니다.
changeme_dialog('changeme_main', handles.figure)
handles.figure
입력 인수는 changeme_main 대화 상자의 Figure
객체입니다.
changeme_dialog
함수는 Figure
객체에서 handles
구조체를 가져옵니다. 따라서 changeme_main 대화 상자의 전체 컴포넌트 집합을 두 번째 대화 상자에서 사용할 수 있습니다.
GUIDE 예제: 3개의 앱 간에 데이터 공유하기
다음은 사전 작성된 GUIDE 앱으로, guidata
와 UserData
를 사용하여 3개의 앱 창 간에 데이터를 공유합니다. 큰 창은 아이콘 편집기이며, 툴 팔레트 창과 색 팔레트 창에서 정보를 받습니다.
guide_inconeditor.m
에서 함수 guide_iconeditor_OpeningFcn
에는 다음 명령이 포함됩니다.
colorPalette = guide_colorpalette('iconEditor', hObject)
인수는 다음과 같습니다.
'iconEditor'
는 guide_iconEditor 창의 콜백이 함수 실행을 트리거했음을 지정합니다.hObject
는 guide_iconEditor 창의Figure
객체입니다.colorPalette
는 guide_colorPalette 창의Figure
객체입니다.
guide_iconeditor_OpeningFcn
도 유사한 입력 인수와 출력 인수로 guide_toolpalette
함수를 호출합니다.
이러한 함수 간에 Figure
객체를 전달하면 guide_iconEditor 창에서 다른 두 창의 handles
구조체에 액세스할 수 있습니다. 마찬가지로, 다른 두 창에서도 guide_iconEditor 창의 handles
구조체에 액세스할 수 있습니다.
GUIDE로 생성한 콜백 이름 바꾸기 및 제거하기
콜백 이름 바꾸기
GUIDE는 컴포넌트의 Tag
속성과 콜백 속성 이름을 결합하여 콜백 함수의 이름을 만듭니다. 컴포넌트의 Tag
값을 변경하면 다음에 UI를 저장할 때 GUIDE가 콜백 이름을 변경합니다.
UI를 저장한 후 Tag
값을 변경하면 GUIDE는 모든 컴포넌트가 고유한 Tag
값을 갖는다고 가정하고 다음 항목을 업데이트합니다.
컴포넌트의 콜백 함수 정의
컴포넌트의 콜백 속성값
handles
구조체의 해당 필드에 대한 코드 파일의 참조
컴포넌트의 Tag
속성을 변경하지 않고 콜백 함수 이름을 바꾸려면 다음 단계를 수행하십시오.
콜백 함수 정의에서 이름을 변경합니다.
익명 함수로 전달되는 첫 번째 인수를 변경하여 컴포넌트의 콜백 속성을 업데이트합니다. 예를 들어, 누름 버튼의 원래 콜백 속성은 다음과 같이 표시될 수 있습니다.
@(hObject,eventdata)myui('pushbutton1_Callback',... hObject,eventdata,guidata(hObject))
이 예제에서는
'pushbutton1_Callback'
을 새 함수 이름으로 변경해야 합니다.코드 파일에서 기존 함수 이름에 대한 다른 모든 참조를 새 함수 이름에 대한 것으로 변경합니다.
콜백 삭제하기
최종 사용자가 특정 동작을 수행할 때 실행되는 함수를 제거하거나 변경하려면 콜백 함수를 삭제하면 됩니다. 콜백 함수를 삭제하려면 다음 단계를 수행하십시오.
코드에서 콜백 함수를 참조하는 모든 인스턴스를 검색하여 바꿉니다.
GUIDE에서 UI를 열고 속성 인스펙터에서 콜백 함수를 참조하는 모든 인스턴스를 바꿉니다.
콜백 함수를 삭제합니다.