[CS지식 다듬기] 함수형 프로그래밍

SeungJae Son·2024년 7월 24일

CS지식 다듬기

목록 보기
3/4

📝 학습 정리 내용


함수형 프로그래밍

불변성 Immutable

람다 계산법의 근간이 되는 개념은 심볼의 값이 변경되지 않는다 는 것이다.

가변 변수를 사용하는 대신에 심볼에 값을 할당하면 그 값은 변경되지 않는다.

참조 투명성

참조 투명성은 동일한 입력 값에 대해 항상 동일한 출력 값을 보장하는 특성을 말합니다. 이는 함수형 프로그래밍에서 매우 중요한 개념으로, 함수가 외부 상태에 의존하지 않고 전달받은 인자에만 의존해야 함을 의미합니다.

순수 함수

함수형 프로그래밍에서는 어떤 외부 상태에 의존하지도 않고 변경시키지도 않는, 즉 부수 효과(Side Effect)가 없는 함수를 순수함수(Pure function)이라고 한다. 즉, 동일한 입력이 주어지면 항상 동일한 출력을 반환하는 함수.

Monad 와 Functor

Context : Element? 나 클로저 ? 가될수도있는거같음.

Functor : 컨텍스트와 콘텐츠를 가지는 녀석들을 함수객체라고 한다. '추출할 수 있다'라는 표현을 사용할 수 있다면 함수객체라고 생각해도 무방할 것 같다.

Monad : 자신의 컨텍스트와 같은 컨텍스트의 형태로 맵핑할 수 있는 Functor

  1. 타입을 인자로 받는 타입 (특정 타입의 값을 포장)
  2. 특정 타입의 값을 포장한 것을 반환하는 함수가 존재
  3. 포장된 값을 변환하여 같은 형태로 포장하는 함수가 존재

https://rriver2.tistory.com/entry/모나드란-with-Context-Functor

객체지향 프로그래밍과 함수형 프로그래밍을 대비해서 공통점과 차이점을 정리한다

불변 자료 구조 (참조링크)

불변인 객체의 장점은 해당 레퍼런스(포인터)를 가진 어떤 주체도 그 값이 영원히 바뀔 걱정 없이, 마음 놓고 믿고 쓸 수 있다는 뜻이다. 바뀌지 않으니 참조하는 순서(order)나 시점(time)을 고려할 필요가 없고, 그러니, 스레드 안전성(thread-safety) 문제도 고민할 필요가 없다는 뜻이다. 그리고 시점(time)에 따라 값이 변하는 것도 아니니, 실제값 내용은 확인할 필요 없이도, 레퍼런스의 포인터 값만 비교해서 같으면, 해당 값도 같다고 쉽고 빠르게 판단하는 잇점도 있다.

그러나 아쉬운 점은 그 값의 변화가 필요할 때, 원래 값을 바꿔서는 안 되므로, 값을 조금 바꾼 새로운 복사본을 만들어 내야 한다는 점이다. 이럴 때 가장 쉬운 방법은, 전체를 일일이 복사한 복사본을 만들면서 필요한 부분만 교체해서 만들어내는 방법인데, 이렇게 하면, 리스트에 단 하나의 요소를 추가하는데도 O(n)의 시간이 걸리는 데다, 메모리도 중복으로 낭비되는 문제가 있다.

영속 자료 구조 — Pesistent Data Structures

그런 불변 자료구조의 단점을 해결하고자 영속(persistent) 자료 구조를 쓴다.

원래 버전의 자료 구조를 유지한 채 약간 변형된 새 버전을 만들어내면서 대부분의 원래 자료를 공유하는 형태의 자료 구조를 영속 자료 구조(persistent data structures)라고 한다.

그렇게 원래 자료 구조를 대부분 유지하고 일부만 살짝 바꾸고 원래 버전을 유지하므로, 연산 비용 측면이나 메모리 사용에 있어서 효과적인, 불변(immutable) 자료구조로 쓸 수 있다.

헤드에있는 부분을 붙이는데는

원래의 레퍼런스들을 원래 값으로 유지한 채 뒷부분에 엔트리가 추가된 리스트를 만들려면, 다시 전체를 복사해서 만들어야하고, 이는 O(n)연산이 된다

고차함수

함수를 전달인자로 받거나, 함수를 리턴하는 함수

커링 함수

함수를 리턴하는 함수

고차함수나 커링함수의 장단점

장점

  • 코드를 더욱 표현력 있고 예측 가능하게 만든다.
  • 공통 패턴을 재사용 가능한 함수로 캡슐화하여 추상화를 촉진한다. 이는 더 모듈화되고 유지 관리하기 쉬운 코드로 이어진다.
  • 고차 함수를 함께 구성하여 단순한 함수에서 더 복잡한 동작을 생성하고 코드 재사용 및 모듈성을 촉진할 수 있다.

단점

  • 고차 함수는 때때로 코드를 이해하기 어렵게 만들 수 있다.
  • 불변 자료구조의 단점 처럼 새로운 값을 업데이트 할때는 시간과 메모리의 소모가 크다.

객체지향 프로그래밍 (OOP)

  • 코드 재사용: 두 프로그래밍 패러다임 모두 코드의 재사용성을 촉진합니다.
  • 모듈화: 코드의 모듈화를 통해 관리와 유지보수가 용이합니다.
  • 추상화: 복잡한 시스템을 추상화하여 더 간단하게 다룰 수 있습니다.
  • 상속과 다형성: 클래스 간의 상속을 통해 코드 재사용성과 다형성을 구현합니다.

함수형 프로그래밍 (FP)

  • 코드 재사용: 함수형 프로그래밍도 코드를 재사용함
  • 기본 단위: 함수형 프로그래밍은 함수를 기본 단위로 사용
  • 상태 불변성: 함수형 프로그래밍은 상태 변화를 피하고 불변성을 유지
  • 고차 함수: 함수를 인수로 받거나 결과로 반환하는 고차 함수를 자주 사용
  • 순수 함수: 동일한 입력에 대해 항상 동일한 출력을 반환, 부작용이 없는 순수 함수를 지향

🔗 참조 링크

클로저라는 훌륭한 도구와 영속 불변 자료 구조

순수함수란 ?

profile
개발자

0개의 댓글