
## 컨텍스트 매니저(Context Manager) 이해하기
### ❓ 컨텍스트 매니저란?
* 코드의 특정 범위 앞뒤에서 **추가적인 코드 실행**이 필요할 때 사용하는 파이썬 기능입니다.
* 대표적으로 코드 실행 시간 측정, 임시 파일 처리, 딥러닝 모델의 특정 부분 연산 비활성화 등에 활용됩니다.
### 💡 왜 컨텍스트 매니저를 사용할까요?
* **중복 코드 방지**: 자주 사용되는 앞뒤 코드 로직을 함수처럼 재활용할 수 있습니다.
* **가독성 향상**: "덕지덕지" 붙는 앞뒤 코드를 깔끔하게 관리하여 코드의 가독성을 높입니다.
* **전문적인 코드 작성**: 컨텍스트 매니저 활용은 코드를 더욱 전문적이고 세련되게 보이게 합니다.
### ⚙️ 컨텍스트 매니저의 작동 원리
컨텍스트 매니저는 크게 두 부분으로 나뉩니다.
1. **선언 (Definition)**:
* `@contextmanager` 데코레이터 (with문 사용 시 자동 호출)
* `yield` 키워드를 기준으로 앞부분과 뒷부분으로 나뉩니다.
* `yield` 앞: 범위 시작 전에 실행될 코드
* `yield` 뒤: 범위 종료 후에 실행될 코드
2. **사용 (Usage)**:
* `with` 문을 사용하여 컨텍스트 매니저를 호출합니다.
* `with` 블록 진입 시: 선언부의 `yield` 앞 코드가 실행됩니다.
* `with` 블록 종료 시: 선언부의 `yield` 뒤 코드가 실행됩니다.
### ⏱️ 예시: 코드 실행 시간 측정
```python
from contextlib import contextmanager
import time
@contextmanager
def timer():
start_time = time.time() # yield 앞: 시작 시간 측정
yield
end_time = time.time() # yield 뒤: 종료 시간 측정 및 차이 출력
print(f"Execution time: {end_time - start_time:.4f} seconds")
# 컨텍스트 매니저 사용
with timer():
# 측정하고 싶은 코드
print("Doing some work...")
time.sleep(1)
print("Work done!")
# 출력 예시:
# Doing some work...
# Work done!
# Execution time: 1.0012 seconds
```
### 🌐 기타 활용 사례
* **임시 파일 활용**: 파일을 생성하고 사용 후 자동으로 삭제
* **딥러닝**:
* `torch.no_grad()`: 그래디언트 계산 비활성화
* `torch.autocast()`: 자동 혼합 정밀도 연산
컨텍스트 매니저를 직접 설계하고 활용할 줄 알면, 복잡한 코드에서도 효율적이고 간결하게 로직을 관리할 수 있습니다.