자바스크립트는 명령형(imperative), 함수형(functional), 프로토타입 기반(prototype-based) 객체지향 프로그래핑(OOP: Object Oriented Programming)을 지원하는 멀티 패러다임 프로그래밍 언어다.
1. 명령형(Imperative)
명령형 프로그래밍은 컴퓨터에게 실행해야 할 명령문들의 목록을 명시적으로 작성하여 원하는 결과를 얻기 위해 프로그램의 흐름을 직접 제어하는 방식이다. JS는 변수, 조건문, 반복문 등을 사용하여 명령형 프로그래밍을 지원한다. 아래는 예
let numbers = [1, 2, 3, 4, 5];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
console.log(sum); // 출력: 15
명령형으로 배열인 numbers의 각 요소를 순회하면서 합계를 계산하는 과정을 보여준다.
vs 선언형 프로그래밍?
원하는 결과를 얻기 위해 "무엇(what)"을 달성해야 하는지를 선언하는 방식이다. 어떻게(how) 달성 할지에 대한 구체적인 구현을 명시하지 않는다.
let numbers = [1, 2, 3, 4, 5];
let sum = numbers.reduce((acc, cur) => acc + cur, 0);
console.log(sum); // 출력: 15
reduce 함수를 사용해 간단하게 배열 요소를 축수하고 합계를 계산했다. 어떻게 계산하는지를 명시하지 않고 구체적인 구현은 숨겨져 있다. 명령형은 상태와 명령문을 직접 조작하여 문제를 해결하는 방식이며, 선언형 프로그래밍은 문제를 선언하고 추상화된 도구나 함수를 사용하여 문제를 해결하는 방식이다.
2. 함수형(functional)
함수형 프로그래밍은 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미한다.
함수형 프로그래밍 언어로 설계된 클로저,스칼라,하스켈 등의 언어가 있고, 자바스크립트,코틀린,파이썬 등에도 최근 버전에 함수형 프로그래밍 문법이 추가 되었다.
함수형 프로그래밍의 특징
1. 순수함수 (Pure function)
동일한 입력에는 항상 같은 값을 반환해야 하는 함수
함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
참고: https://developer-jm.tistory.com/182
2. 비상태, 불변성 (Stateless, Immutability)
함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
// increaseAge 함수에서 전역으로 선언된 person의 age속성을 변경하므로 불변성 유지를 만족하지 못함.
let person = { name: "jeongmin", age: "24" };
function increaseAge(person) {
person.age = person.age + 1;
return person;
}
// 비상태, 불변성 만족
const person = { name: "jeongmin", age: "24" };
function increaseAge(person) {
return { ...person, age: person.age + 1 };
}
3. 일급객체
https://developer-jm.tistory.com/159
4. 고차함수
함수를 인자로써 전달 할 수 있어야 한다.
함수의 반환 값으로 또 다른 함수를 사용 할 수 있다
// 고차 함수
const addInform = (name) => (age) => age + name;
const jeongmin = addInform("정민");
console.log(jeongmin("00")); // 00정민
그 밖에도
함수 조합 (Function Composition): 함수를 조합하여 더 복잡한 동작을 구현한다. 작은 함수들을 조합하여 큰 함수를 만들어 코드를 모듈화하고 재사용성을 높일 수 있다.
선언적인 스타일 (Declarative Style): 함수형 프로그래밍은 "무엇(what)"을 표현하는 방식에 집중한다. 코드는 "어떻게(how)" 동작하는지 보다는 원하는 결과를 어떻게 얻을지를 선언적으로 표현한다.
데이터 중심 프로그래밍 (Data-Centric Programming): 함수형 프로그래밍은 데이터를 중심으로 코드를 작성한다. 데이터를 변환하고 조작하는 함수를 작성하여 원하는 결과를 얻는다.
재귀 (Recursion): 함수형 프로그래밍은 재귀를 통해 반복문을 대체하는 경우가 많다. 재귀는 코드의 간결성과 추상화를 높여준다.
지연 평가 (Lazy Evaluation): 필요한 시점까지 연산을 미루는 지연 평가를 활용하여 효율적인 계산을 수행할 수 있다.
상태 관리의 효율화: 불변성과 순수 함수를 활용하여 상태 변경을 효율적으로 관리한다. 이는 병렬 처리와 상태 관리의 복잡성을 감소시킬 수 있다.
병렬성과 분산 처리: 함수형 프로그래밍은 부작용이 없고 불변성을 지향하기 때문에 병렬 처리와 분산 처리에 이점을 가질 수 있다. 함수형 코드는 상태 공유에 의한 부작용을 피하므로 여러 프로세스 또는 스레드에서 안전하게 실행될 수 있다.
자 본론으로 넘어가서, 자바스크립트는 객체 기반의 프로그래밍 언어이며 거의 "모든 것"이 객체이다. 원시 타입을 제외한 나머지 값들(함수, 배열, 정규 표현식 등)은 모두 객체다.
객체 지향 프로그래밍
프로그램을 명령어 또는 함수의 목록으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러 개의 독집적 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다. 속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조를 객체라하며, 객체지향 프로그래밍은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임이다.
사람을 이름, 주소, 성별, 나이, 직업 등과 같이 속성을 구체적으로 표현하면 특정한 사람을 인식하거나 구별할 수 있다. 이러한 방식을 프로그램에 접목시켜보자. 사람에게는 다양한 속성이 있으나 프로그램에서는 사람의 이름과 주소라는 속성에만 관심이 있다고 가정하자. 이처럼 다양한 속성 중에서 프로그램에 필요한 속성만 간추려 내어 표현하는 것을 추상화(abstraction)라 한다.
원이라는 개념을 객체로 만들어보자. 반지름은 원의 상태를 나타내는 데이터이며, 원의 지름, 둘레, 넓이를 구하는 것은 동작이다.
const circle = {
radius: 5,
getDiameter() {
return 2 * this.radius;
},
getPerimeter() {
return 2 * Math.PI * this.radius;
},
getArea() {
return Math.PI * this.radius ** 2;
}
getArea2() {
return Math.PI * Math.pow(this.radius, 2);
}
};
console.log(circle);
// {radius: 5, getDiameter: ƒ, getPerimeter: ƒ, getArea: ƒ}
console.log(circle.getDiameter()); // 10
console.log(circle.getPerimeter()); // 31.41592653589793
console.log(circle.getArea()); // 78.53981633974483
이처럼 객체지향은 객체의 상태를 나타내는 데이터와 조작할 수 있는 동작을 하나의 논리적인 단위로 묶어 생각한다. 따라서 객체는 상태 데이터와 동작을 하나의 논리적인 단위로 묶은 복합적인 자료구조이다. 이때 상태 데이터를 프로퍼티, 동작을 메서드라 부른다.
'개발자의 공부 > JS' 카테고리의 다른 글
[JS문법] 배열1 (0) | 2023.10.04 |
---|---|
[JS] class란? (0) | 2023.01.02 |
[JS문법] 일급 객체 (0) | 2022.12.26 |
[JS]생성자 함수에 의한 객체 생성 (0) | 2022.12.19 |
[JS]얕은 복사와 깊은 복사 (0) | 2022.09.29 |