빙응의 공부 블로그
[JAVA]함수형 프로그래밍 본문
Optional에 대해 공부하는 중 Stream과 연계해서 사용하는 것을 보았다.
궁금해!
📝함수형 프로그래밍에 대한 이해
먼저 Stream API를 이해하기 위해서는 함수형 프로그래밍에 대해 이해해야 한다.
프로그래밍 패러다임
프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할 지 결정하는 역할을 한다.
패러다임은 크게 아래와 같이 구분한다.
- 명령형 프로그래밍: 무엇(What)을 할 것인지 나타내기 보다 어떻게(How)할 건지를 설명하는 방식
- 절차지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식
- 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현
- 선언형 프로그래밍: 어떻게(How)를 나타내기보다 무엇(What)을 할 건지를 설명하는 방식
- 함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식이다.
함수형 프로그래밍의 등장배경
명령형 프로그래밍을 기반으로 개발했던 개발자들은 개발하는 소프트웨어의 크기가 점차 커짐에 따라, 유지보수가 힘들다는 것을 깨닫게 되었다. 이를 해결하기 위해 함수혐 프로그래밍에 관심을 가지게 되었다.
함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.
함수형 프로그래밍의 이해
함수형 프로그래밍은 대입문을 사용하지 않으며, 작은 문제를 해결하기 위한 함수를 작성한다.
대입문이랑 다음과 같이 값이 대입되는 것이다.
//1~10까지 값이 i에 할당되며 println에 대입된다.
for(int i = 1 ; i < 10; i++){
System.out.println(i);
}
함수형 프로그래밍은 무엇(What)에 초점을 두고 있다. 그렇기 때문에 함수형 프로그래밍에서는
출력하는 함수를 파라미터로 넘길 수 있다.
// 함수형 프로그래밍으로 변환
IntConsumer printFunction = System.out::println;
// 저장된 함수를 변수로 사용
IntStream.range(1, 10)
.forEach(printFunction);
📝함수형 프로그래밍의 특징
- 함수형 프로그래밍 패러다임의 주요 특징은 다음과 같다.
부수 효과(Side Effect)가 없다.
부수 효과란 다음과 같은 변화 또는 변화가 발생하는 작업을 의미한다.
- 변수의 값이 변경됨
- 자료 구조를 제자리에서 수정함
- 객체의 필드값을 설정함
- 예외나 오류가 발생하며 실행이 중단됨
- 콘솔 또는 파일 I/O가 발생함
순수 함수(Pure Function)
부수 효과를 제거한 함수를 순수 함수라고 부르며, 함수형 프로그래밍에서 사용하는 함수는 이러한 순수 함수이다.
- Memory or I/O 관점에서 Side Effect가 없는 함수
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
순수함수의 장점
- 함수 자체가 독립적이며 Side-Effect가 없기 때문에 Thread에 안전성을 보장받을 수 있다.
- Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행할 수 있다.
1급 객체(First-class Object)
1급 객체란 다음과 같은 것들이 가능한 객체를 의미한다.
- 변수나 데이터 구조 안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환 값으로 사용할 수 있다.
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.
참조 투명성
- 동일한 인자에 대해 항상 동일한 결과를 반환한다
- 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.
병렬 처리
- 함수형 프로그래밍 스타일 자체가 병렬 처리를 지원하기 좋은 특징을 지닌다.
- 함수형 프로그래밍은 상태 변경이 없고 부수 효과가 없는 순수 함수를 사용하므로, 각 함수가 독립적으로 실행될 수 있다.
명령형 프로그래밍과 함수형 프로그래밍의 차이는 사용하는 함수의 부수 효과의 유/무에 있다.
부수효과의 유/무에 따라 참조 투명성, 즉 항상 동일한 결과를 반환하기에 결과를 예측할 수 있다는 원리가 보장된다.
함수형 프로그래밍으로 개발하려는 핵심 동기는 부작용을 제거하여 프로그램의 동작을 이해하고 예측을 용이하게 하는 것에 있다.
함수형 프로그래밍은 순수 함수를 1급 객체로 간주하여 파라미터 전달이나
반환 값으로 사용이 가능해진다.
📝자바의 함수형 프로그래밍
자바는 객체지향 프로그래밍 언어이지만, 함수형 프로그래밍 요소를 지원하기 위해 Java 8에서 함수형 프로그래밍 기능을 도입하였다.
- 람다식
- 함수형 인터페이스
- Stream API
Java에서의 함수형 프로그래밍은 함수형 프로그래밍의 이점을 최대한 활용하는 것이다.
람다식과 Stream API를 이용하여 불변성을 지키며 부수 효과를 최소화하는 방법으로 코드를 작성한다.
✔참조 사이트
'JAVA' 카테고리의 다른 글
[JAVA]함수형 프로그래밍 - 람다식(Lambda Expression) (2) | 2023.11.29 |
---|---|
[JAVA]함수형 프로그래밍 - Stream API (0) | 2023.11.29 |
[JAVA] Optional (0) | 2023.11.28 |
[JAVA] Collection - 사용 방법 (0) | 2023.11.28 |
[JAVA]Generics - 기본 제네릭 클래스 (2) | 2023.11.27 |