함수형 프로그래밍

함수형 프로그래밍이란, 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나. 부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임.
  • 부수 효과 : 객체의 상태를 변화 시키는 것 (파라미터 포함) 
  • 순수 함수 : 부수효과가 없는 함수. 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수, 외부의 상태를 변경하지 않는 함수. 데이터의 값을 변경하거나 객체의 필드값을 설정하는 등의 작업을 하지 않는 함수
  • 모듈화 : 기능을 분할하고 추상화하여 소프트웨어의 성능을 향상시키고 유지보수를 효과적으로 하기 위한 구현 기법

 

함수형 프로그래밍을 배우는 이유

  • 기존 절차적 프로그래밍과 객체 지향형 프로그래밍과는 다른 새로운 방식으로 사고하는 방법을 배우는 것
  • 함수형 프로그래밍은 사고의 전환을 필요로 하여, 이를 통해 다양한 사고방식으로 프로그래밍을 바라봄으로써 유연한 문제해결이 가능

 

함수형 프로그래밍의 특징

  • 순수함수
    • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
    • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
    • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
    • 프로그램의 변화 없이 입력 값에 대한 결과를 알 수 있어 테스트 용이
  • 비상태, 불변성
    • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업 진행
  • 선언형 함수
    • 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언헌 프로그래밍은 무엇을 할 것인가에 주목
    • for, while과 같은 반복문을 사용하지 않고, map, filter 같은 함수를 매개변수로 받는 메서드 이용
  • 1급 객체
    • 변수나 데이터 구조안에 담을 수 있음
    • 파라미터로 전달 할 수 있음
    • 반환값(return value)으로 사용할 수 있음
    • 할당에 사용된 이름과 관계없이 고유한 구별 가능
    • 동적으로 프로퍼티 할당 가능
  • 고차함수
    • 함수를 인자로 받거나 함수를 반환 값으로 이용할 수 있는 것

 

함수형 프로그래밍을 OOP에서 사용하는 이유

  • 함수적 프로그램은 추상화 레벨이 높아, 코드의 동작을 추론하기 쉽다. 로직의 골격만 남아, 함수를 호출하는 코드를 함수 구현문으로 대체할 수 있기 때문에 개발자는 구현문을 통해 추론이 가능하다.
  • 반환되는 값 예측이 가능하다. 함수형 프로그래밍은 불변성으로 선언한 값을 복사해 변경하기 때문이다.
  • 전역 상태를 허용하지 않는다.
  • 멀티스레드에서 안전성을 지원하여, 스레드 간 객체를 안전하게 공유할 수 있다. 함수형 프로그래밍은 순수함수를 만들기 때문에 객체 전달 시 변이를 막을 수 있다.
  • 개발자는 멀티스레드 환경에서 공유자원에 대한 락, 동기화를 고려하며 코딩할 필요가 없다. 
  • 부수효과를 제거했기 때문에 재사용이 가능하며, 테스트하기 쉽다.
  • 멀티코어를 이용한 병렬 처리하는 것이 비용이나 속도면에서 더 유리하다.

 

함수형 프로그래밍 장점

  • 높은 수준의 추상화를 제공한다
  • 함수 단위의 코드 재사용이 수월하다
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다

 

함수형 프로그래밍 단점

 

  • 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다
  • 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다
  • 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다

 

 

추가 공부 자료 : https://jongminfire.dev/함수형-프로그래밍이란

'프로그래밍 > JAVA' 카테고리의 다른 글

AOP란,  (0) 2022.02.21
Spring Framework란,  (0) 2022.02.20
JVM란,  (0) 2022.02.07
어노테이션  (0) 2022.01.16
객체 지향 프로그램이란,  (0) 2022.01.16

+ Recent posts