함수형 프로그래밍이란

CinnamonTree·2022년 2월 7일
0

기술면접

목록 보기
2/2

프로그래밍 패러다임은 프로그래머에게 어떤 프로그래밍 관점을 가지며 코드를 어떻게 작성할지 결정하는 역할을 한다. 보통 크게 명령형 프로그래밍과 선언형 프로그래밍으로 구분할 수 있다.

  • 명령형 프로그래밍
    • 절차지향 프로그래밍(C,C++)
    • 객체지향 프로그래밍(Java)
  • 선언형 프로그래밍
    • 함수형 프로그래밍

함수형 프로그래밍의 등장 배경

소프트웨어의 크기가 점점 커짐에 따라, 스파게티 코드들을 유지보수하기가 굉장히 힘들어짐을 보고, 개발자들은 함수형 프로그래밍이라는 패러다임에 관심을 갖게 되었다. 함수형 프로그래밍은 유지보수가 용이한 소프트웨어를 만들기 위해 모든 것을 순수함수로 나누어 문제를 해결하는 기법을 의미한다. 이는 가독성을 높이고 유지보수를 용이하게 해준다.

함수형 프로그래밍의 특징

함수형 프로그래밍은 '무엇(What)'에 초첨을 맞춘 프로그래밍으로, 함수를 1급 시민(객체)로 간주하여 관리한다.

  • 대입문을 사용하지 않는다.
  • 순수함수
  • 불변성
  • 참조 투명성

명령형 프로그래밍은 메소드 호출 시 상황에 따라 내부값이 바뀌지만, 함수형 프로그래밍은 대입문에 없기 때문에 메모리에 한번 할당된 값을 새로운 값으로 변할 수 없다.

순수함수
순수함수는 결과가 매개변수에 의해서만 좌우되며 반환값 이외에 영향이 없는 함수이다. 또한 Memory관점에서 값이 변경되는 일이 없고 I/O가 발생하지 않는다. thread 안전성을 보장하며, 따라서 병렬처리를 동기화 없이 진행할 수 있다. 순수함수는 API를 통해 외부 시스템과 상호작용을 하는데, 이는 객체의 상태(멤버)와 상호작용하는 OOP와는 대비되며, 외부 상태가 함수내에서 조작되는 절차적 프로그래밍과도 대비된다.

불변성
함수형 프로그래밍의 특징으로는 함수 외부에서 데이터를 수정하지 않는다는 것이 있다. 이를 통해 함수의 영향을 추론하기 가 쉬워진다.

참조 투명성
함수는 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다. 함수를 실행하여도 어떠한 상태 변화 없이 동일한 결과를 반환하여 항상 참조(예측)가 가능해야 한다는 것을 의미한다. 부작용을 제거하여 프로그램의 동작을 이해하고 예측을 용히하게 하는것은 함수형 프로그래밍의 핵심 동기이다.
이는 또한 병렬 처리 환경에서 race condition에 대한 비용을 줄여준다.(항상 동일한 결과를 반환하기 때문)

자바에 포함된 함수형 프로그래밍

Java는 JDK8버전부터 Stream API와 함수형 인터페이스를 제공하고 있다.

화살표 연산자

import java.util.*;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;

List lowercase = Arrays.asList("a","b","c");
System.out.println(lowercase.stream().maps(s->s.toUpperCase()).collect(toList()));
//output: ["A","B","C"]

함수형 프로그래밍을 위한 stream객체를 생성하고, map을 통해 stream객체의 단어들을 대문자로 변환시키고 있다.

더블콜론 연산자

List upper = lowercase.stream().map(String::toUpperCase).collect(toList());

위의 두 예시 모두에서 map 함수는 '함수'를 인수로 받고 있는것을 확인할 수 있다.

0개의 댓글