객체지향(OOP)의 특징 4가지
1. Encapsulation(캡슐화)
1-1 절차지향의 언어를 객체지향으로 바꾸어준다.
1-2 속성(prototype)과 기능(method)을 캡슐화 한다.
//데이터와 기능을 하나의 단위로 묶음
1-3 구현 숨기기 및 동작 노출
//구현 방법은 숨기고 동작 방식만 노출시킨다.
1-4 느슨한 결합 : 언제든지 구현 수정
1-5 복잡도 감소, 재사용율 증가
ex)
let age = 0;
let food = 'jelly';
let color = 'pink';
//속성(property)
function eat() {
return 'Mmmmmmmmm jelly'
}
//기능(method)
class Grub {
constructor() {
this.age = 0;
this.food = 'jelly';
this.color = 'pink';
}
//속성
eat() {
return 'Mmmmmmmmm jelly';
}
//기능
}
let aGrub = new Grub;
aGrub.eat();
//"Mmmmmmmmm jelly"
//객체 지향 언어로 바꿔준다.
//method를 constructor 안에 넣어줄 수 있지만,
//인스턴스로 사용할 때마다 기능을 불러와서 메모리 효율이 떨어질 수 있다.

2. Inheritance(상속화)
2-1 부모의 특징(속성 및 기능)을 물려받는다.
//extands, super()키워드 사용
2-2 부모의 특징을 부분적으로 변경 및 추가를 할 수 있다.
2-3 똑같은 코드를 계속 사용하지 않게 함
ex)
class Bee extands Grub{
//extands 키워드를 통해 base가 되는 class선택
constructor() {
super();
//Grub의 속성을 가져오는 코드
this.age = 5;
this.color = 'yellow';
this.job = 'Keep on growing';
//Grub의 속성을 수정, 및 추가
}
}
ex2)
class HoneyMakerBee extends Bee {
constructor() {
super();
this.age = 10;
this.job = "make honey";
this.honeyPot = 0;
}
makeHoney() {
this.honeyPot++
}
giveHoney() {
this.honeyPot++
}
//기능 추가
}
//base(부모)의 특징을 물려받고(자식), 자식의 특징을 물려받는 자식을 만들 수 있다.
//constructor()과 super()에 인자를 넣어 특정한 특징만 받아올 수 있다.

***pseudoclassical로 클래스를 정의 할때는, Object.create()키워드를 이용한다.
ex)
Bee.prototype = Object.create(Grub.prototype)
//똑같은 속성을 가진 prototype를 복사해서 새로운 prototype을 생성한다.
//자식의 prototype의 수정은 부모의 prototype에 영향을 끼치지 않는다.
Bee.prototype.constructor = Bee
//끊어져있던 Bee의 prototype를 재정의해준다.
3. Abstraction(추상화)
3-1 사용자가 이용하기 편리하다.
3-2 인터페이스가 간단해 보인다(가독성이 좋다.)
3-3 복잡도 감소, 변경의 영향을 받지않게 한다.

4. Polymorphism(다형성)
4-1 여러가지의 형태가 있다.
4-2 오버라이딩
//자식class에서 super()를 사용하지 않고 사용할 수 있다.
4-3 오버러딩
//인자의 개수를 다르게해서 구현한다.
4-4
***현재 자바스크립트에서는 불가능한 기능
