✔️ 함수형 프로그래밍
함수형 프로그래밍이란?
- 순수 함수를 조합하여 공유 상태, 변경 가능한 데이터 및 부작용을 피해 소프트웨어를 만드는 프로세스
- 선언형 프로그래밍으로, 애플리케이션 상태는 순수 함수를 통해 전달되게 됨
- 이를 통해 주어진 값 이외의 외부 변수 및 프로그래밍 실행에 영향을 끼칠 수 있었던 부수효과를 없애고
순수 함수를 만들어 모듈화 수준을 높이도록 함
- 애플리케이션의 상태가 일반적으로 공유되고 객체의 메소드와 함께 배치되는 객체 지향 프로그래밍과는 대조
- 명령형 프로그래밍(절차 지향, 객체 지향)은 상태와 상태를 변경시키는 관점에서 어떻게 할지(How) 설명하지만,
선언형 프로그래밍(함수형 프로그래밍)은 알고리즘을 명시하지 않고 목표만 명시하여 무엇을 할 것인지(What)를 표현
- 함수형 코드는 명령형 프로그래밍보다 더 간결하고 예측가능하여 테스트하는 것이 쉬움
- 함수형 프로그래밍은 프로그래밍 언어나 방식을 배우는 것이 아닌, 함수로 프로그래밍하는 사고를 배우는 것
즉, 기존의 사고방식을 전환하여 프로그래밍을 더 유연하게 문제해결 하도록 접근하는 것
- 함수형 프로그래밍의 의미를 파악하기 전 꼭 알아야 하는 것들
- 순수 함수 : 반드시 하나 이상의 인자를 받고, 받은 인자를 처리해 반드시 결과를 돌려줘야 함
- 합성 함수
- 공유상태 피하기
- 상태변화 피하기
- 부작용 피하기 : 프로그래머가 바꾸고자 하는 변수 외의 원본 데이터는 절대 불변
- 자바에서도 함수형 프로그래밍이 가능해지게 됨
이들은 단순히 함수를 선언해서 데이터를 원하는 방향으로 처리해나가는 함수형 프로그래밍 방식
- 람다식
- stream api
- 함수형 인터페이스
import java.util.Arrays;
import java.util.List;
public class stream {
public static void main(String[] args) {
List<String> myList = Arrays.asList("a", "b", "c", "d", "e");
// 기존방식 (명령형 프로그래밍 방식)
// 데이터를 어떻게 처리할 지에 대해 명령을 통해 해결
for(int i=0; i<myList.size(); i++){
String s = myList.get(i);
if(s.startsWith("c")){
System.out.println(s.toUpperCase());
}
}
// stream API를 이용한 방식 (함수형 프로그래밍 방식)
// 무엇을 풀어나가야할지 결정
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.forEach(System.out::println);
}
}