프로그래밍 패러다임

프로그래밍 패러다임

  • 간단하게 프로그래밍 스타일을 의미하며 전체적인 프로그래밍 방식을 말한다.

  • 프로그램은 순차, 분기, 반복, 참조로 구성되어지며 프로그램 개발을 위하여 전략을 수립해야 한다.

  • 위에서 말한 전략은 어떤 언어를 사용할지, 프로그래밍에서 어떤 것을 지양하고, 지양할지 등등 다양한 방법을 수립하게 된다. 여기서 말한 전략에 해당하는 내용들이 프로그래밍 패러다임이다.

  • 대표적인 프로그래밍 패러다임에는 절차적, 객체지향, 함수형 프로그래밍이 존재한다.


명령형 프로그래밍

문제를 어떻게 해결해야 하는지 컴퓨터에게 명령을 내리는 방법의 프로그래밍이다.

대표적으로 절차적 프로그래밍과, 객체지향 프로그래밍이 있다.

let a = [1, 2, 3, 4, 5];

for(let i = 0; i < 5; i += 1) {
  if(a[i] % 2 === ) {
    console.log(a[i]);
  }
}

1. 절차(순차)적 프로그래밍

  • 단어 그대로 절차(순차)적인 명령 수행뿐만 아니라, 프로시저 호출의 개념을 바탕으로 하고 있는
    프로그램 패러다임입니다.

  • C언어가 대표적인 절차적 프로그래밍 언어라고 불리고 있습니다.

const stringNumber = '12345';
let sum = 0;

for (let i = 0; i < stringNumber.length; i += 1) {
  sum += stringNumber[i] - '0';
}

2. 객체지향 프로그래밍

  • 최소 단위가 객체이며, 객체를 만들고, 이 객체를 사용하여 데이터와 메소드를 묶고 소통하는 프로그래밍 방식이다.

  • Java(자바)가 대표적인 객체지향 프로그래밍 언어라고 불리고 있습니다.

  • 직관적이며, 유지보수가 쉽습니다.

function Stringnumber(string) {
  this.string = string;
}

Stringnumber.prototype.calculate = () => {

  this.sum = 0;

  for (let i = 0; i < stringNumber.length; i++) {
    this.sum += stringNumber[i] - '0';
  }
};

function Printer(result) {
  console.log(this.result);
}

Printer.prototype.log = function() {
  console.log(this.result);
}

const stringNumber = new Stringnumber('12345');

stringNumber.calculate();

const printer = new Printer(stringNumber.sum);

printer.log();

선언형 프로그래밍

무엇을 어떻게 해결해야 하는지 집중하고 해결 방법은 컴퓨터에게 위임하는 방법

대표적으로 함수형 프로그래밍이 있다.

[1, 2, 3, 4, 5]
  .filter((item) => item % 2 === 0)
  .forEach((item) => console.log(item));

함수형 프로그래밍

  • 최소 단위가 함수이며, 함수를 통하여 새로운 데이터들을 만들어가며 파이프 형태로 프로그래밍하는 방식이며 선언형 프로그래밍 방식과 비슷하다.

  • 모든 데이터의 처리를 수학적 함수(function)의 계산으로 취급하여 결과 값을 받아보고자 하는 패러다임입니다.

  • 함수 단위로 나눠지므로 재사용성이 높다.

  • Immutability을 지향하기에 동작을 예측하기 쉽고 Side Effects를 방지한다.

Immutability(불변성) ?

immutable 객체(변할 수 없는 객체)는 생성된 이후에는 바꿀 수 없는 객체이다.

불변성은 함수형 프로그래밍의 핵심 개념이다. 불변성이 없다면 프로그램의 데이터 흐름이 손실된다.

Side Effects(부작용)

함수형 프로그래밍에서 부작용은 함수 반환 값을 제외하고 함수 호출 외부에서 볼 수 있는 상태 변경을 뜻한다.

함수형 프로그래밍 규칙에 따르면 함수는 함수 외부의 상태를 수정할 수 없게 다룬다.

  • Side Effects를 방지하므로 동시성 문제도 해결된다.
const stringNumber = '12345';

console.log(
  stringNumber
    .split('')
    .map((x) => parseInt(x))
    .reduce((acc, cur) => acc + cur)
);

멀티 패러다임

  • JavaScript는 결국 멀티 패러다임이 가능하다.
  • 각 패러다임의 장점을 활용하여 같이 쓰도록 하자.
const strNumber = '12345';

// strNumber 객체에 split, map, reduce 함수들이 객체에 포한되어진 경우
console.log(
  strNumber
  	.split('')
  	.map(x => parseInt(x))
  	.reduce((x, y) => x + y);
);


참고자료

좋은 웹페이지 즐겨찾기