TIL #3 - 함수형 프로그래밍이란?
📌 오늘 공부 내용
🔱 함수형 프로그래밍 개념
📜 목표
- 함수형 프로그래밍 개념에 대해 이해한다.
- 함수형 프로그래밍 특징에 대해 이해한다.
- 함수형 프로그래밍의 장단점에 대해 이해한다.
- 왜 함수형 프로그래밍이 뜨고 있는지에 대해 이해한다.
요즘 유행하고 있고 자바스크립트, 타입스크립트를 한다면 반드시 알아야 하는 개념인 함수형 프로그래밍이란 무엇일까?
프로그래밍 패러다임
우리는 프로그래밍 패러다임에 대해서 먼저 알아야 한다.
명령형 프로그래밍과 선언형 프로그래밍이 있는데 그 차이에 대해 이해해보자.
✔️ 명령형 프로그래밍 : focus ➡️ 어떻게(How)
- 객체 지향 프로그래밍 : 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 프로그래밍 로직을 구성하는 프로그래밍 기법 (C++, C#, Java)
- 절차 지향 프로그래밍 : 순차적인 처리가 가장 중요시 되며, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법 (C, C++)
✔️ 선언형 프로그래밍 : focus ➡️ 무엇(What)
- 함수형 프로그래밍 : 순수 함수를 조합하여 소프트웨어를 만드는 방식 (하스켈, 리스프, 클로저)
🗨️ 함수형 프로그래밍이란?
함수형 프로그래밍은 상태와 가변 데이터를 멀리하고 순수 함수를 이용하여 부수효과를 없애면서 프로그래밍을 하는 프로그래밍 패러다임이다.
객체지향, 절차지향 프로그래밍이 함수형 프로그래밍의 반대되는 개념은 아니다.
서로 공존해서 사용되기도 한다.
예를 들어, 스칼라 같은경우 함수형 프로그래밍 특징을 띄면서 객체 지향 프로그래밍 특징도 갖고 있다.
함수형 프로그래밍의 특징
1. 함수형 프로그래밍은 어떻게? 과정? 보다는 무엇을? 결과에 대해 초점을 둔다.
2. 일급 객체
- 함수도 값이다. 함수를 값으로 다룰 수 있다.
- 변수에 함수를 값으로 담아 다룰 수 있다.
- 이를 이용하여 많은 조합성을 만들어내고 추상화의 도구로 사용한다.
- 동적으로 할당 가능하다.
3. 고차함수
- 함수를 인자로 받아서 실행하는 함수. 함수를 값으로 바라보기 때문에 가능하다.
- 함수를 만들어 리턴하는 함수 (클로저를 만들어 리턴하는 함수)
4. 불변성
- 데이터를 변경할 수 없다.
- 데이터 변경이 필요한 경우 원본 데이터는 보존한 채 deep copy를 이용하여 작업을 진행한다.
5. 순수 함수
- 동일한 입력에는 항상 같은 값을 반환해야 한다. 즉, 입력값에 의해서만 출력값이 달라진다.
- 순수 함수를 호출했을 때, 프로그램 상태에 영향을 미치면 안된다. (Side Effect)
- 순수 함수를 이용하는 것은 리액트 패러다임에서도 중요한 개념이다.
6. 루프보다는 재귀를 이용한다.
7. Lazy 평가
- 코드 실행 즉시 값을 평가하는 것이 아닌 필요한 시점에 값을 평가한다.
- 평가란 코드가 계산되어 값을 만드는 것.
8. 익명 함수
- 람다식으로 표현되는 함수로 구현 가능하다.
함수형 프로그래밍의 장점
- 테스트와 디버깅에 용이하다.
- 가독성이 높은 코드를 작성하기 쉽다.
- 함수 단위 코드 재사용이 쉽다.
- 스레드가 동시에 공유 데이터에 접근하더라도 데이터를 변경시킬 수 없다.
- 함수가 값처럼 쓰일 수 있다.
- 안정성 보장
- 성능 최적화
함수형 프로그래밍의 단점
- 상태를 갖고 있지 않아 액션을 수행할 때마다 상태를 생성해야 함. 이는 많은 메모리를 요구하게 된다.
- 프로그래밍 규모가 커질수록 수많은 함수들이 생겨나 함수들을 파악하고 유지 관리가 힘들어진다.
함수형 프로그래밍이 주목 받는 이유
부작용(Side Effect)에 있어 자유롭다. 즉, 오류를 원천적으로 방지한다.
👨💻 마무리
최근에 유인동 씨의 함수형 프로그래밍 강좌를 통해 스터디를 하고 있는데, 함수형 프로그래밍이 정확히 무엇일까? 무엇이기에 이렇게 강조를 하는 것일까 라는 궁금증이 생겼다.
왜 함수형 프로그래밍이 뜨고 있고, 프론트엔드 쪽에서 강조가 되는 것인지 이번 공부를 통해 이해하게 되었다.
사실 쉽지 않은 개념이다. 앞으로도 계속 공부가 필요할 것이고 많은 적용들을 해보면서 익혀나아가야겠다는 생각이 든다.
오늘 이렇게 정리를 해보면서 앞으로 함수형 프로그래밍적 사고로 코딩을 하려면 어떠한 생각을 가지고 접근해야하는 지에 대해 고민을 하게 된 것 같다.
단순 인덱스로 접근 하는 것이 아닌 고차함수를 이용하는 법을 적용해보는 것처럼 프로젝트나 개인 학습을 하면서 의식하며 코딩하려는 자세가 중요하겠다는 생각도 든다.
함수형 프로그래밍적 사고에 한 발짝 더 다가선 느낌이 들어서 좋다.
'성장기록 > TIL' 카테고리의 다른 글
TIL #6 - SSR과 CSR (1) | 2023.01.09 |
---|---|
TIL #5 - fork 한 레포지토리 잔디 심기 (0) | 2023.01.08 |
TIL #4 - CSS-in-JS 란? (0) | 2023.01.07 |
TIL #2 - React Life Cycle (생명 주기) (0) | 2023.01.04 |
TIL #1 - 자바스크립트 이터러블/이터레이터 프로토콜 (0) | 2023.01.02 |