이게 뭐지.... 너무 어렵다..
데코레이터는 현재 존재하는 함수의 구조를 바꾸지 않고도 기능을 추가할 수 있도록 해주는 파이썬의 디자인 패턴이다.
이게 가능한 이유는 파이썬에서 함수를 객체로 인지하기 때문인데 즉, 함수 역시 다른 함수의 파라미터로 입력될 수도 있고 리턴되는것도 가능하고, 다른 함수 내에 정의될 수도 있다는 뜻이다.
데코레이터의 가장 중요한 개념은 클로져라고 불리는 패턴인데, 파이썬은 중첩된 함수가 외부에 있는 둘러싸고있는 함수의 스코프에 접근할 수 있도록 되어있다.
간단한 decorator예시 하나를 가져왔다.
이 예시는 hello를 데코레이팅 한 것이다.
우선 따라가기 쉽게 코드의 진행 순서를 줄 번호를 이용해서 설명해 보자면
1 - 9 - 8 - 11 - 12 - 2 - 3 - 4 - 10 - 5 - 6
확실하지는 않지만 이런 순서로 가는것 같다.
하지만 여기에서 한 줄만 추가되어도 순서가 많이 바뀐다.
2번째 줄에 print구문 한줄이 추가 되었다.
여기서 순서를 다시 정해보면
1 - 10 - 9 - 2 - 12 - 13 - 3 - 4 - 5 - 11 - 6 - 7
이런 식으로 가게 되는 것 같다. 이 순서를 따라가면서 한줄 한줄 실행된다고 하면 이해하기 비교적 쉬운것 같다.
다음 예제로 가보자
갑자기 너무 어려워 진 것 같다.
하지만 천천히 생각해보면 똑같이 어렵다 ㅎㅎ...
위에서 한줄 추가 한 뒤 보여주었던 순서와 같은 형식이다.
데코레이팅을 하려는 함수 위에 @데코레이터
를 선언하게 되면, 데코레이션이 초기화? 가 되어 해당 데코레이터를 먼저 처리해야 한다. 심지어 이번에는 데코레이터에서 인자도 받아오고 있다. 따라서 if문을 통해 코드가 실행되기 이전에 1~4번 줄이 선행 되어야 하고 위의 코드로는 "아이유" 가 출력이 되게 된다. 그 후 다른 코드들은 순서대로 처리하면 끝이다.
결과는 이런식으로 나오게 된다.
다른 코드들도 더 공부해 봐야 더 확실히 알것 같지만 코드의 진행 순서를 이해하게 되면 어렵지 않은것 같지만 순서를 이해하는게 어려운것 같다....