남의 코드 보다 보면 함수 정의 위에 @ 뭐시기 이렇게 붙어있는 걸 자주 보는데요, 이게 대체 무슨 문법인지 감이 안 잡혀서 질문드려요. 클래스 안에서 @staticmethod 이런 것도 봤고 Flask 예제에서 @app.route 이런 것도 봤어요.
예를 들면 이런 거요.
@some_decorator
def hello():
print("안녕")
이게 hello 함수한테 뭔가를 해주는 것 같긴 한데, 그럼 some_decorator라는 게 함수인가요 아니면 무슨 특별한 키워드인가요? @ 기호가 붙으면 파이썬 내부에서 정확히 무슨 일이 일어나는 건지 궁금해요.
직접 만들어보려고 함수 안에 함수를 넣는 예제를 흉내내봤는데, wrapper 어쩌고 하면서 안쪽에 def를 또 만들고 그걸 return 하는 구조가 나오던데 왜 굳이 이렇게 겹쳐서 만드는 건지도 잘 모르겠어요. 실행 시간 재는 데코레이터를 직접 짜보고 싶은데 개념부터 좀 막혀서요.
결국 @데코레이터 붙이는 거랑, 그 함수를 다른 함수로 한 번 감싸서 다시 대입하는 거랑 같은 얘기인가요? 원리를 좀 쉽게 설명해주시면 감사하겠습니다.