[Python] 내부 함수 고찰

SeokHyun·2022년 11월 21일
0

파이썬

목록 보기
1/1

내부 함수(Inner Function)란?

내부 함수란 간단하게 말하면 함수 안에 선언된 함수이다. 일반적으로 python, js가 아닌 java와 같은 컴파일형 언어를 사용했다면 생소할 수 있다.

pythonjs에서 내부 함수가 가능한 이유는 함수 또한 일급 객체이기 때문이다.

이 글에서는 일급 객체에 대해서는 간단하게 조건만 나열하고 향 후 별도의 글로 작성하도록 하겠다. 조건은 다음과 같다.

  • 모든 요소는 할당 명령문의 대상이 될 수 있다.
  • 모든 요소는 동일 비교의 대상이 될 수 있다.
  • 모든 요소는 함수의 파라미터가 될 수 있다.
  • 모든 요소는 함수의 반환값이 될 수 있다.

어쨋든, 위와 같은 요건을 충족하기에 pythonjs에서는 함수도 일급 객체이다.

그럼 왜 내부 함수를 사용하는지 살펴보자.


내부 함수는 왜 쓸까?

내부 함수를 사용하는 이유를 찾아봤을 때 공통적으로 나오는 키워드는 다음과 같다.

  1. 가독성
  2. 캡슐화

키워드를 설명하기 전에 다음과 같은 코드를 예시로 살펴보겠다.

def sum_number(a: int, b: int) -> int:
  sum: int = 3

  def add_sum(sum: int, a: int, is_positive: bool) -> int:
    if is_positive:
      return sum + a

    return (sum + a) * (-1)

  return add_sum(sum, a, True) + b


print(sum_number(3, 4)) # result: 10

위의 코드는 간단히 설명하면, ab3을 더하는데 is_positive에 따라 a + b + 3 또는 b - a - 3이 수행된다.

이제 각 키워드에 대해 생각해보자.

가독성

내부 함수는 반복되는 동작을 함수로 기술하여 가독성을 높힐 수 있다.

위의 코드에서 인자가 a, b 두 수에 대해 동작이 이루어지는데, 만약 자료형이 List[int]였다면 add_sum함수가 더 많이 활용이 될 것이고 가독성을 높히는데 도움이 될 것이다.


캡슐화

내부 함수는 캡슐화를 통해 외부 다른 함수에서의 접근을 막을 수 있다.

즉, 내부 함수는 오로지 부모 함수에서만 사용이 가능하다.


과연 정말 좋을까?

위에서 설명한 가독성캡슐화를 생각했을 때, 다음과 같은 생각을 했다.

과연 내부 함수를 쓰는게 합당할까?

이 생각에서 시작한 나의 생각을 하나 하나 살펴보겠다.


가독성에 대한 의문

위의 예시 코드와 같이 간단한 동작을 기술하는 측면에서는 내부 함수가 가독성을 높혀줄 수도 있다.

코드의 역할이 커져 줄 수가 증가했을 때도 과연 가독성을 높혀줄 수 있을까?

이 질문에는 의문이다.

오히려, 코드를 읽는데 방해가 될 것이라 생각하고 이때는 별도의 함수로 작성하는 것이 더 좋을 것이라고 생각한다.

이 의견에 대해서 외부 접근에 대한 방어가 안되지 않나?라는 반박이 들어올 수 있다.

이 질문은 다음 장에서 살펴보도록 하겠다.


캡슐화에 대한 의문

위에서 나온 질문과 같이 별도의 함수로 작성하면 외부 접근에 대한 방어를 할 수가 없다.

만약, 내부 함수의 크기가 증가하였음에도 캡슐화를 지키고 싶다면 어떻게 해야할까?

내 생각에는 함수를 객체화시킬 것 같다.

객체의 경우, private을 통해 캡슐화를 달성할 수 있다.

즉, 크기가 커진 내부 함수를 별도의 private 함수로 작성하고, 내부 함수를 감싸는 함수는 public 함수로 작성하여 동일한 기능을 수행하는 객체로 설계를 변경한다는 말이다.

위와 같은 설계를 반영한다면 함수의 크기가 커지더라도 가독성과 캡슐화를 모두 챙길 수 있을 것이다.


단위 테스트의 문제

이 문제는 비단 내부 함수만의 문제가 아닌 객체 내 private 함수의 문제이기도 하다.

내부 함수(또는 private 함수)의 크기가 증가했다고 가정하자. 크기가 증가했다는 것은 해당 함수의 역할이 커졌다는 의미이다.

역할이 큰 함수에 대해서는 단위 테스트를 통해 내가 원하는 인풋에 대한 결과가 제대로 나오는지 확인이 필요할 것이다.

하지만, 일반적으로 내부 함수 또는 private 함수는 이를 감싼 부모 함수 또는 public 함수 만을 통해 테스트가 가능하다.

위의 예시 코드만 보더라도 is_positive에 따라 값이 제대로 표출이 확인이 필요할 것이다.

하지만, add_sum을 감싼 sum_number 함수를 통해서 is_positive 값을 변경할 수 있는 방법은 코드를 직접 수정하는 방법 외에는 존재하지 않는다.

즉, 예시 코드는 add_sum 함수를 테스트 할 수 없다는 뜻이다.

내부 함수 또는 private 함수를 테스트 하기 위해서는 또 별도의 함수를 작성하거나 테스트 상에서 접근하는 방법에 대한 추가 고찰이 필요할 것이다.

관리 포인트개발 비용이 증가한다는 의미이다.


결론

이 글에서는 일반적으로 내부 함수를 사용하는 이유와 내가 생각하는 내부 함수의 합당성에 대해서 고찰해봤다.

내 생각이 무조건 맞다는 것은 아니다.

중요한 점은 조금이라도 더 생각해보고 사용하자 일 것이다.

내 글에 대해 반박 또는 추가 의견이 있다면 코멘트를 남겨주시면 면밀히 살펴보겠다.

나 또한 여러 측면에 대한 글을 살펴보며 필요하다면 글에 의견을 지속적으로 추가하겠다.

profile
SI를 넘어 백엔드 엔지니어를 향하여

0개의 댓글