Javascript - 객체지향 프로그래밍과 함수형 프로그래밍의 차이

객체지향 프로그래밍과 함수형 프로그래밍의 차이가 무엇이고 어떤 프로그래밍이 좋은 방법인 걸까요. 객체지향 프로그래밍이 좋다? 함수형이 좋다? 재미있게도 최근의 프로그래밍 언어들을 보면 함수형 프로그래밍은 객체지향 프로그래밍의 패러다임을 따라가고 객체지향 프로그래밍은 함수형 프로그래밍 패러다임을 따라갑니다. 프로그래밍 방식이 저마다의 장단점을 지니고 있기 때문에 이런 현상이 일어난다고 생각합니다. 결국 어떤 프로그래밍이 좋다고 단정 짓기는 어렵습니다. 

 

 객체지향 프로그래밍과 함수형 프로그래밍 사이에서 어떤 프로그래밍 방식이 좋다는 결론을 내리지 못해도 적어도 두 프로그래밍 방식 간의 차이는 알고 있는 게 좋습니다. 자바스크립트를 사용하면 손쉽게 객체지향이나 함수형 프로그래밍을 할 수 있습니다. 오늘은 간단한 예제 코드를 통해 객체지향 프로그래밍과 함수형 프로그래밍 차이에 대해서 알아보도록 하겠습니다.

객체지향 프로그래밍 (OOP: Object Oriented Programming)

 객체지향 프로그래밍(OOP)이란 프로그래밍하려는 대상을 하나의 객체(사물)로 정의하는 설계 방법으로 객체의 관점에서 구조를 만들고 사용하는 방법입니다. 조금 더 구체적인 설명을 덧 붙이자면 단순한 자료 구조(변수)를 넘어서 기능(메서드)을 포함한 형태로 객체를 사용하는 프로그래밍입니다. 객체지향을 지원하는 언어는 여러 가지가 있지만 대표적인 언어로는 Java, C# 등이 있습니다. 그러면 Javascript를 이용해 객체지향 프로그래밍 코드를 확인해보도록 하겠습니다.

function Car() {
  this.power = false;
  this.position = 0;
}

Car.prototype.start = function() {
  this.power = true;
  console.log('자동차 시동');
}

Car.prototype.moveTo = function(position) {
  console.log(`자동차 이동 = 현재 위치: {${this.position}}`);

  if (!this.power) {
    console.log('자동차의 시동이 꺼져있습니다.');
    return;
  }

  this.position = position;
  console.log(`자동차 이동 = 이동 위치: {${this.position}}`);
}

const car = new Car();
car.start();
car.moveTo(10);

 예제 코드는 Javascript에서 지원하는 prototype을 이용해서 객체를 정의하고 사용하는 내용입니다. 결과적으로 객체지향 프로그래밍은 객체를 정의(변수와 메서드)하고 객체를 생성해서 만들어진 객체를 사용하는 것을 의미합니다. prototype을 써서 객체를 정의하고, new Car()를 이용해 객체를 만들고 "."을 이용해 객체가 가지고 있는 기능(메서드)을 썼던 것처럼 말이죠.

함수형 프로그래밍 (FP: Functional Programming)

 함수형 프로그래밍(FP)은 프로그래밍하려는 문제를 함수들의 정의와 조합을 통해서 해결하는 프로그래밍 방법입니다. 조금 바꿔 말하면 함수의 개념을 최우선적으로 사용해서 모든 문제를 해결하는 프로그래밍 기법입니다. 그렇기 때문에 함수형 프로그래밍이 가지는 장점은 언제든 결과가 동일한 함수를 사용할 수 있고 그 함수를 이용해 조합 성을 높일 수 있다는 점입니다. 정확히는 순수 함수가 가지는 장점과 같습니다.

function start(car) {
  car.power = true;
  console.log('자동차 시동');
}

function moveTo(car, position) {
  console.log(`자동차 이동 = 현재 위치: {${car.position}}`);

  if (!car.power) {
    console.log('자동차의 시동이 꺼져있습니다.');
    return;
  }

  car.position += position;
  console.log(`자동차 이동 = 이동 위치: {${car.position}}`);
}

const car = { power: false, position: 0 };
start(car);
moveTo(car, 10);

 이 예제 코드는 함수만을 이용해서 자동차를 만들고 움직이게 하는 내용입니다. 객체지향에서 제시했던 예제 코드와 달리 객체가 가진 기능을 사용하지 않고 오롯이 함수를 정의하고 함수를 조합함으로써 결과를 만들어냈음을 알 수 있습니다. Car는 정의하지 않고 JSON 값과 함수를 정의하고 사용할 뿐입니다. 그리고 이 예제 코드는 객체지향적인 코드와 함수형 코드에 차이점을 부각하기 위해 불변함(Immutable)에 대한 내용을 빼고 정의하였습니다.

코드로 비교해보는 객체지향과 함수형의 차이점

 객체지향 프로그래밍과 함수형 프로그래밍이 가지는 차이점은 설계의 관점이 다르다는 점입니다. 객체지향은 "객체" 중심의 설계를 하는 반면 함수형은 "함수" 중심의 설계를 한다는 것입니다. 그럼 코드를 통해서 확인해볼까요?

// 객체지향 프로그래밍
car.start();
car.moveTo(10);

// 함수형 프로그래밍
start(car);
moveTo(car, 10);

 프로그래밍에서 객체지향으로 설계하는 방법은 Car와 같이 객체를 설계하고 생성해서 객체를 사용합니다. 함수 방식으로 설계된 방법에서는 객체와는 무관하게 함수로 문제를 접근하고 해결합니다. 이렇듯 관점이 다르기 때문에 두 가지의 방식이 가지는 프로그래밍 패러다임이 매우 다르다는 것을 알 수 있습니다.

Immutable 한 함수형 프로그래밍

 앞서 보여드린 함수형 프로그래밍 예제에서 한 가지 빠졌다고 이야기드렸던 부분은 바로 불변함(Immutable)입니다. 스프레드 연산자를 이용하면 손쉽게 불변성을 가진 코드를 만들 수 있는데요. 예제 코드를 통해 불변성을 포함한 코드를 만들면 다음과 같은 코드를 만들 수 있습니다.

function start(car) {
  console.log('자동차 시동');

  return { ...car, power: true };
}

function moveTo(car, position) {
  console.log(`자동차 이동 = 현재 위치: {${car.position}}`);

  if (!car.power) {
    console.log('자동차의 시동이 꺼져있습니다.');
    return;
  }

  const newPosition = car.position + position;
  console.log(`자동차 이동 = 이동 위치: {${newPosition}}`);

  return { ...car, position: newPosition };
}

let car = { power: false, position: 0 };
car = start(car);
car = moveTo(car, 10);

 

 이 글에서 사용한 예제 코드의 내용은 Github를 통해서도 확인하실 수 있습니다.

반응형

댓글

Designed by JB FACTORY