Develop/Design Pattern

[ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ / Python ] ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์™œ ์‚ฌ์šฉํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ

proggg 2024. 11. 3. 19:02
728x90

1. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ, ์›๋ณธ ํ•จ์ˆ˜์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Python์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” @ ๊ธฐํ˜ธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

@๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
def ํ•จ์ˆ˜์ด๋ฆ„():
    pass

 

์œ„ ๊ตฌ๋ฌธ์€ ํ•จ์ˆ˜์ด๋ฆ„ = ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(ํ•จ์ˆ˜์ด๋ฆ„)๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

def simple_decorator(func):
    def wrapper():
        print(f"Calling function: {func.__name__}")
        func()
    return wrapper

@simple_decorator
def say_hello():
    print("Hello!")

say_hello()

# ์ถœ๋ ฅ:
# Calling function: say_hello
# Hello!

 

์ฆ‰ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

2. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

1. func ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
2. ํ•จ์ˆ˜ wrapper๋Š” ์›๋ž˜ ํ•จ์ˆ˜์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ func()๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
3. ์ตœ์ข…์ ์œผ๋กœ, wrapper ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋œ ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ wrapper ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

3. ๋‹ค์–‘ํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์˜ˆ์ œ

์˜ˆ์ œ 1: ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time of {func.__name__}: {end_time - start_time:.4f} seconds")
        return result
    return wrapper

@timer_decorator
def slow_function():
    time.sleep(2)
    print("Function complete.")

slow_function()

# ์ถœ๋ ฅ:
# Function complete.
# Execution time of slow_function: 2.0001 seconds

 

์˜ˆ์ œ 2: ํ•จ์ˆ˜์— ์ธ์ž ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

์œ„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก *args์™€ **kwargs๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค.

def check_permission(permission_required):
    def decorator(func):
        def wrapper(user_permission, *args, **kwargs):
            if user_permission == permission_required:
                return func(*args, **kwargs)
            else:
                print("Permission Denied")
        return wrapper
    return decorator

@check_permission("admin")
def delete_file():
    print("File deleted.")

# ์˜ˆ์ œ ์‹คํ–‰
delete_file("admin")   # Permission granted
delete_file("guest")   # Permission Denied

# ์ถœ๋ ฅ:
# File deleted.
# Permission Denied

 

์˜ˆ์ œ 3: ์—ฌ๋Ÿฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ

์—ฌ๋Ÿฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ•œ ํ•จ์ˆ˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

def make_upper(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

def print_stars(func):
    def wrapper(*args, **kwargs):
        print("*****")
        result = func(*args, **kwargs)
        print("*****")
        return result
    return wrapper

@print_stars
@make_upper
def greet():
    return "hello"

print(greet())

# ์ถœ๋ ฅ:
# *****
# HELLO
# *****

 

4. ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, staticmethod๋‚˜ classmethod๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์  ๋˜๋Š” ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y
    
    @classmethod
    def multiply(cls, x, y):
        return x * y

# ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
print(MathOperations.add(5, 7))         # ์ถœ๋ ฅ: 12
print(MathOperations.multiply(5, 7))    # ์ถœ๋ ฅ: 35

 

๊ฒฐ๋ก : ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์žฅ๋‹จ์ ๊ณผ ํ•„์š”์„ฑ

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊น…, ๊ถŒํ•œ ๊ด€๋ฆฌ, ์„ฑ๋Šฅ ์ธก์ • ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์— ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  1. ์žฌ์‚ฌ์šฉ์„ฑ: ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์— ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ€๋…์„ฑ: ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ํ•ต์‹ฌ ๋กœ์ง๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ(๋กœ๊น… ๋“ฑ)์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์œ ์—ฐ์„ฑ: ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  1. ๋””๋ฒ„๊น… ์–ด๋ ค์›€: ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ค‘์ฒฉ๋˜๋ฉด ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ณต์žก์„ฑ ์ฆ๊ฐ€: ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” Python์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ดํ•ดํ•˜๊ณ  ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋ฏ€๋กœ, ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90