김 양의 멋따라 개발따기
함수형 프로그래밍과 명령형 프로그래밍 본문
1. 명령형 프로그래밍
1-1. 명령형 프로그래밍이란?
무엇을 할 것인지 나타내기보다 어떻게(How)할 것인지 설명하는 방식
- 절차지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식 (C, C++)
- 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현 (C++, Java, C#)
2. 함수형 프로그래밍
2-1. 함수형 프로그래밍이란?
자료처리를 수학적 함수 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
함수형 프로그래밍 언어로 설계된 클로저, 스칼라, 하스켈 등의 언어가 있고,
자바스크립트, 코틀린, 파이썬 등에도 최근 버전에는 함수형 프로그래밍 문법이 추가 됨
2-1 함수형 프로그래밍의 특징
2-1-1 순수함수(pure function)
- 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
- 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
- 함수 내부의 인자의 값을 변경하거나 프로그램 상태의 side effect가 없는 것
- 부수 효과 (side effect)란?
- 변수의 값이 변경됨
- 자료 구조를 제자리에서 수정함
- 객체의 필드값을 설정함
- 예외나 오류가 발생하며 실행이 중단됨
- 콘솔 또는 파일 I/O가 발생함
- 부수 효과 (side effect)란?
//순수함수
const add = (num1, num2) => {
return num1 + num2
}
//동일한 숫자를 넣을 경우 항상 동일한 값 반환
//함수의 실행이 프로그램의 실행에 영향X
//side effect X
2-1-2 비상태, 불변성(stateless, immutability)
- 데이터는 변하지 않는 불변성을 유지해야 함
- 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고
그 데이터의 복사본을 만들어서 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행해야 함
//불변성
const dogName = [rive, sieo];
const addDogName = (dogName) => {
return [...dogName, noah]
};
2-1-3 선언형 함수(expressions)
- if, switch, for 등 명령문을 사용하지 않고 함수형 코드로 사용해야 함
//선언형 프로그래밍
const dogs = [{name:"rive", age: 12}, {name:"sieo", age:2}, {name:"noah", age: 3}];
const NewDogAge = (dogs) {
//for 문이 아닌 map사용
return dogs.map((dog)=> dog.age = dog.age + 1)
}
2-1-4. 1급 객체와 고차함수(first-class, higher-order functions)
- 함수형 프로그래밍에서는 함수를 1급객체로 취
- 1급 객체의 특징
- 변수나 데이터 구조 안에 담을 수 있음
- 파라미터로 전달할 수 있음
- 반환값으로 사용할 수 있음
- 할당에 사용된 이름과 관계없이 고유한 구별이 간으함
- 동적으로 프로퍼티 할당이 가능함
- 고차 함수의 특징
- 함수를 인자로써 전달할 수 있어야 함
- 함수의 반환 값으로 또 다른 함수를 사용할 수 있음
- 1급 객체의 특징
2-2 함수형 프로그래밍의 장단점
2-2-1 장점
- 높은 수준의 추상화를 제공
- 함수 단위의 코드 재사용이 수월함
- 불변성을 지향 => 프로그램의 동작 예측이 쉬워짐
2-2-2 단점
- 코드의 가독성이 좋지 않을 수 있음
- 재귀적 코드 스타일은 무한루프에 빠질 수 있음
- 순수 함수를 조합하는 것이 쉽지 않ㅇ
출처 :
'TIL' 카테고리의 다른 글
크롬에서 iframe CORS에러 해결하기 (0) | 2023.02.10 |
---|---|
객체지향 프로그래밍 (0) | 2023.02.05 |
23.01.06./mobx를 react 함수형 컴포넌트에서 적용해보기 (0) | 2023.01.06 |
23.01.04./PHP언어를 VSCODE에서 실행해보기 (0) | 2023.01.04 |
23.01.03./img 태그와 css - background img의 차이 (0) | 2023.01.03 |