✨ 객체지향 프로그래밍이란?
프로그래밍하려는 대상을 하나의 객체(=사물)로 정의하는 설계 방법이다.
다시 말해, 객체의 관점에서 단순히 자료 구조가 아닌 기능을 포함한 메소드를 형태로 객체를 만들고 사용하는 방법이다.
그래서 객체들간의 상호작용을 통해 로직을 만들 수 있게 된다.
⚠️ 주의사항 ⚠️
객체지향 프로그래밍의 반대 === 절차지향 프로그래밍
아니다! 객체지향 프로그래밍도 절차가 있고, 절차지향 프로그래밍도 객체를 다룬다.
✨ 특징
✅ 추상화
불필요한 정보는 숨기고 중요한 정보만을 나타내 프로그래밍을 간단하게 구현하는 것이다.
✅ 캡슐화
변수와 함수를 하나로 묶어 낮은 결합도를 유지할 수 있도록 설계하는 것이다.
더불어 캡슐화를 통해 정보은닉을 활용할 수도 있다.
✅ 상속
상위 클래스의 속성과 행위를 하위클래스가 물려받아 상위 클래스의 데이터와 연산을 이용할 수 있게 하는 것이다.
재사용으로 인한 코드가 줄어들고, 자료와 메서드의 자유로운 사용과 추가가 가능하다.
하지만, 상위 클래스의 변경이 어려워지고 불필요한 클래스가 증가할 수 있다는 것이 단점이다.
✅ 다형성
어떠한 요소에 여러가지 개념을 넣어, 하나의 변수 또는 함수명이 상황에 따라 다른 의미로 해석되는 것이다.
여기서 등장하는 개념이 오버라이딩과 오버로딩이다.
- 오버라이딩
👉 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용 - 오버 로딩
👉 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하도록 사용
🖥 Javascript로 이해하기
- 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에 접근이 가능하다는 것을 알 수 있다.
- 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을 통해 구현하여싿.
- 정보은닉 구현
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에서 객체지향 프로그래밍을 올바르게 사용한 것이라고 할 수 있다.
📚 참고자료
'Computer > Design-Pattern' 카테고리의 다른 글
Declarative 👉 Functional (0) | 2023.02.28 |
---|---|
MVC Pattern (0) | 2023.02.22 |