프로그래밍 패러다임
- 명령형 프로그래밍 : 무엇을(What)을 할 것인지 나타내기 보다 어떻게(How) 할 건지를 설명하는 방식, 애플리케이션의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식
- 절차지향 프로그래밍 : 수행되어야 할 순차적인 처리 과정을 포함하는 방식(C, C++)
- 객체지향 프로그래밍 : 객체들의 집합으로 프로그램의 상호작용을 표현(C++, Java, C#)
- 선언형 프로그래밍 : 어떻게 할 것인지(How)보다 무엇(what)을 할 건지를 설명하는 방식
- 함수형 프로그래밍 : 순수 함수를 조합하고 소프트웨어를 만드는 방식(JavaScript)
함수형 프로그래밍
등장 배경
- 대용량의 데이터를 빠르고 효율적으로 처리가히 위해서 멀티코어를 활용하는 병렬처리 프로그래밍 도입이 필요하기 때문
- 프로그램을 보다 단순하게 하려는 요구사항의 의해 등장
함수형 프로그래밍이란?
- 함수형 프로그래밍은 대입문을 사용하지 않는 프로그래밍이며, 작은 문제를 해결하기 위한 함수를 작성
ex)
process(10, print(num));
- 계산을 수학적 함수의 조합으로 생각하는 방식
- 함수를 1급 객체로 사용(고차 함수)
- 1급 객체의 조건
- 변수나 데이터 구조 안에 담을 수 있는 객체
- 함수의 파라미터로 전달 가능
- 반환값 사용가능
- 할당에 사용된 이름과 관계없이 고유한 구별 가능
- 동적으로 프로퍼티 할당 가능
- 애플리케이션의 상태는 순수 함수를 통해 전달
- 공유 상태와 side effect 대신 순수 함수 사용
- Side Effect란?
- 변수의 값이 변경됨
- 자료구조를 제자리에서 수정함
- 객체의 필드값을 설정함
- 예외나 오류가 발생하면 실행이 중단됨
- 콘솔 또는 파일 I/O가 발생
- 순수 함수란?
- Memory or I/O 관점에서 Side Effect가 없는 함수
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
- 순수 함수의 장점
- 함수 자체가 독립적이며 Side-Effect가 없기 때문에 Thread에 안정성을 보장
- Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행 가능
- 명령어 흐름 제어보다 합성 함수를 사용
- 합성 함수 : 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합
- 불변성
- 함수형 프로그래밍의 핵심 개념
- 함수형 프로그램은 대입문이 없기 때문에 기본적으로 한번 값이 변수에 할당되고 나면 이후에 값이 변경되지 않는다.
- 이런 프로그램을 참조 투명성을 가졌다고 하고, 참고 투명성을 가졌기 때문에 멀티코어 프로세스에서 교착 상태에 빠지지 않는다.
한줄 정리
함수를 1급 객체로 사용하며 함수를 조합하고, 공유 상태와 변경 가능한 데이터 및 사이드 이펙트를 피해 소프트웨어를 만드는 프로세스
Java의 함수형 프로그래밍 예시
Java의 함수형 프로그래밍은
1. 람다식
2. 스트림
3. Optional
이 있다.
public class WordProcessTest {
private final List<String> words = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");
@Test
void wordProcessTest() {
String result = words.stream()
.filter(w -> w.length() > 1)
.map(String::toUpperCase)
.map(w -> w.substring(0, 1))
.collect(Collectors.joining(" "));
assertThat(result).isEqualTo("T H A N K");
}
}
출처: https://mangkyu.tistory.com/111 [MangKyu's Diary:티스토리]
- Optional 예시
Optional은 자바에서 NULL이라는 개념을 해결하기 위해 도입되었다.
Java로 개발을 하다 보면 NullPointerException
을 자주 마주하게 된다.
이는 Null이라는 개념을 허용하기 때문이다. Optional은 함수형 프로그래밍에서 고안 해낸 개념으로 참조 값이 Null일 수도 있음을 알려고주고 이를 통해 NullPointerException
을 방지한다.
Optional 사용법 및 정의
참고 문헌
프로그래밍 패러다임
함수형 프로그래밍 vs 객체지향 프로그래밍
함수형 프로그래밍
함수형 프로그래밍2