소프트웨어의 규모가 커지고 프로젝트가 팀단위로 움직이게 되면서 방대하게 코드를 유지보수 하기는 점점 어려워 졌습니다. 어떤함수를 어디서 호출하는지 참조를 수십번 타고 올라가다보면 그 구조가 너무 복잡해지게 되었기 때문입니다.
그래서 기존의 명령형 프로그래밍 이후로 새로나온 개념이 함수형 프로그래밍 입니다.
함수형 프로그래밍은 절차보다 기능에 초점을 맞추었기 때문에 명령형 프로그래밍보다 효율적인 코딩이 가능하게 되어서 가독성이 높아지고 유지보수에도 편리한 방식입니다.
1) 객체 지향은 명령형 프로그래밍이고, 함수형 프로그래밍은 선언형 프로그래밍이다.
객체지향 프로그래밍을 할 때는 데이터를 어떻게 처리할 지에 대해 명령을 통해 풀어 나아갔다면, 함수형 프로그래밍은 선언적 함수를 통해 무엇을 풀어나아갈지 결정하는 것이다.
Java의 함수형 프로그래밍은
1. 람다식
2. 스트림
3. Optional
이 있다.
자바 8은 함수형 프로그래밍을 더 쉽게 만들수 있도록 스트림 API, Optional 인터페이스, 함수형 인터페이스들과 같은 많은 API 를 추가했다.
함수형 프로그래밍이 만능은 아니지만 코드를 더 이해하기 쉽고, 유지보수성과 테스트성을 올려주는 많은 유용한 기술들을 제공한다.
명령형 프로그래밍, 객체지향 프로그래밍과 함께 완벽하게 공존할 수 있다.
1급객체, 1급시민 두개는 동일한 의미로 다음 조건들을 만족하는 객체를 뜻합니다.
함수형 프로그래밍에서 함수는 다음과 같은 조건을 만족해야 합니다.
아래 코드는 순수 함수다. 입력 값이 같으면 같은 값을 출력하며 그 동작을 예측하기 매우 쉽다. 필요하다면 이 메소드를 안전하게 캐싱할 수 있다.
이 함수에 아래와 같이 추가 적인 코드를 추가하면 외부상태에 영향을 미치는 부작용을 갖게 되며 행위를 예측할 수 없는 상태가 된다.
따라서 함수는 순수하고 단순하게 유지하도록 하자.
함수의 실행으로 함수 외부 상태가 변경되는 것을 뜻합니다.
객체를 처리한 경우
함수형프로그래밍은 순수함수를 이용해 값을 변형하거나 다룰때 인자의 값을 변형하지않고 외부의 상태를 변화시키지않는 프로그래밍이다.
그렇다면 함수형 프로그래밍에서는 객체의 값들을 변경할 수 없고 객체를 다룰수 없는가? X
-> 원래 있던 값은 그대로 두고 새로운 값을 만들면서 복사해서 원하는 부분의 값이 변형된 객체를 리턴한다.
동일한 인자를 주었을때 상황에 따라 결과가 달라지는 함수
-> c의값이 변경될 수 있어서 순수함수가 아니다.
부수효과가 발생하는 경우
-> 함수 밖의 변수인 c에 영향을 줄 수 있다.
위에서 보았듯 순수함수가 아닌 함수를 사용하면 외부의 값이 달라지거나 외부에 값에 의해 함수의 결과가 영향을 받는다.
이럴 경우 함수의 평가 시점이 중요해 지게 되는데 개발자의 실수로 인해 예상치 못한 일이 일어나거나 혹은 알아치라지 못하는 새에 그런 일들이 벌어질 수 있다.
하지만 순수함수는 평가시점에 관계없이 동일한 인자에 결과를 돌려주며 함수 와 관계 없는 것들은 영향을 받지 않기 때문에, 함수 자체를 인자로 넘기거나 다른 쓰레드에서 실행 되는 등의 여러가지 상황에서 안전성을 보장받게 된다.
이렇기 때문에 순수함수를 작성하면 개발자가 함수를 다루기 쉬워지고 개발 효율 (생산성, 안정성 등)을 높일 수 있게 된다.
즉 함수형 프로그래밍은 순수함수를 지향, 최대한 숨겨진 입력과 출력을 제거하여 가능한 코드를 입력과 출력의 관계로 사용해야 한다.
물론 함수형 프로그래밍 방식이 무조건 옳은 방식이 아닙니다.
함수형 프로그래밍이라도 상황에 맞게 사용하는것이 가장 좋은 프로그래밍 방법이 될것입니다.
참고