함수형 프로그래밍(Functional Programming)이란 무엇인지 설명해주세요.

Haizel·2023년 7월 3일
1
post-thumbnail

기술 면접을 대비해 개념을 🍰 한입 크기로 잘라 정리합니다.
깃허브가 궁금하다면 놀러오세요!
👉 깃허브 보러가기 (Since 2023.05.10 ~ )

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

객체 지향 프로그래밍에서는 변수의 상태를 공유하고 상태를 변경하기 때문에 예상치 못한 버그를 일으킬 수 있습니다. 함수형 프로그래밍은 이러한 객체 지향 프로그래밍의 단점을 보완한 프로그래밍 방법으로, 불변성으로 선언한 값을 복사해 변경하므로 반환되는 값이 예측이 가능합니다.

함수형 프로그래밍은 계산을 수학적 함수의 평가로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임입니다. 부수효과를 제거한 순수함수들로만 작성되어 프로그램의 동작을 이해하고 예측하기 쉽다는 장점이 있습니다.

장점 😇

  1. 사용하는 모든 데이터가 변경 불가능(immutable)하고 함수는 부수 효과를 가지고 있지 않기 대문에 동시성과 관련된 문제를 원천적으로 차단할 수 있습니다.
  2. 함수는 입력과 그와 관련된 출력만을 책임지기 때문에 테스트가 쉽고 가독성이 좋습니다.
  3. 고차함수로 인해 함수들 간의 결합/조합이 간결해집니다.
  4. 코드 재사용성이 높으며, 깔끔하고 유지보수에 용이합니다.

단점 😈

  1. 함수형 프로그래밍에서는 반복문을 for문이 아닌 재귀를 통해 이뤄지는데, 재귀적 코드 스타일은 무한 루프에 빠질 수 있습니다.
  2. 함수가 많아질수록 함수를 조합하기 복잡해지며, 꾸준한 리팩토링이 필요할 수 있습니다.
  3. 광범위한 환경 설정이 필요할 수 있습니다.

함수형 프로그래밍의 특징

✏️ 부수 효과가 없는 순수 함수를 일급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.

1️⃣ 부수효과(Side Effect)

함수 내의 실행으로 인해 함수 외부에 영향을 주는 것을 의미합니다. 대표적으로 다음과 같은 변화가 발행하는 작업을 말합니다.

  • 변수를 수정하거나, 객체의 필드를 저장하는 것
  • 예외를 던지거나 오류를 발생시키며 실행을 중단하는 것
  • 콘솔 또는 파일 I/O가 발생하는 것

2️⃣ 순수 함수

부수 효과를 제거한 함수를 순수함수라고 하며, 같은 입력 값에 대해 항상 동일한 출력 값을 반환합니다. 함수형 프로그래밍에서 사용하는 함수는 모두 순수 함수입니다.

  • Memory 또는 I/O의 관점에서 Side Effect가 없는 함수
  • 함수의 실행이 외부에 영향을 끼치지 않는 함수

✅ 장점

  • 함수 자체가 독립적이며, Side Effect가 없기 때문에 Thread에 안전성을 보장 받을 수 있다.
  • Thread에 안전성을 보장받아 병렬 처리를 동기화 없이 진행할 수 있다.

3️⃣ 일급 객체(First-Class Object)

함수형 프로그래밍에서 함수는 일급 객체로 취급됩니다. 따라서 일급 객체 함수는 일급 객체로 취급되는 함수를 의미합니다.
일급 객체 함수는 사용에 제한이 없기 때문에 프로그램 내 어디서든 사용할 수 있어, 유연하고 유용합니다.
일급 객체의 특징은 다음과 같습니다.

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달할 수 있다.
  • 반환 값으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 property 할당이 가능하다.

4️⃣ 참조 투명성(Referential Transparency)

함수형 프로그래밍에서 함수는 항상 같은 동작을 진행합니다. 따라서 함수의 실행으로 인해 어떤 결과가 반환될지 예측할 수 있습니다. 즉, 동일한 인자에 대해서는 항상 동일한 결과값을 반환합니다.

  • 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
  • 참조 투명성을 통해 기존 값은 변경되지 않고 유지된다.

그 밖에도 함수형 프로그래밍은 불변성, 클로저, 유지관리 가능성, 모듈화 등의 특징을 가집니다.

profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글