객체 지향 프로그래밍의 기초가 되는 용어부터 설명해보자.
객체 지향 프로그래밍은 하나의 모델이 되는 청사진(blueprint)을 만들고, 그 청사진을 바탕으로 한 객체(object)를 만드는 프로그래밍 패턴이다.

앞서 언급된 청사진은 자동차 생산을 위한 설계도에 비유된다. 자동차가 기능하기 위해서는 네 바퀴와 핸들, 좌석 그리고 엔진이 필요할 것이다. 이러한 기본적인 설계는 차의 종류에 상관없이 대체적으로 동일하게 적용된다.
이런 설계도(청사진)를 바탕으로 각각의 객체가 특정한 자동차 모델로 나오게 되는 것이다.
하나의 모델이 되는 청사진, 바로 이것이 클래스(class)가 되는 것이고, 그 청사진을 따라 만들어진 것이 객체이면서 그 클래그의 인스턴스(instance)가 된다.
클래스는 간단히 말해보자면 '틀'이라고 생각한다. 무언가를 만들 때, 그대로 찍어낼 수 있는 '틀' 말이다.

하나의 틀(클래스)를 가지고 여러개의 인스턴스를 만들 수 있다. 각각 만들어진 인스턴스들은 개별적인 요소(색깔 등)을 갖지만, 공통된 클래스를 가졌다는 점에서 여러가지들(모양, 형태 등)을 공유한다.
클래스를 만드는 방법은 크게 두가지가 있다. 하나는 ES6 도입 이전에 사용하던 함수를 사용하는 방식이고, 나머지 하나는 ES6 이후에 만들어진 클래스(class)생성자를 이용한 방식이다.
두 방식 모두 일반 함수와 구분하기 위해 클래스는 보통 맨 앞글자는 대문자로 만든다.
생성자 함수
// ES5 function Car(brand, name, color){ } //ES6 class Car { constructor(brand, name, color){ } }속성 정의
//ES5 function Car(brand, name, color){ this.brand = brand; this.name = name; this.color = color; } //ES6 class Car { constructor(brand, name, color){ this.brand = brand; this.name = name; this.color = color; } }매소드 정의
//ES5 function Car(brand, name, color) { } Car.prototype.refuel = function() { } Car.prototype.drive = function(){ } //ES6 class Car { constructor(brand, name, color) {} refuel(){ } drive(){ } }
let avante = new Car('hyundai', 'avante', 'black');
avante.color; // 'black'
avante.drive(); // 매소드 호출
클래스를 만드는 것만으로는 아무일도 일어나지 않는다. 그 클래스의 인스턴스를 만들어야 클래스를 기반으로 한 객체가 만들어진다. 클래스로 객체를 만들 때 필요한 것이 new 키워드이다.
