함수형 프로그래밍

ayboori·2023년 11월 9일
0

CS Study

목록 보기
14/22
post-custom-banner

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

  • 절차적 프로그래밍 (C, 포트란, ...), 객체 지향형 프로그래밍 (Java, C++, ...)과 다른 새로운 방식
  • 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
    - 대입문을 사용하지 않고, 작은 문제를 해결하기 위한 함수를 작성
  • 클로저 (Clojure), 스칼라 (Scala), 하스켈 (Haskell) 등이 있고, 최근 Javascript, Kotlin, Python에도 문법이 추가되었다.
  • Javastream()을 사용하여 구현할 수 있다.
  • 모든 것을 순수 함수로 나누어 문제를 해결하는 기법
  • 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이

특징

부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.

부수효과 (Side Effect)

아래의 변화 / 변화가 발생하는 작업

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

1급 객체 (First-Class Object)

다음의 것들이 가능한 객체

  • 변수나 데이터 구조 안에 담을 수 있음
  • 파라미터로 전달 가능
  • 반환값으로 사용 가능
  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능
  • 동적으로 프로퍼티 할당이 가능

참조 투명성(Referential Transparency)

  • 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
  • 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.(Immutable Data)

비상태, 불변성 (Stateless, Immutability)

  • 데이터는 변하지 않는 불변성을 유지해야 한다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.

선언형 함수 (Expressions)

  • 선언형 프로그래밍과 마찬가지로 if,switch,for 등 명령문을 사용하지 않고 함수형 코드로 사용해야한다.

순수 함수 (Pure Function)

  • 위의 부수 효과들을 제거한 함수들

  • 함수형 프로그래밍에서 사용하는 함수

  • 동일한 입력에는 항상 같은 값을 반환하는 함수
    - 예를 들어, a를 입력으로 받았을 때 전역 변수인 b를 참조하여 연산한다면 전역 변수의 값에 따라 다른 값을 출력하기 때문에 순수 함수가 아니다?

  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수

고차 함수 (Higher-order function)

  • 함수를 인자로써 전달할 수 있어야 한다.
  • 함수의 반환 값으로 또 다른 함수를 사용할 수 있다.
    console.log(sum(1+2));

장단점

장점

높은 수준의 추상화를 제공한다
함수 단위의 코드 재사용이 수월하다
불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다

단점

순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다
함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다
순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다

프로그래밍 예시

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");
    }
}

참고 : [MangKyu's Diary:티스토리] / [JONMINFIRE.DEV](https://jongminfire.dev/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80) / [teo.log](https://velog.io/@teo/functional-programming)
profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초
post-custom-banner

0개의 댓글