C
Python/중급/Lesson 13

with 문 — 자원 자동 정리

15분·theory
이 챕터
5/8

with 문 — 자원 자동 정리

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ with 문이 __enter__ · __exit__ 호출
  • ✅ @contextlib.contextmanager 데코레이터
  • ✅ exit-stack 으로 다중 자원 관리

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

with 문 — 코드 + 실행 결과

with = 자원 자동 정리 (open file, lock, DB connection 등). __enter__ / __exit__ 실행.


1. 파일 — 가장 흔한 사용처

python
# ❌ with 없이 — close() 잊으면 메모리 누수
f = open("memo.txt", "w", encoding="utf-8")
f.write("안녕")
f.close()      # 잊기 쉬움

# ✅ with — 자동 close (예외 발생해도)
with open("memo.txt", "w", encoding="utf-8") as f:
    f.write("안녕")
# 블록 끝 = 자동 close

2. 여러 자원 동시

python
with open("input.txt") as 입력, open("output.txt", "w") as 출력:
    for 줄 in 입력:
        출력.write(줄.upper())
# 둘 다 자동 close

3. 직접 만들기 — __enter__ / __exit__

python
class 타이머:
    def __enter__(self):
        import time
        self.시작 = time.time()
        return self

    def __exit__(self, *args):
        import time
        걸린 = time.time() - self.시작
        print(f"{걸린:.3f}초")

with 타이머():
    sum(range(1_000_000))
# 0.020초

4. contextmanager 데코레이터 — 더 짧게

python
from contextlib import contextmanager

@contextmanager
def 타이머():
    import time
    시작 = time.time()
    yield                              # with 블록 실행 위치
    print(f"{time.time() - 시작:.3f}초")

with 타이머():
    sum(range(1_000_000))
# 0.020초

한 줄 요약

with X() as v: ...블록 들어갈 때 enter, 나갈 때 exit. 파일·락·트랜잭션 표준.

🐍 실행해보기 — with 문 — 직접 실행

위 개념을 실제로 코드로 실행해보세요. 값을 바꿔가며 어떻게 동작하는지 직접 확인하는 게 가장 빠른 학습.
✏️ Python 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
🐍 Pyodide로 실제 Python 실행 — 첫 실행 시 로딩 3~5초 소요

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 Python 코드에 with 문 — 자원 자동 정리 개념 적용해줘"
  • "이 코드에 type hint + pytest 단위 테스트 추가해줘"
  • "with 문 — 자원 자동 정리 관련 PEP 8 위반 점검해줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

먼저 읽으면 좋은 개념: 데코레이터
with 문 — 자원 자동 정리 - Python