함수형 프로그래밍

eunsiver·2023년 5월 20일
0

소프트웨어의 규모가 커지고 프로젝트가 팀단위로 움직이게 되면서 방대하게 코드를 유지보수 하기는 점점 어려워 졌습니다. 어떤함수를 어디서 호출하는지 참조를 수십번 타고 올라가다보면 그 구조가 너무 복잡해지게 되었기 때문입니다.

그래서 기존의 명령형 프로그래밍 이후로 새로나온 개념이 함수형 프로그래밍 입니다.

함수형 프로그래밍은 절차보다 기능에 초점을 맞추었기 때문에 명령형 프로그래밍보다 효율적인 코딩이 가능하게 되어서 가독성이 높아지고 유지보수에도 편리한 방식입니다.

객체지향 프로그래밍과 함수형 프로그래밍

1) 객체 지향은 명령형 프로그래밍이고, 함수형 프로그래밍은 선언형 프로그래밍이다.

객체지향 프로그래밍을 할 때는 데이터를 어떻게 처리할 지에 대해 명령을 통해 풀어 나아갔다면, 함수형 프로그래밍은 선언적 함수를 통해 무엇을 풀어나아갈지 결정하는 것이다.

Java의 함수형 프로그래밍 예시

Java의 함수형 프로그래밍은
1. 람다식
2. 스트림
3. Optional
이 있다.

자바 8은 함수형 프로그래밍을 더 쉽게 만들수 있도록 스트림 API, Optional 인터페이스, 함수형 인터페이스들과 같은 많은 API 를 추가했다.

함수형 프로그래밍이 만능은 아니지만 코드를 더 이해하기 쉽고, 유지보수성과 테스트성을 올려주는 많은 유용한 기술들을 제공한다.

명령형 프로그래밍, 객체지향 프로그래밍과 함께 완벽하게 공존할 수 있다.

1급 객체 or 1급 시민 (First Object or First Citizen)

1급객체, 1급시민 두개는 동일한 의미로 다음 조건들을 만족하는 객체를 뜻합니다.

  • 변수나 데이터 할당할수 있다.
  • 메서드의 인자로 사용할수 있다.
  • 리턴값으로 사용할수 있다.

순수 함수 (Pure Function)

함수형 프로그래밍에서 함수는 다음과 같은 조건을 만족해야 합니다.

  • 동일입력에는 항상 같은 값을 반환한다.
  • 함수의 리턴값은 오로지 input 값에만 의존한다. (참조 투명성)
  • 함수 실행으로 인한 부수효과 (Side effect)가 없어야 한다.

아래 코드는 순수 함수다. 입력 값이 같으면 같은 값을 출력하며 그 동작을 예측하기 매우 쉽다. 필요하다면 이 메소드를 안전하게 캐싱할 수 있다.

이 함수에 아래와 같이 추가 적인 코드를 추가하면 외부상태에 영향을 미치는 부작용을 갖게 되며 행위를 예측할 수 없는 상태가 된다.


따라서 함수는 순수하고 단순하게 유지하도록 하자.

부수효과 (Side effect) 란

함수의 실행으로 함수 외부 상태가 변경되는 것을 뜻합니다.

  • 함수외부 변수의 값이 변경됨
  • 예외나 오류로 인하여 프로그램이 중단됨

순수함수의 올바른 예

  1. 항상 동일한 인자를 주면 동일한 결과를 리턴

  1. 객체를 처리한 경우

    함수형프로그래밍은 순수함수를 이용해 값을 변형하거나 다룰때 인자의 값을 변형하지않고 외부의 상태를 변화시키지않는 프로그래밍이다.

    그렇다면 함수형 프로그래밍에서는 객체의 값들을 변경할 수 없고 객체를 다룰수 없는가? X

    -> 원래 있던 값은 그대로 두고 새로운 값을 만들면서 복사해서 원하는 부분의 값이 변형된 객체를 리턴한다.

순수함수가 아닌 예

  1. 동일한 인자를 주었을때 상황에 따라 결과가 달라지는 함수

    -> c의값이 변경될 수 있어서 순수함수가 아니다.

  2. 부수효과가 발생하는 경우

    -> 함수 밖의 변수인 c에 영향을 줄 수 있다.

순수 함수 장점

위에서 보았듯 순수함수가 아닌 함수를 사용하면 외부의 값이 달라지거나 외부에 값에 의해 함수의 결과가 영향을 받는다.

이럴 경우 함수의 평가 시점이 중요해 지게 되는데 개발자의 실수로 인해 예상치 못한 일이 일어나거나 혹은 알아치라지 못하는 새에 그런 일들이 벌어질 수 있다.

  • 하지만 순수함수는 평가시점에 관계없이 동일한 인자에 결과를 돌려주며 함수 와 관계 없는 것들은 영향을 받지 않기 때문에, 함수 자체를 인자로 넘기거나 다른 쓰레드에서 실행 되는 등의 여러가지 상황에서 안전성을 보장받게 된다.

    • 순수함수의 특성으로 인한 함수형 프로그래밍의 장점은 Side effect 가 없기때문에 병렬처리 (Thread)의 안정성을 확보할수 있고 외부에 영향을 주지 않기때문에 Thread 처리시 기존 방식에서 가장 문제가 되었던 mutex 동기화를 고민하지 않아도 됩니다.
  • 이렇기 때문에 순수함수를 작성하면 개발자가 함수를 다루기 쉬워지고 개발 효율 (생산성, 안정성 등)을 높일 수 있게 된다.

즉 함수형 프로그래밍은 순수함수를 지향, 최대한 숨겨진 입력과 출력을 제거하여 가능한 코드를 입력과 출력의 관계로 사용해야 한다.

단점

물론 함수형 프로그래밍 방식이 무조건 옳은 방식이 아닙니다.

  • 순수함수의 구현이 무조건적으로 가독성이 좋지는 않다.
  • 순수함수를 사용하는것은 쉽지만 조합하는것은 난이도가 있다.
  • 함수형 프로그래밍의 반복문은 재귀방식으로 사용하는데 이는 무한루프에 빠질 가능성이 있다.

함수형 프로그래밍이라도 상황에 맞게 사용하는것이 가장 좋은 프로그래밍 방법이 될것입니다.


참고

https://blogshine.tistory.com/119

https://sthwin.tistory.com/21

profile
Let's study!

0개의 댓글