[ 파이썬 언어 공부 ] 콜백 함수란, 콜백 함수 사용 예 - Whitmem
[ 파이썬 언어 공부 ] 콜백 함수란, 콜백 함수 사용 예
Python Programming
2023-08-04 11:45 게시 1bf1967f823c80f4fd3f

3
0
269
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이 게시물에서는 콜백 함수의 활용 예시에 대해서 설명합니다. 콜백 함수를 사용함으로써 보다 융통성있고 유지보수가 용이한 소프트웨어를 개발할 수 있습니다. 내부의 정적인 함수 또는 작업들을 외부에서 전달받아 처리하거나 전달하여 처리함으로써 기능을 필요에 따라 유연하게 변경하거나 적용할 수 있답니다.
사용 예
기본적인 콜백 함수는 완전한 기능 처리에 대해 부속 기능을 부가적으로 처리할 때 사용합니다. 예를 들어, 파일을 작성하고, 작성한 퍼센트 (정도)를 실시간으로 출력 해주는 함수가 있다고 가정합니다.
파일을 작성하는 함수
위 코드에서는 process()를 수행하면, 0.5초 간격으로 data안에 있는 글자들을 file이라는 파일 IO에 작성합니다. 이 코드는 아무런 출력 작업도 진행하지 않기에, 언제 끝났는지 알 수 없지요. process()를 수행하고, 그저 기다리기만 해야 합니다.
현재 진행 상황을 출력하는 메소드
이번에는 각 for문을 순회할 때 현재 진행 상황을 출력하도록 몇 가지 구문을 추가하였습니다. for문을 돌 때 마다, 현재 for문이 몇 번째 진행되고 있는지, 이 for문은 최대 _max 번 진행된다는 사실을알려주어 사용자에게 얼마나 진행되었는지 피드백을 해 주고 있습니다.
현재 진행 상황 출력
그런데, 여기서 한번 생각 해봅시다. 현재 진행 상태를 출력 해 주기 위해서 print(nowValue,"/",_max)를 해 주고 있습니다. 어떻게 보면 먼 미래, 이러한 출력 방식을 바꿀 수도 있고, 필요에 따라 콘솔 창에 출력하는 것이 아닌 다른 공간에 넘겨야 할 수도 있습니다.
print를 GUI, 네트워크 등 다른 방법으로 변경을 원할 때, process()함수의 내부를 변경해야 하는 상황이 발생합니다. 소스코드가 쌓이고 쌓여서, 10여개의 파일을 이루고, 여러개의 클래스를 구성하는 상황에서는 기능을 직접 수정하는 건 이상적이지 않습니다.
또한 상황에 따라, 출력이 필요한 경우도 있고 출력 형식을 바꿔야 할 상황이 있을 수도 있습니다.
sep 예시
예를 들어, 필요에 따라 출력 형식을 바꾸기 위해 위 소스 코드 처럼 sep인자를 받고, 그 인자를 활용해서 출력 형식을 바꾸고 있습니다. 출력 형식을 0 / 10와 같이 출력하기 위해서는 process('/')를 호출하면 되고, 출력 형식을 0 ~ 10와 같이 출력하기 위해서는 process('~')를 호출하면 됩니다. 하지만 이 범위를 벗어나 새로운 출력 형태를 만들기 위해서는 적어도 process 내에 직접 더 추가 해줘야 한다는 문제가 존재합니다.
다양한 print 기능 내장한 process
print할 방법이 많을 수록 내부에 구현해야 할 사항은 많아지고, process 의 핵심 기능인 write보다 분기문이 더 많아집니다. 또한 형식을 바꿀 때 마다 함수 내부를 찾아서 수정해야 한다는 문제점이 존재합니다. 이런 경우에 콜백 함수를 적용함으로써 해결 할 수 있습니다.
어떤 함수의 주소를 전달하고, 그 함수의 주소를 내부에서 수행하도록 하는 방법입니다.
콜백 함수
위 소스 코드 예시는 process()의 인자로 새로운 함수인 progressCallback을 받고 있습니다. 이는 for문 안에서 progressCallback을 호출하고 있으며, process() 를 호출 할 때 직접 새로 정의 해서 custom_print()가 수행되도록 하고 있습니다. 즉 위 소스코드에서는 progressCallback은 밖에서 정의한 custom_print를 의미합니다.
콜백 함수 사용 예
process() 를 호출하는 입장에서 현재의 progress를 처리 할 함수를 직접 정의 해 밖에서 형태를 집어넣고 있습니다. 실제 process()함수 안에서는 전달 받은 커스텀 함수를 실행하고 있습니다.
이런 방식을 사용하면, 소스코드가 파일별로 분할되어 있더라도 유연성 있는 기능 삽입이 가능 해 집니다.
메인 파일
예를 들어, 메인 파일에 콜백 함수를 받을 수 있도록 선언 해 두고, 이 함수를 어디선가 호출한다고 가정하겠습니다.
호출
호출 하는 입장에서 함수를 직접 정의해서 전달함으로써 직접 main의 내용을 수정할 필요가 없어집니다. 이는 process()라는 함수를 호출하는 파일이나 참조자가 많을 때 많은 효력을 발휘합니다. 예를 들어 소스코드 모든 파일에서 , process을 약 30번 가량 호출한다고 가정할 때, A 클래스에서는 A의 방법대로, B 클래스에서는 B의 방법대로, C 클래스에서는 C의 방법대로 직접 콜백 함수를 정의해서 하나의 함수에 대해 다양한 결과를 도출시킬 수 있습니다.
빌드 인 예시
내부 내장 함수에서도 이러한 콜백 함수를 자주 이용합니다.
리스트의 콜백함수
리스트에서 정렬하기 위해 sort도 key를 우리가 원하는 함수를 넣음으로써 원하는 기준으로 정렬될 수 있도록 합니다. 즉 정렬 기준을 바꾸기 위해 sort 함수에 직접 파고 들어갈 필요 없이, 콜백 함수만 잘 전달 해 주면 됩니다.
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.