PYTHON - 예외처리와 모듈 (Chapter 7-39. 함수 데코레이터)

2025. 3. 14. 14:18·Python

📚 Chapter 7-7. 함수 데코레이터


🔥 1. 데코레이터란?

  • **데코레이터(Decorator)**는 @ 기호로 시작하며, 함수나 클래스에 추가 기능을 부여할 때 사용됩니다.
  • 함수 데코레이터와 클래스 데코레이터로 나눌 수 있습니다.

💡 데코레이터의 주요 기능

  • 함수 호출 전후에 공통된 작업을 수행할 수 있습니다.
  • 코드의 중복을 줄이고, 유지보수를 용이하게 합니다.
  • 로깅, 성능 측정, 유효성 검사 등 다양한 용도로 활용됩니다.

✨ 2. 함수 데코레이터 사용 방법

함수에 데코레이터를 적용하면, 반복되는 작업을 깔끔하게 처리할 수 있습니다.

✅ 기본 예제

def test(function):
    def wrapper():
        # 함수 호출 전 추가 작업
        print("✅ 허언증이 재발했습니다.")
        
        # 원래 함수 호출
        function()
        
        # 함수 호출 후 추가 작업
        print("✅ 격리 되었습니다.")
    return wrapper

# oz 함수를 데코레이터로 감쌈
@test
def oz():
    print("🔥 파이썬 진짜 재미있엉 하하")

# 함수 호출
oz()

✅ 출력 결과

✅ 허언증이 재발했습니다.
🔥 파이썬 진짜 재미있엉 하하
✅ 격리 되었습니다.

⚡ 설명

  • @test로 oz() 함수에 test 데코레이터를 적용합니다.
  • wrapper() 함수에서 함수 호출 전후로 공통된 작업을 추가했습니다.

 

🌟 포스트 - 데코레이터와 컬백 함수 설명


✅ 1. 코드 구조 분석

def test(function):
    def wrapper():
        print(누나의 허어르진이 재발했습니다.)
        function()  # ⭐️ 컬백 함수로 호출되는 부분
        print(경림되었습니다.)
    return wrapper

@test
def oz():
    print(파이썬 진정 재미있어요 하하)

oz()

✅ 2. 프로세스별 동작 휘두른 방식

📌 Step 1: 데코레이터 정의

  • test 함수는 데코레이터입니다.
  • function은 인자로 전달되는 타겟 함수(oz 함수)를 의미.
  • wrapper는 실제 실행될 함수로, 타겟 함수를 감사해서 추가 동작을 수행합니다.

📌 Step 2: @test로 데코레이터 적용

@test
def oz():
    print(파이썬 진정 재미있어요 하하)
  • @test는 **oz = test(oz)**로 해석됩니다.
  • oz 함수가 test 함수의 인자로 전달되고, test는 wrapper를 반환합니다.
  • 계속적으로 oz()는 wrapper()를 호출하는 형태가 됩니다.

📌 Step 3: oz() 함수 호출 시 실행 휘두른

  1. oz() 호출 → 실제로는 wrapper()가 호출됨.
  2. wrapper() 함수 실행:
    • "허어르진이 재발했습니다." 출력
    • function() 실행 → oz() 함수가 컬백으로 실행
    • "파이썬 진정 재미있어요 하하" 출력
    • "경림되었습니다." 출력

✅ 3. 출력 결과

허어르진이 재발했습니다.
파이썬 진정 재미있어요 하하
경림되었습니다.

✅ 4. 컬백 함수가 적용된 이유

  • 컬백 함수라는 것은? → 다른 함수에 인자로 전달되어, 특정 시점에 호출되는 함수를 말합니다.
  • test(function)에서 function은 oz 함수가 전달됩니다.
  • wrapper() 함수 내

🚀 3. 데코레이터 심화 사용법

✅ 매개변수가 있는 함수에 데코레이터 사용

def logger(function):
    def wrapper(*args, **kwargs):
        print(f"📂 함수 '{function.__name__}' 호출")
        return function(*args, **kwargs)
    return wrapper

@logger
def add(a, b):
    return a + b

print(add(3, 5))

✅ 출력 결과

📂 함수 'add' 호출
8

⚡ 설명

  • *args, **kwargs를 통해 모든 형태의 인자를 받을 수 있습니다.
  • function.__name__은 함수의 이름을 가져옵니다.

✅ 여러 개의 데코레이터 사용하기

def bold(function):
    def wrapper():
        return "<b>" + function() + "</b>"
    return wrapper

def italic(function):
    def wrapper():
        return "<i>" + function() + "</i>"
    return wrapper

