[python] 고차 함수와 클로저에 대해 설명해주세요.

고차 함수 (Higher-order Function)

고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수를 말합니다. 쉽게 말하자면, 함수를 다루는 함수라고 생각할 수 있습니다.

예를 들어, 아래의 예제는 고차 함수를 사용하여 함수를 인자로 받아서 실행하는 코드입니다.

def apply_func(func, x):
    return func(x)

def square(x):
    return x ** 2

print(apply_func(square, 5))  # 25

위 코드에서 apply_func 함수는 func라는 함수와 x라는 인자를 받아서 func(x)를 실행합니다. square 함수를 apply_func의 첫 번째 인자로 전달하고, 5를 두 번째 인자로 전달하여 apply_func(square, 5)를 실행하면, square(5)가 실행되어 결과값인 25가 출력됩니다.

이처럼 고차 함수를 사용하면, 코드의 재사용성과 유연성을 높일 수 있습니다.

클로저 (Closure)

클로저는 함수와 그 함수가 참조하는 비전역 범위에 있는 변수들로 구성된 환경을 뜻합니다. 간단히 말하자면, 함수가 자신이 생성될 때의 상태를 기억하는 것입니다.

예를 들어, 아래의 예제는 클로저를 사용하여 카운터 함수를 구현하는 코드입니다.

def counter():
    count = 0

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

    return increment

counter1 = counter()
print(counter1())  # 1
print(counter1())  # 2

counter2 = counter()
print(counter2())  # 1

위 코드에서 counter 함수는 내부에 count라는 변수와 increment라는 함수를 정의합니다. increment 함수에서 nonlocal 키워드를 사용하여 count 변수가 외부에 있는 counter 함수의 스코프에 있음을 명시적으로 표현합니다. 이렇게 되면 increment 함수는 자신이 생성된 시점의 count 변수를 계속해서 참조할 수 있습니다.

따라서 위 코드를 실행하면, counter1은 1씩 증가하는 카운터 함수가 되고, counter2는 독립적으로 1씩 증가하는 새로운 카운터 함수가 됩니다.

클로저를 이용하면, 함수 내부에 상태를 유지하며 독립적인 함수를 생성할 수 있으므로, 상태를 공유하지 않는 함수를 구현할 때 매우 유용합니다.

마무리

고차 함수와 클로저는 함수형 프로그래밍에서 중요한 개념입니다. 고차 함수를 사용하면 유연하고 재사용 가능한 코드를 작성할 수 있으며, 클로저를 이용하면 상태를 유지하는 독립적인 함수를 만들 수 있습니다. 이러한 개념을 잘 이해하고 활용한다면, 더욱 효율적이고 강력한 프로그래밍을 할 수 있을 것입니다.

참고 문서 참고 문서