객체 지향 프로그래밍은
하나의 모델이 되는 청사진(blueprint) -> Class 를 만들고,
그 청사진을 바탕으로 한 객체를 만드는 -> Instance 프로그래밍 패턴이다.
예를 들어서 청사진은 커피머신 생산을 위한 설계도에 비유된다. 커피머신이 기능하기 위해서는 원두를 갈고, 추출하고, 우유를 스팀하는 것 등이 필요한데 이러한 기본적인 설계는 커피머신의 종류와는 상관없이 대체적으로 동일하게 적용된다.
이런 설계도를 바탕으로 각각의 객체가 특정한 커피머신으로 만들어지게 된다.
Class(청사진)를 바탕으로 한 객체는 인스턴스 객체(Instance Object) 줄여서 인스턴스(instance)라고 부른다.
prototype이라는 키워드를 사용해야 메서드를 정의
할 수 있다. CoffeeMachine.prototype.grind
과 같이 prototype
을 이용해야 한다.여기서 위의 함수는 객체지향 프로그래밍에서 생성자(constructor) 함수라고 부르는데 인스턴스가 만들어 질 때 실행되는 코드이고, 생성자 함수는 return 값을 만들지 않는다.
ES6에서는 생성자 함수와 함께 class 키워드 안쪽에 묶어서 정의할 수 있다. grind() {}
, extract() {}
, steam() {}
와 같이 작성되어 있는 부분이다.
new 키워드를 통해 클래스의 인스턴스를 만들어 낼 수 있다.
인스턴스를 만들 때 new 키워드를 사용하여 만들면 즉시 생성자 함수가 실행되고, 변수에 클래스의 설계를 가진 새로운 객체, 인스턴스가 할당된다.
각각의 인스턴스에는 클래스에서 정의한 고유한 속성과 메서드를 갖게 된다.
종류 | 설명 |
---|---|
prototype | 모델의 청사진을 만들 때 사용하는 원형 객체(original form) |
constructor | 인스턴스가 초기화 될 때 실행되는 생성자 함수 |
this | 함수가 실행될 때, 해당 scope마다 생성되는 고유한 실행 context(execution context) new 키워드로 인스턴스를 생성했을 때는 해당 인스턴스가 this가 된다. |
class의 유용한 예제로 배열을 살펴볼 수 있다.
배열은 전부 Array의 인스턴스로 속성, 메서드 사용법이 동일하다.
배열 메서드(pop, push, reduce...)등을 mdn에서 살펴보면 메서드들이 대부분 Array.prototype.{해당 메서드명}과 같이 되어있는 것을 확인할 수 있는데 이는 모든 메서드들이 클래스의 원형 객체(prototype)에 정의되어 있기 때문이다.