함수형 프로그래밍 정리

Park Jae Hong·2022년 7월 29일
0

💡 함수형 프로그래밍

: 순수 함수를 통해 부수효과(side Effect)를 최대한 억제해 오류를 피하고 프로그램의 안정성을 높이려는 노력의 한 방법

키워드 : 고차함수, 클로저, 모나드, 객체지향 vs 함수형

고차 함수(Higher-Order Function)

: 고차 함수는 함수를 인자로 전달받거나, 함수를 결과로 반환하는 함수를 말한

고차 함수의 종류

  • .forEach()

    :for문을 대체하는 고차 함수, 반복문을 추상화하여 구현된 메서드이고 내부에서 주어진 배열을 순회하면서 연산을 수행
    ( 처음에 forEach 문이 고차함수 인지 모르고 재구만을 통해서 함수형 프로그래밍을 구현하려니 고생을 많이 했다..)

  • .map()

    : forEach 같이 순회하면서, 콜백함수에서의 실행결과를 리턴한 값으로 이루어진 배열을 만들어 반환

  • .find()

    : 주어진 배열을 순회하면서 콜백 함수 실행의 반환값이 true에 해당하는 첫번째 요소를 반환

  • .findIndex()

    : 열 메소드 indexOf() 의 콜백함수 버젼. 고차함수 find()의 리턴값이 인덱스인 버젼.

  • .filter()

    : 주어진 배열을 순회하면서 콜백 함수의 반환값이 true에 해당하는 요소로만 구성된 새로운 배열을 생성하여 반환. (즉, find()의 찾아서 값을 반환하는 기능과 map()의 배열 생성 기능의 융합 버젼.)

  • .reduce()

    : 콜백 함수의 실행된 반환값(initialValue)을 전달 받아 연산의 결과값이 반환. 사실상 forEach, map, filter기능을 reduce로 모두 구현해서 쓸순 있어 고차함수의 부모라고 불림

  • .sort()

    : 배열 정렬.(단, 복사본이 만들어지는게 아니라 원 배열이 정렬됨.)

  • .some()

    : 배열 메소드인 include()의 콜백함수 버전. include는 값이 있냐에 따른 bool이면, some은 함수의 로직에 따른 bool.
    배열의 요소들을 주어진 함수(조건)을 통과하는데 한개라도 통과되면 true, 아닐때에는 false를 출력.(단, 빈 배열로 함수(조건)을 통과하면 무조건 false를 출력.)

  • every()

    : some() 의 반대 버전 배열안의 모든 요소가 주어진 함수(조건)을 모두 통과하면 true, 한 요소라도 통과하지 못하면 false를 출력. (빈 배열을 함수에 적용시키면 무조건 true를 반환.)

순수 함수란 무엇인가 ?

val A = listOf(1,2,3)
val B = listOf(1,2,3,4)
A.size = 3 // 순수함수인가?
B.size = 4 // 같은 input에서 무조건 같은 output 을 가짐

토의 내용

: 외부의 영향을 받지않고 같은 Input 에는 같은 Output을 가지므로 size 같은 함수는 순수 함수로 의견이 모아짐.

❓ 의문점

그럼 List,LinkedList 등 여러가지 기분 Class 들의 내부함수들은 대부분이 같은 Input을 받으면 같은 Output 을 가지므로 전부 순수함수 인가? 그럼 기본 제공되는 함수 중 순수함수가 아닌 함수이 있는가 ?

모나드 (Monad)

: 모나드는 하스켈에서 입출력을 수행하기 위해 도입되었습니다. (함수 합성식)

모나드는 함수 내부에서 발생할 수 있는 Side Effect 를 결과 집합과 함께 포함하는 타입입니다. 함수 실행 결과를 항상 모나드로 반환하여 순수함수 성질을 잃지 않게 하는 것입니다. 더 정확하게 얘기하자면 원시타입(boolean, int, string, float, double)과 커스텀 타입(class, struct)을 구체타입이라고 할 때 우리는 구체타입을 사용하여 함수의 인자와 결과값을 표현했습니다. 이 구체타입을 한 번 더 추상화한 것이 모나드

EX) 함수의 결과값에 모나드를 적용하면 내부에서 어떤 사이드이펙트가 발생하던 그 함수 자체는 순수 함수로 만들 수 있다

시달부 팀원님 모나드 정리 노션 링크

클로저

:선언할 당시의 환경을 기억했다가 나중에 호출될시 원래의 환경에 따라 호출되는 함수

시달부 팀원님 클로저 정리 노션 링크

인상 깊었던 내용

: 함수형 프로그래밍은 방법론이고 객체지향 프로그래밍은 구조론 이다 !

🚩 2주차 소감

: 2주차 미션을 통틀어 제일 이해가 안되고 어려웠던 미션이 함수형 프로그래밍이었는데 시달부을 통해 함수형 프로그래밍으로 돌아가서 걱정도 했지만 더욱 자세히 알게 되어서 정말 유익한 시간이였다. 같이 시달부를 했던 동료분들로 정말 잘하시는 분들 같아, 함수형 프로그래밍에 대해 많이 배웠다.

참고 사이트

profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글