스칼라 함수형 프로그래밍 - 내부 함수(Local Function)의 이해와 활용

View: 167 0 0
작성자: 달빛제이크
카테고리: Scala Language
발행: 2024-06-06 수정 2024-06-21

안녕하세요. 달빛제이크입니다.

오늘은 스칼라 함수형 프로그래밍 지원 기능 중 내부 함수(Local function)에 대해서 알아 보겠습니다.

1. 내부 함수 (Local function)

내부 함수(Local function)는 말 그대로 함수 안에 함수를 만드는 것입니다. 쉬워요. 함수 안에 함수를 만든다.

문법적으로 중요한 부분은

  1. 내부 함수는 이 함수가 포함된 외부 함수의 변수들을 그대로 사용할 수 있지만 외부 함수에서는 내부 함수의 변수들을 사용할 수가 없습니다.

  2. 당연히 외부 함수에 가려져서 외부에서 이 내부 함수를 호출할 수 없습니다. 즉 이 내부 함수는 자신을 포함하는 외부 함수에서만 사용이 가능합니다.

간단합니다. 상식적인 프로그래밍 문법입니다.

2. 내부 함수 Usage

그렇다면 우리는 왜 이 내부 함수를 사용해야 할까요?

이 필요성은 결국 프로그래밍을 효율적이고 구조적으로 작성하기 위한 목적과 연결됩니다.

함수형 프로그래밍 스타일에서 중요하게 생각하는 설계 원칙(Design Principle) 중 하나는, 프로그램은 잘 정의된 한 개의 Task에 대응하는 작은 함수들로 나누어야 한다는 것입니다. 이런 방식의 장점은 좀 더 어려운 일을 하는 코드 블록을 유연하게 구성할 수 있다는 점입니다. 당연히 이 코드 블록들도 이해하기 쉽게 만들어야 합니다.

내부 함수를 사용해야 하는 명확한 이유는

  1. 함수가 많아지면 많아질수록 네임스페이스(namespace)를 오염시켜 의미 없는 이름들로 채워지게 되고 정작 의미 있는 함수를 만들 때 작명이 어렵게 될 수 있습니다.

  2. 의미 없는 Helper 함수를 노출 시켜서 굳이 관련 함수를 사용하는 다른 개발자가 코드를 이해하는 데 어려움을 느끼게 할 필요가 없습니다.

  3. Helper 함수를 사용하다 보면 비효율적이라고 느끼거나, 더 효율적인 방법을 찾았을 때 삭제나 수정이 필요한 경우가 있는데 내부 함수를 사용하면 함수를 사용하는 다른 개발자를 고려하지 않고 삭제 또는 수정이 가능하게 됩니다.

Scala에서는 내부 함수 외에 Java에서 지원하는 private 접근 제어자도 지원하기 때문에 상황에 맞추어 적절하게 선택해서 사용하면 좋을 것 같습니다.

3. 내부 함수 예제

간단히 내부 함수에 대한 예제를 보여드리면,


object Padding:
  def padLines(text: String, minWidth: Int): String
    def padLine(line: String): String = 
      if line.length >= minWidth then line
      else line + " " * (minWidth - line.length)
    val paddedLines =
      for line <- text.linesIterator yield
        padLine(line)
    paddedLines.mkString("\n")

  1. Singleton Object Padding 내에 padLines라는 method가 있고 내부 함수로 padLine 함수를 가지고 있습니다.

  2. 내부 함수인 padLine은 한 줄 짜리 String에 minWidth에 따라 공백을 추가하는 기능을 수행합니다.

  3. 외부 함수의 parameter인 minWidth를 내부 함수에서 사용할 수 있습니다.

  4. for-yield 표현식에서 여러 줄 짜리 String을 한 줄 씩 padLine method로 넘겨 공백과 관련된 Task를 진행하고 결과를 넘겨 받습니다.

  5. for-yield 표현식은 조건문의 자료형을 참고하여 padLine으로부터 넘겨 받은 String 값을 Iterator[String]으로 만들고 paddedLines에 저장합니다.

  6. paddedLines.mkString("\n")에서 Iterator[String] 형식으로 구분된 String을 개행 문자를 사용해서 여러 줄의 String으로 변환합니다.

지금까지 스칼라 함수형 프로그래밍을 주제로 내부 함수에 대해서 알아 보았습니다.

효율적인 프로그램을 작성하기 위해서 그리고 코드의 수정 및 재 사용성을 용이하게 하기 위해 내부 함수를 적절하게 사용하면 좋을 것 같습니다.

다음 글에서는 스칼라 함수형 프로그래밍에서 매우 중요한 기능인 Function literal에 대해 이야기 하겠습니다.

감사합니다.

comments 0