프로그래밍공부(Programming Study)/파이썬(Python)

파이썬 클로저로 이해하는 데이터 은닉, 팩토리 함수, 데코레이터 패턴

Chaany 2024. 8. 9.
728x90

클로저를 활용한 데이터 은닉, 팩토리 함수, 데코레이터

클로저는 파이썬의 고급 프로그래밍 기법 중 하나로, 이를 통해 데이터 은닉, 팩토리 함수, 데코레이터와 같은 유용한 패턴을 구현할 수 있습니다. 각각의 개념을 클로저와 함께 어떻게 사용하는지 알아보겠습니다.

데이터 은닉 (Data Encapsulation)

데이터 은닉은 객체지향 프로그래밍에서 중요한 개념으로, 특정 데이터나 변수에 대한 접근을 제한하여 외부에서 직접적으로 변경하지 못하게 하는 방법입니다. 클로저를 사용하면 함수 내부에서만 접근 가능한 변수를 만들 수 있으며, 이를 통해 데이터 은닉을 구현할 수 있습니다.

예를 들어,

def make_counter():
    count = 0  # 외부에서 접근할 수 없는 변수

    def counter():
        nonlocal count
        count += 1
        return count

    return counter

my_counter = make_counter()
print(my_counter())  # 1 출력
print(my_counter())  # 2 출력

위 예제에서 count 변수는 make_counter 함수 내에서 정의되었고, 외부에서는 직접 접근할 수 없습니다. counter 함수만이 count에 접근하고 이를 수정할 수 있기 때문에 데이터 은닉이 구현됩니다.

팩토리 함수 (Factory Function)

팩토리 함수는 객체를 생성하는 역할을 하는 함수로, 파라미터에 따라 서로 다른 객체를 생성할 수 있습니다. 클로저를 이용하면 다양한 설정이나 초기화를 적용하여 특정 목적에 맞는 함수를 동적으로 생성할 수 있습니다.

예를 들어,

def power_factory(exponent):
    def power(base):
        return base ** exponent
    return power

square = power_factory(2)
cube = power_factory(3)

print(square(4))  # 16 출력
print(cube(2))    # 8 출력

위 코드에서 power_factory는 지수를 지정받아 base의 값을 해당 지수로 거듭제곱하는 power 함수를 생성합니다. 이를 통해 같은 power 함수지만 다른 동작을 하도록 클로저를 활용하여 동적으로 함수를 생성할 수 있습니다.

데코레이터 (Decorator)

데코레이터는 기존 함수나 메서드에 추가적인 기능을 부여하는 데 사용됩니다. 이는 클로저를 활용하여 함수에 새로운 동작을 덧붙이는 방식으로 구현됩니다. 데코레이터는 코드의 반복을 줄이고, 코드의 가독성과 유연성을 높이는 데 유용합니다.

예를 들어,

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

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

say_hello()

출력 결과는 다음과 같습니다:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

여기서 my_decoratorsay_hello 함수에 추가적인 동작을 더하는 데코레이터입니다. 데코레이터는 원래 함수의 동작을 변경하지 않으면서도, 그 전에 또는 후에 추가적인 코드를 실행할 수 있도록 해줍니다.

요약 및 태그

클로저는 파이썬에서 데이터 은닉, 팩토리 함수, 데코레이터와 같은 패턴을 구현하는 데 유용하게 사용됩니다. 이를 통해 코드의 구조를 간결하게 하고, 재사용성과 유지보수성을 높일 수 있습니다.

728x90

댓글