함수형 프로그래밍 (Functional Programming)

박영준·2023년 4월 10일
0

Programming

목록 보기
6/6

1. 프로그래밍 패러다임 (Programming Paradigm)

1) 정의

프로그래머에게 프로그래밍의 관점을 갖게 하고, 코드를 어떻게 작성할 지 결정하는 역할을 한다.
새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 된다.

2) 구분

(1) 명령형 프로그래밍

어떻게(How) 할 건지를 설명하는 방식

절차지향 프로그래밍

객체지향 프로그래밍

(2) 선언형 프로그래밍

무엇(What)을 할 건지를 설명하는 방식

함수형 프로그래밍

(아래에 설명)

2. 함수형 프로그래밍 (Functional Programming)

1) 등장 배경

명령형 프로그래밍은 소프트웨어의 크기가 커짐에 따라, 복잡하게 엉켜있는 스파게티 코드를 유지보수하는 것이 매우 힘들었다.

2) 정의

  • "대입문이 없는 프로그래밍"

    // 1 ~ 10까지의 값이 i에 할당된다
    for(int i = 1 ; i < 10; i++){
        System.out.println(i);
    }
  • 무엇(What)을 할 건지에 포커스를 두는 프로그래밍 (선언형 프로그래밍이므로)

    process(10, print(num));
    • process 함수는 첫 번째 인자로 몇까지 iteration을 돌 것인가를 매개변수로 받음 (10)
    • process 함수는 두 번째 인자로 전달받은 값을 출력하라는 함수를 매개변수로 받음 (num)
      → '무엇을(What)'에 포커스를 두기 때문에, '출력을 하는 함수'를 파라미터로 넘길 수 있다.
  • 순수 함수를 조합하고 소프트웨어를 만드는 방식
    → 순수 함수로 나누어 문제를 해결

  • 작은 문제를 해결하기 위한 함수를 작성

  • 클로저, 하스켈, 리스프

  • 가독성을 높이고 유지보수를 용이하게 해준다.

3) 특징

(1) 부수효과(Side Effect)

다음과 같은 변화 또는 변화가 발생하는 작업을 의미

  • 변수의 값이 변경됨
  • 자료 구조를 제자리에서 수정함
  • 객체의 필드값을 설정함
  • 예외나 오류가 발생하며 실행이 중단됨
  • 콘솔 또는 파일 I/O가 발생함

(2) 순수 함수(Pure Function)

① 정의

  • 부수 효과(Side Effect)들을 제거한 함수들
    • Memory or I/O의 관점에서 Side Effect가 없는 함수
    • 함수의 실행이 외부에 영향을 끼치지 않는 함수

② 장점

  1. 함수 자체가 독립적이며 Side-Effect 가 없기 때문에, Thread 에 안전성을 보장받을 수 있다.
  2. Thread 에 안정성을 보장받아, 병렬 처리를 동기화 없이 진행할 수 있다.

(3) 1급 객체(First-Class Object)

  • 변수나 데이터 구조 안에 담을 수 있다.

  • 파라미터로 전달 할 수 있다.

  • 반환값으로 사용할 수 있다.

  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.

(4) 참조 투명성(Referential Transparency)

  • 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
    → 예측이 용이하다.
    → 병렬 처리 환경에서 개발 시, Race Condition 에 대한 비용 ↓
    (Race Condition : 두 개 이상의 프로세스가 공통 자원을 병행 시, 공용 데이터에 대한 접근의 순서에 따라 그 실행 결과가 달라지는 상황)

  • 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.(Immutable Data)

4) 사용법

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)		// filter 파라미터로 넘어간 함수 : 주어진 문자열의 길이가 1인지를 판별함
                .map(String::toUpperCase)		// 첫 번째 map 파라미터로 넘어간 함수 : 주어진 문자열을 대문자로 변환함
                .map(w -> w.substring(0, 1))		// 두 번째 map 파라미터로 넘어간 함수 : 주어진 문자열을 첫 단어만 잘라냄
                .collect(Collectors.joining(" "));		// collect 파라미터로 넘어간 함수 : 주어진 문자열을 스페이스 간격으로 이어붙임

        assertThat(result).isEqualTo("T H A N K");
    }
}
  • 함수의 파라미터(filter, map, collect)로 함수가 전달된다.

참고: [프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?

profile
개발자로 거듭나기!

0개의 댓글