[모딥다] 번외)객체지향 프로그래밍(OOP)과 함수형 프로그래밍(FP) 비교해보기

조정현·2025년 6월 23일

드디어 모딥다 프로토타입 파트를 들어갔다.
천천히 이해하면서 넘어가던중 파트 초반에 나온 자바스크립트는 함수형 프로그래밍, 객체지향 프로그래밍을 지원하는 멀티 패러다임 언어이다.
라는 말에 궁금증이 생겨서 이것저것 찾아봄.

객체지향 프로그래밍과 함수형 프로그래밍

객체지향 프로그래밍(Object-Oriented Programming, OOP)이란, 상태와 동작을 하나의 객체에 묶어서 관리하는 방식을 말한다.

함수형 프로그래밍(Functional Programming, FP)이란, 상태를 가지지 않고 같은 값을 넣었을 때 같은 값을 출력하는 순수함수로 데이터를 변형하는 방식을 말한다.

이렇게만 봤을땐 그래서 뭐가 다른건데?! 싶어서 지피티한테 예시코드를 내놓으라했다.

// 객체지향 프로그래밍
class MealOrder {
  constructor() {
    this.total = 0;
  }

  addItem(price) {
    this.total += price;
  }

  applyDiscount(percent) {
    this.total *= (1 - percent / 100);
  }

  pay() {
    console.log(`총 결제 금액은 ${this.total.toFixed(0)}원입니다.`);
    this.total = 0; // 초기화
  }
}

const order = new MealOrder();
order.addItem(12000);   // 된장찌개
order.addItem(8000);    // 김치찌개
order.applyDiscount(10); // 10% 할인
order.pay(); // 총 결제 금액은 18000원입니다.
// 함수형 프로그래밍
const addItem = (total, price) => total + price;

const applyDiscount = (total, percent) =>
  total * (1 - percent / 100);

const pay = (total) => {
  console.log(`총 결제 금액은 ${total.toFixed(0)}원입니다.`);
  return 0; // 결제 후 초기화
};

let total = 0;
total = addItem(total, 12000);  // 된장찌개
total = addItem(total, 8000);   // 김치찌개
total = applyDiscount(total, 10); // 10% 할인
total = pay(total); // 총 결제 금액은 18000원입니다.

이렇게 보니 좀 이해가 간다!

객체지향 프로그래밍 예시에서 class 문법이 나오는데, 매번 이 class에 대해 이해하고 넘어간 적이 없어 찾아보니 익숙한 생성자함수와 닮아있었다.
생각해보니 프로토타입 파트 초반에 class는 생성자함수의 문법적 설탕이라고 했지!!!
알고보니 이 생성자함수는 ES5까지만 쓰이고 ES6부터 객체지향 프로그래밍엔 class가 사용된다고 한다.

그래서 지피티한테 생성자함수가 더 익숙한데 조진거냐 물어보니

역시 지피티야 듣기 좋은 말만 해준다니까!
어차피 class도 결국엔 생성자함수로 트랜스파일돼서 같은거라고 한다.
그러면서 퀴즈도 내 줌

생성자함수 <-> class 변환 예제

// class -> 생성자함수 변환
class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

// 생성자함수 -> class 변환
function Car(model) {
  this.model = model;
}
Car.prototype.drive = function () {
  console.log(`${this.model} is driving`);
};

// class -> 생성자함수 변환
class Counter {
  constructor() {
    this.count = 0;
  }

  increment() {
    this.count++;
  }

  getCount() {
    return this.count;
  }
}

// 생성자함수 -> class 변환
function Book(title, author) {
  this.title = title;
  this.author = author;
}
Book.prototype.describe = function () {
  return `${this.title} by ${this.author}`;
};


// class -> 생성자함수 변환
class Timer {
  constructor(duration) {
    this.duration = duration;
  }

  start() {
    console.log(`Timer started for ${this.duration}ms`);
  }

  stop() {
    console.log(`Timer stopped`);
  }
}

이 글을 보고 있는 사람이 있다면 한번 풀어보쉬길...

그래서 언제 어떻게 쓰는데?

내가 이해한 바로는 이렇다.
객체지향 프로그래밍은 사용자 관리 등 이미 구조화된 상태를 관리할 때 유리하고,
함수형 프로그래밍은 데이터의 계산, 처리, 필터링 등을 관리할 때 유리하다.

이제 class가 뭔지 알았으니 코드 짤 때도 활용해보는 식으로 익숙해져봐야겠다..!

0개의 댓글