Computer/Design-Pattern

OOP (Object-Oriented Programming)

Happhee.dev 2023. 2. 28. 18:02

✨ 객체지향 프로그래밍이란?

프로그래밍하려는 대상을 하나의 객체(=사물)로 정의하는 설계 방법이다.

다시 말해, 객체의 관점에서 단순히 자료 구조가 아닌 기능을 포함한 메소드를 형태로 객체를 만들고 사용하는 방법이다.

그래서 객체들간의 상호작용을 통해 로직을 만들 수 있게 된다.

⚠️ 주의사항 ⚠️

객체지향 프로그래밍의 반대 === 절차지향 프로그래밍

아니다! 객체지향 프로그래밍도 절차가 있고, 절차지향 프로그래밍도 객체를 다룬다.


✨ 특징

✅ 추상화

불필요한 정보는 숨기고 중요한 정보만을 나타내 프로그래밍을 간단하게 구현하는 것이다.

✅ 캡슐화

변수와 함수를 하나로 묶어 낮은 결합도를 유지할 수 있도록 설계하는 것이다.
더불어 캡슐화를 통해 정보은닉을 활용할 수도 있다.

✅ 상속

상위 클래스의 속성과 행위를 하위클래스가 물려받아 상위 클래스의 데이터와 연산을 이용할 수 있게 하는 것이다.

재사용으로 인한 코드가 줄어들고, 자료와 메서드의 자유로운 사용과 추가가 가능하다.
하지만, 상위 클래스의 변경이 어려워지고 불필요한 클래스가 증가할 수 있다는 것이 단점이다.

✅ 다형성

어떠한 요소에 여러가지 개념을 넣어, 하나의 변수 또는 함수명이 상황에 따라 다른 의미로 해석되는 것이다.

여기서 등장하는 개념이 오버라이딩과 오버로딩이다.

  • 오버라이딩
    👉 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용
  • 오버 로딩
    👉 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하도록 사용

🖥 Javascript로 이해하기

  1. prototype기반의 객체 만들기
function Bread(title, quantity, isLike) {
  this.title = title;
  this.quantity = quantity;
  this.isLike = isLike;
}

const happheeBread = new Bread("소금빵", 2, true);

console.log(happheeBread.hasOwnProperty("title")); //true

hasOwnProperty()라는 메소드를 통해 Object.prototype에 접근이 가능하다는 것을 알 수 있다.

  1. Object.prototype을 활용한 OOP 구현
Bread.prototype.getBreadTitle = function () {
  return this.title;
};
Bread.prototype.setBreadTitle = function (title) {
  this.title = title;
};

happheeBread.setBreadTitle("스코니");
console.log(happheeBread); // Bread { title: '스코니', quantity: 2, isLike: true }

prototype도 결국 객체이기에 getter, setter를 할당할 수 있고, 이를 prototype chain을 통해 구현하여싿.

  1. 정보은닉 구현
const Bread = function (userInput) {
  let title = userInput ? userInput : "소금빵";

  return {
    getName: function () {
      return title;
    },
    setName: function (userInput) {
      title = userInput;
    },
  };
};
const happheeBread = new Bread("소금빵");

console.log(happheeBread.title); // undefined
console.log(happheeBread.getName()); //  소금빵

앞서 살펴보았지만 Javascript에서는 클로저를 통해 캡슐화(= 정보은닉)를 구현한다.


🌈 정리

객체지향 프로그래밍을 통해 모듈화를 구현할 수 있다. 그래서 업무 분담이 편리하고 대규모 소프트웨어 개발에 적합하다고 볼 수 있다.
하지만, Javascript와 온전히 맞는 패러다임이라고 보기엔 조금 어렵다.
그래서 코드의 재사용성, 간결한 문법의 장점을 살려 함수형 프로그래밍이 가지고 있는 장점과 적절하게 결합하는 것이 Javascript에서 객체지향 프로그래밍을 올바르게 사용한 것이라고 할 수 있다.

📚 참고자료