객체란, 프로그램을 구성하는 각 요소들을 말한다.
각 요소들인 객체를 유기적으로 연결하여 프로세스를 진행시키는 것이 객체 지향 프로그래밍이다.
추상화란, 클래스 등을 이용하여 많은 객체들의 공통부분을 미리 정의해놓고 돌려 쓰는 방법이다.(라고 나는 이해했다)
캡슐화는, 객체 안에 있는 수많은 변수 등등을 그룹화하여 묶는 것을 뜻한다. 추상화와도 상통하는 면이 있다. 캡슐 안과 밖을 구분하여 실제 사용자가 이용할 필요 없는 것들을 은닉 할 수 있다. 캡슐화 = 은닉 인 것은 아니지만, 캡슐화로 얻을 수 있는 큰 이점 중 하나가 정보 은닉인 것 같다.
상속은, 부모 개체에게서 자식 개체가 여러 특징을 물려받는 것을 뜻한다. 코드의 중복을 피하기 위해 쓸 수 있다.
폴리모피즘(다형성)은, 상속을 받은 속성에 대해 자식이 입맛대로 오버라이딩 하여 재활용 할 수 있는 개념이다. 각각을 새로 정의해 줄 필요가 없다는 장점이 있다.
그 이전에는, new Object()를 이용하여 객체를 생성하거나, 리터럴(중괄호)를 이용하여 바로 선언해버리거나, 혹은 함수를 이용하여 생성하곤 하였다. 함수를 생성하고 new를 붙여 선언하면 ES6의 class 키워드와 같은 원리로 작동한다.
function Foo(){
this.bar = 1;
}
let foo = new Foo();
console.log(foo.bar); // => 1
이런 식으로 사용한다.
js는 함수를 선언 시 기본적으로 함수의 Prototype Object도 같이 생성한다. 이 Prototype Object 안에 constructer와 __proto__
속성을 갖고 있으며, 일반적인 객체와 같이 취급 가능하다. .prototype이라는 속성을 통해 접근할 수 있다.
__proto__
속성은 함수 뿐만 아니라 js의 모든 객체가 갖고 있는데, new를 이용하여 객체를 선언하였을 경우 그 부모가 된 함수의 Prototype Object를 가리킨다. 그리하여 마치 class처럼 속성을 이용할 수 있는 것이다.
상속을 구현할 때,
함수 안에 call이나 aplly로 부모함수를 불러 this를 넣어준다.
그리고
Foo.prototype = Object.create(Bar.prototype);
Foo.prototype.constructor = Foo;
Foo.prototype.foo = function() {}
이런 식으로 Object.create를 이용하면 마치 배열을 .slice로 복사하는 것 처럼 복사해올 수 있다.
자신의 직계 부모에게 그 속성이 없을 경우 prototype을 타고 타고 올라가서 최상위까지 찾아보게 된다. 이것을 prototype chain이라 한다.