@bold
@italic
def text():
    return "Python"

print(text())

✅ 출력 결과

<b><i>Python</i></b>

⚡ 설명

  • @italic이 먼저 실행되고, 이후 @bold가 적용됩니다.

🧐 4. 데코레이터 사용 시 주의점

  • **functools.wraps**를 사용하여 원래 함수의 메타 정보를 유지하도록 합니다.
from functools import wraps

def decorator(function):
    @wraps(function)
    def wrapper(*args, **kwargs):
        print("함수 호출 전")
        return function(*args, **kwargs)
    return wrapper

@decorator
def hello():
    """인사 함수"""
    print("안녕하세요!")

print(hello.__name__)  # 'hello' 출력
print(hello.__doc__)   # '인사 함수' 출력

⚡ **functools.wraps**는 데코레이터가 적용된 함수가 원래 함수의 이름과 docstring을 유지하게 해줍니다.

 

 


✅ 5. 데코레이터의 사용 목적

  • ✔️ 중복 코드 제거: 여러 함수에서 동일한 작업을 할 때 공통 코드로 관리할 수 있습니다.
  • ✔️ 유효성 검사: 인자의 유효성을 데코레이터로 처리할 수 있습니다.
  • ✔️ 로깅(Log): 함수 호출 이력을 자동으로 기록할 수 있습니다.
  • ✔️ 성능 측정: 함수 실행 시간을 측정해 효율성을 확인할 수 있습니다.

📝 6. 이해도 체크리스트

  1. 다음 중 함수 데코레이터에 대한 설명으로 옳지 않은 것은?
  2. a) 함수 호출 전후로 공통된 작업을 쉽게 추가할 수 있다.
    b) @ 기호를 사용하여 적용한다.
    c) 함수를 인자로 전달하고, 수정된 함수를 반환한다.
    d) 함수 데코레이터는 클래스에서만 사용할 수 있다.
  • ✅ 정답: d
    • 함수 데코레이터는 함수뿐 아니라 클래스에도 적용할 수 있습니다.
  1. 다음 중 함수 데코레이터를 사용하는 이유로 적절하지 않은 것은?
  2. a) 함수 호출 전후로 공통된 작업을 수행하기 위해
    b) 함수의 이름을 변경하기 위해
    c) 함수의 성능을 측정하기 위해
    d) 함수 호출을 로깅하기 위해
  • ✅ 정답: b
    • 함수 데코레이터는 동작을 확장하거나 수정하는 데 사용되며, 함수 이름을 변경하려면 다른 방법을 사용해야 합니다.

⚠️ 해당 체크리스트는 본 챕터의 이해도를 확인하기 위한 것입니다. 대답에 어려움이 있다면, 다시 한번 강의를 복습해보세요! 😉


'Python' 카테고리의 다른 글

PYTHON - 예외처리와 모듈 (Chapter 7-41. 패키지)  (0) 2025.03.14
PYTHON - 예외처리와 모듈 (Chapter 7-40. 모듈 만들기)  (0) 2025.03.14
PYTHON - 예외처리와 모듈 (Chapter 7-38. 외부모듈)  (0) 2025.03.14
PYTHON - 예외처리와 모듈 (Chapter 7-37. 표준모듈)  (0) 2025.03.14
PYTHON - 예외처리와 모듈 (Chapter 7-36. raise 구문)  (0) 2025.03.14
'Python' 카테고리의 다른 글
  • PYTHON - 예외처리와 모듈 (Chapter 7-41. 패키지)
  • PYTHON - 예외처리와 모듈 (Chapter 7-40. 모듈 만들기)
  • PYTHON - 예외처리와 모듈 (Chapter 7-38. 외부모듈)
  • PYTHON - 예외처리와 모듈 (Chapter 7-37. 표준모듈)
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (807)
      • Python (32)
      • 프로젝트 (116)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (42)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    titaniumcase
    life reflection
    urbantrends
    travel ban
    smartphonedurability
    livebroadcast
    lawsuitculture
    뷔
    newpoliticalparty
    global politics
    classaction
    trumpmuskclash
    bts
    americaparty
    youngprofessionals
    btscomeback
    btsjungkook
    chatgpterror
    college reunions
    homebartrend
    chinanightlife
    btsreunion
    basalcellcarcinoma
    self-growth
    hotcoffeecase
    btsdischarge
    gpterror
    remittance
    americanlaw
    RM
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
PYTHON - 예외처리와 모듈 (Chapter 7-39. 함수 데코레이터)
상단으로

티스토리툴바