[ JAVA ] 함수형 프로그래밍

신범철·2022년 7월 28일
0

자바

목록 보기
17/20
post-custom-banner

프로그래밍 패러다임

  • 명령형 프로그래밍 : 무엇을(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에 안정성을 보장받아 병렬 처리를 동기화 없이 진행 가능
  • 명령어 흐름 제어보다 합성 함수를 사용
    - 합성 함수 : 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합
    • ex) 자바스크립트의 커링함수
  • 불변성
    - 함수형 프로그래밍의 핵심 개념
    • 함수형 프로그램은 대입문이 없기 때문에 기본적으로 한번 값이 변수에 할당되고 나면 이후에 값이 변경되지 않는다.
    • 이런 프로그램을 참조 투명성을 가졌다고 하고, 참고 투명성을 가졌기 때문에 멀티코어 프로세스에서 교착 상태에 빠지지 않는다.

한줄 정리
함수를 1급 객체로 사용하며 함수를 조합하고, 공유 상태와 변경 가능한 데이터 및 사이드 이펙트를 피해 소프트웨어를 만드는 프로세스

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

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

  • Stream 예제
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

profile
https://github.com/beombu
post-custom-banner

0개의 댓글