개발 상식

[개발 상식] 객체지향(OOP) vs 절차지향(PP) with JS

kku_lurgi 2023. 10. 17. 21:22

 

이전에  객체지향과 절차지향에 대해서 공부했었는데, 클린 코드(로버트 C 마틴) 책 6장에서 다뤄지는 내용을 충분히 이해하고자 !! 다시한번!! 중요한 개념으로 생각되기에! 포스팅 해봅니다!!!

🤔객체지향 프로그래밍(OOP, Object-Oriented Programming)이란?

  • 소프트웨어 개발 패러다임 중 하나로, 객체(Object)와 그 객체들 간의 상호작용을 모델링하여 프로그램을 구성하는 방법론입니다.
  • 코드 재사용성과 유지보수성을 향상시키는 등의 장점을 가지고 있어 현대적인 프로그래밍 언어들에 널리 사용되고 있습니다.

🤔절차지향 프로그래밍(PP, Procedural Programming)이란?

  • 소프트웨어 프로그래밍 패러다임 중 하나로, 프로그램을 데이터와 프로시저(Procedure, 함수 또는 서브루틴)로 구성하여 문제를 해결하는 방법론 입니다.
  • 프로시저는 단계적으로 실행되는 명령문들의 모음이며, 이를 통해 문제를 단계적으로 처리하며 해결합니다.
  • 주로 초창기 사용된 프로그래밍 스타일입니다.

대충 설명은 이러한데… 개념을 제대로 파악하기 위해서 예를 한번 들어보겠습니다!

😎객체 지향 프로그래밍의 예

class Circle {
  #radius = 0;

  constructor(radius) {
    this.#radius = radius;
  }

  getRadius() {
    return this.#radius;
  }

  getDiameter() {
    return 2 * this.#radius;
  }

  getArea() {
    return this.getDiameter() * Math.PI;
  }
}

const CIRCLE = new Circle(3);
const AREA1 = CIRCLE.getArea();
console.log(AREA1); //CIRCLE의 넓이를 구한다.

대표적인 예를 class로 구현할 수 있겠는데요. 이는 함수 혹은 객체로도 사용 가능합니다.

필요한 객체의 개수만큼 Circle을 만들 수 있기 때문에 코드 재사용성에 용이하지만 메서드를 추가하는 것이 복잡하다는 단점이 있겠습니다.

😎절차 지향 프로그래밍의 예

const RADIUS = 3;

function getDiameter(radius) {
  const DIAMETER = 2 * radius;
  return DIAMETER;
}

function getArea(diamter) {
  const AREA = diamter * Math.PI;
  return AREA;
}

const DIAMETER = getDiameter(RADIUS);
const AREA2 = getArea(DIAMETER);
console.log(AREA2);

위 코드와 같이 위에서 아래로 내려오는 방식으로 절차적으로 진행되는 올드한 방법입니다. 함수를 추가하는 것도 쉽겠죠?

이는 단편적으로 봤을 땐 훨씬 이해가 쉽겠으나, 코드의 양이 증가함에 따라서 유지보수 측면에서 굉장히 어려움을 겪을 수 있습니다.

그래서 현대의 프로그래밍 방식에서는 객체지향 프로그래밍을 선호하지만, 상황에 따라서 사용하는 것이 좋겠습니다!

객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다. 자료 구조는 별다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다. 새로운 자료 타입을 추가하는 유연성이 필요하다면 객체를, 새로운 동작을 추가하는 유연성이 필요하다면 자료 구조와 절차적인 코드가 더 적합하다. - 클린 코드 6장 내용