결론부터 말하자면...!
자바스크립트는 멀티-패러다임 언어로 명령형, 함수형, Prototype 기반의 객체 지향 언어이다.
자바스크립트를 이루고 있는 거의 모든 것이 객체이며,
자바스크립트가 클래스가 없어서 객체지향이 아니라고 생각하겠지만 프로토타입 기반의 객체지향 언어임을 주의하자!
✨ 자바스크립트에서 객체 생성 방법
- 객체 리터럴
- Object( ) 생성자
- 생성자 함수
총 3가지이다.
const object1 = {};
object1.name = "서히";
const object2 = new Object();
object2.name = "지수";
function ObjectFunction(name) {
// 👇 프로퍼티
this.name = name;
}
const object3 = new ObjectFunction("CS스터디");
이처럼 자바스크립트는 이미 생성된 객체의 자료구조와 기능을 사용자의 요구에 맞게 동적으로 접근할 수 있다.
그래서 객체 지향의 특징인 상속, 캡슐화를 프로토타입 체인과 클로저로 구현할 수 있는 것이다.
✨ 상속, 추상화 , 다형성 구현
자바스크립트에서 상속은 받는다는 개념보다 찾아가는 개념으로 이해하는 것이 편하다.
아래 예제를 통해 이해해보자.
const happhee = {
name: "서히",
hobby: "dance",
dance: function () {
console.log("개발하고 춤추는게 조아");
},
};
const bread = {
name: "빵수니",
hobby: "맛잇게 구워지기",
yummy: function () {
console.log("소금빵이 너므 조아🍞");
},
};
happhee.__proto__ = bread;
happhee.yummy(); //소금빵이 너므 조아🍞
happhee.dance(); //개발하고 춤추는게 조아
happhee에 존재하지 않지만 연결된 bread를 찾아가서 yummy를 호출하여 상속 구현할 수 있게 되었다.
자바스크립트가 처음 등장했을때는 class의 개념이 존재하지 않았다.
그래서 수준이 낮고 언어의 단순성때문에 저평가 받은 것이었다.
하지만 개발의 세계에서 class라는 개념이 계속해서 많이 요구하는 문법적인 기능이었기에 ES6에서도 class가 정식 문법으로 지정된것이다.
때문에 ES6의 class는 자바스크립트의 객체지향인 prototype을 class처럼 보이도록 하기 위한 도구가 되었다.
🤔 그럼 이제 우리는 어떻게 Javascript에서 객체지향을 해야 할까?
앞서 말했지만, 자바스크립트가 처음 등장했을때는 class도 존재하지 않았다. 우리가 알고 있는 객체지향 프로그래밍의 이론이나 설명은 Java의 사용성이 극대화되었을때 등장한 개념이고, ES6에서 Javascirpt에 적용되었기에, 자바스크립트는 이러한 객체지향 개념을 완전히 배제 또는 극단적인 수용까지는 필요하지 않다.
다만, 객체지향의 장점을 살려 데이터와 메소드를 통해 독립적인 작은 프로그램으로 기능을 구현하면서 재사용성을 높이는 방향으로 개발함과 동시에 객체 의존성을 높이지 않게 결합함에 주의하며 Javascript를 올바르게 사용해야 한다.