10월 29일 - 함수형 프로그래밍

Yullgiii·2024년 10월 29일
1

함수형 프로그래밍 (Functional Programming)

함수형 프로그래밍은 주어진 상태나 객체를 직접적으로 수정하지 않고, 순수 함수를 조합하여 소프트웨어를 만들어 나가는 프로그래밍 방식이다. 명령형 프로그래밍과는 달리, 선언형으로 '어떻게'가 아닌 '무엇'을 할 것인가를 설명하는 것에 초점을 맞추고 있다.


명령형 프로그래밍 vs 선언형 프로그래밍

1. 명령형 프로그래밍

  • 상태 변화변경 연산을 기반으로 프로세스를 설명하는 방식이다.
  • 작업의 과정과 각 단계를 직접 명시한다.
  • 예를 들어 루프를 돌려 데이터를 변경하거나 업데이트하는 작업이 포함된다.

2. 선언형 프로그래밍

  • 목표만을 설명하며, 구체적인 과정은 직접 명시하지 않는다.
  • 결과적으로 무엇을 얻고자 하는지를 선언한다.
  • 함수형 프로그래밍은 대표적인 선언형 프로그래밍 방식이다.

함수형 프로그래밍은 복잡한 상태 변화 없이 간결하게 상태를 다루기 때문에 명령형 프로그래밍보다 유지보수성과 테스트가 용이하다.


함수형 프로그래밍의 핵심 개념

순수 함수 (Pure Function)

  • 동일한 입력에 대해 항상 동일한 결과를 반환하는 함수.
  • 외부 상태에 영향을 미치지 않으며, 함수 내부에서 함수 외부 상태를 조작하지 않는다.
  • 예를 들어, JavaScript의 map이나 filter 함수는 입력 배열을 변형하지 않고 새로운 배열을 반환한다.
const arr = [1, 2, 3, 4];
const doubled = arr.map(x => x * 2);  // [2, 4, 6, 8]

부작용 없음 (No Side Effects)

  • 함수는 자신이 담당하는 일 외에 다른 영향을 미치지 않아야 한다.
  • 외부 변수를 수정하지 않고, 매개변수와 반환 값만으로 작업을 처리하는 것이 중요하다.

상태 불변성 (Immutability)

  • 함수형 프로그래밍에서는 객체나 변수를 가능한 변경하지 않고 새로운 값을 반환하는 방식을 취한다.
  • 예를 들어, 원본 배열을 수정하지 않고 결과를 새롭게 생성하는 방식이 권장된다.

함수형 프로그래밍과 JavaScript 예제

JavaScript의 함수형 프로그래밍은 주로 map, filter, reduce 등의 고차 함수를 활용하여 구현할 수 있다.

const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(num => num % 2 === 0);  // [2, 4]

여기서 filter 함수는 원본 배열을 변경하지 않고, 조건에 맞는 요소만을 담은 새 배열을 반환한다. 이렇게 공유된 상태를 변경하지 않으므로, 예측 가능성이 높아지고 디버깅이 용이하다.


Java에서의 함수형 프로그래밍

Java 8이 릴리스되면서 Java에서도 함수형 프로그래밍 스타일을 지원하는 람다식과 Stream API가 추가되었다. Java의 함수형 프로그래밍은 순수함수를 사용하여 코드 모듈화를 높이는 방식으로 접근한다.

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> myList = Arrays.asList("a", "b", "c", "d", "e");

        // 기존 방식
        for (String s : myList) {
            if (s.startsWith("c")) {
                System.out.println(s.toUpperCase());
            }
        }

        // 함수형 프로그래밍 방식
        myList.stream()
              .filter(s -> s.startsWith("c"))
              .map(String::toUpperCase)
              .forEach(System.out::println);
    }
}

주요 함수

  • filter : 조건에 맞는 요소만 남긴다.
  • map : 각 요소에 함수를 적용해 새로운 값으로 매핑한다.
  • forEach : 스트림의 각 요소에 대해 작업을 수행한다.
    이 코드는 기존의 반복문 방식과 달리 어떤 작업을 할지 명확히 선언하고 있다. 각 작업이 독립적으로 수행되며, 결과적으로 코드의 가독성과 유지보수성이 높아진다.

So...

함수형 프로그래밍은 코드의 순수성과 예측 가능성을 보장하면서, 복잡한 상태 관리를 최소화할 수 있는 프로그래밍 패러다임이다. 특히, 복잡한 로직을 보다 직관적으로 처리할 수 있는 이점이 있다. 함수형 프로그래밍 스타일은 코드의 재사용성을 높이고, 결과적으로 애플리케이션의 유지보수성과 가독성을 향상시키는 데 큰 기여를 한다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글