프로그래밍 패러다임은 프로그래머들에게 프로그래밍의 관점을 갖게 해주고 결정하게 해준다.
예를 들어, 객체지향 프로그래밍을 하는 개발자들은 프로그램을 상호작용하는 객체의 집합으로 본다. 반면에 함수형 프로그래밍을 사용한다면, 개발자는 프로그램을 함수값의 연속으로 생각한다.
▶️ 무엇(What)을 할 것인지 나타내기보다 어떻게(How) 수행할 명령을 순서대로 설명하는 방식
▶️ 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것
▶️ 컴퓨터 프로그램은 아니지만 요리법이나 공정 점검표같은 것들이 명령형 프로그래밍과 비슷한 개념
객체 지향형
[객체지향 자세한 설명🥰]
- 작은 부품인 객체를 만들고 이렇게 만들어진 객체들을 결합하여 하나의 프로그램을 만드는 방식
- 대표적 언어 : C++, Java, C#
절차 지향형
- 위에서부터 아래로 순차적으로 진행되어서 프로그램을 유기적으로 연결하는 방식
- 대표적 언어 : C, C++
▶️ 무엇(What)을 나타낼지에 대해서 관점을 두어서 프로그래밍을 수행하는 기법
▶️ 예를 들어, 웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사함
선언형 함수는 무엇(What)을 나타낼지에 대해서 관점을 두어서 프로그래밍을 수행한다
//명령형
let numbers = [2, 1, 12];
function multiply(numbers, multiplier) {
for (let i = 0; i < numbers.length; i++) {
numbers[i] = numbes[i] * multiplier;
}
}
//선언형
function multiply(number, multiplier) {
return number.map((num) => num * multiplier);
}
명령형 프로그래밍은 for문을 이용해서 numbers에 multiplier를 곱해주는 과정을 나타낸다.
반면 선언형은 for문 대신에 map이라는 함수형 코드를 사용한다.
**Javascript에서 함수형 프로그래밍을 사용한다면, filter,map,take,reduce 등의 함수형 코드를 사용한다.
함수의 내부에서 인자값을 변경하거나 프로그램 상태를 변경하는(side effect) 부작용이 없는 함수
-> 부수효과가 적다.
//순수함수가 아닌 경우
let num = 9494;
function add(a) {
return a + num;
}
// 순수함수
function add(a, b) {
return a + b;
}
순수함수가 아닌 경우는 num 값의 변화에 따라서 add함수의 결과값이 바뀐다. 반면 순수함수의 예시에서는 add함수가 프로그램 실행에 영향을 주지 않고, 입력값에 의해서만 값의 변화만 있다.
1급 객체 특징 :
//자바스크립트에서 함수는 일급 객체이기 때문에 변수를 저장할 수 있다.
//함수 표현식은 할당 전에 사용할 수 없다.
//square(7); // --> ReferenceError: Can't find variable : square
const square = function (num) {
return num * num;
}
// square에는 함수가 저장되어 있으므로 (일급 객체), 함수 호출 연산자 '()'를 사용할 수 있다.
output = square(7);
console.log(output); // -> 49
함수 자체가 일급객체이기 때문에 고차함수를 만드는게 가능해진다.
고차 함수(higer order function)는 함수를 인자(argument)로 받을 수 있고, 함수의 형태로 리턴할 수 있는 함수이다.
function tripple(num) {
return num * 3;
}
function trippleNum(func, num) {
return func(num);
}
//함수 trippleNum은 다른 함수를 인자로 받는 고차 함수이다.
//아래와 같은 경우, 함수 tripple은 함수 trippleNum의 콜백 함수이다.
let output = trippleNum(tripple, 5);
console.log(output); // -> 15;
function multiplier(multiply){
return function (num) {
return num * multiply;
}
}
//함수 multiply는 다른 함수를 리턴하는 고차 함수이다.
//multiplier는 인자를 한 개 입력받아서 함수(익명 함수)를 리턴한다.
//리턴되는 익명 함수는 인자 한 개를 받아서 multiply와 곱한 값을 리턴한다.
// multiplier(8)은 함수이므로 함수 호출 연산자 '()'를 사용할 수 있다.
let output = multiplier(8)(5); // -> 40
console.log(output); // -> 40
// javascript에서 함수는 일급 객체이기 때문에
// multiplier가 리턴하는 함수를 변수(output)에 저장할 수 있다.
const multiply1 = multiplier(7);
output = multiply1(3);
console.log(output); // -> 21
함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
//변하는 값
let person = { name: "song", age: "1999" };
function increaseAge(person) {
person.age = person.age + 1;
return person;
}
// 불변성 만족
const person = { name: "song", age: "2000" };
function increaseAge(person) {
return { ...person, age: person.age + 1 };
}
첫번 째 예시의 경우 increaseAge가 person의 age의 값을 변화시키므로 불변성을 만족시키지 못한다.
반면, 두번 째 예시는 원본 데이터를 변경하지 않고 데이터의 복사본을 만들어서 변경하고 return하고 있으므로 원본 데이터의 불변성을 유지하게 한다.
<장점>
<단점>
⑴람다 : 알론조 처치가 1930년대에 개발된 형식 체계로서, 계산가능성, 결정문제, 함수정의, 함수응용과 재귀를 연구하기 위해 탄생했다.
⑵부수효과 : 원래의 목적과 다르게 다른 효과 또는 부작용이 나는 상태
프로그래밍 패러다임 종류 그림
: https://adjh54.tistory.com/
프로그래밍 패러다임
1) https://adjh54.tistory.com/
2)
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84
3) https://medium.com/free-code-camp/my-favorite-examples-of-functional-programming-in-kotlin-e69217b39112
4) https://code-lab1.tistory.com/245
5) 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
6) 순수함수 코드 : https://mari-mo.tistory.com/83