클래스(class)는 하나의 모델이 되는 청사진(blueprint)이다. 인스턴스 객체(instance object)는 이 청사진을 바탕으로 한 객체이다. 클래스와 인스턴스를 이용한 프로그래밍 패턴을 객체 지향 프로그래밍이라고 한다.
class는 생성자 함수(constructor)를 만들 때 사용한다. ES6부터
class
키워드를 사용하기 시작했다.class Car { constructor(brand, name, color) { //코드 } }
new
키워드는 새로운 인스턴스를 만들 때 사용한다. 위에서 정의한 Car함수를new
키워드를 사용해서 인스턴스로 생성할 수 있다.let avante = new Car('hyundai', 'avante', 'white'); let mini = new Car('bmw', 'mini', 'brown');
각각의 인스턴스는 Car라는 클래스의 고유한 속성과 메소드를 갖는다.
스탠드를 만들어보자. 스탠드의 속성에는 색깔, 크기, 가격 등이 있을 것이고, 메소드에는 스위치 등이 있을 것이다.
▶ 캡슐화(Encapsulation) : 데이터와 기능을 느슨한 결합으로 묶는다. 느슨한 결합이란 코드 실행 순서에 따라 절차적으로 작성하는 것이 아닌, 코드가 실제를 상징하도록 모아서 결합하는 것을 이야기한다.
▶ 상속(Inheritance) : 기본 클래스(base class)의 특징을 파생 클래스(derive class)가 상속받는다. 여기서 기본 클래스는 부모, 파생 클래스는 자식이라고 부르기도 한다.
▶ 추상화(Abstraction) : 인터페이스(interface)를 단순화하여 예기치 않은 사용으로 인한 변화를 막을 수 있다.
▶ 다형성(Polymorphism) : 동일한 메소드를 객체의 특성에 맞게 달리 적용할 수 있다.
Yes ! 🤗
프로토타입(Prototype)은 원형 객체이다. 속성과 메소드들은 각 객체가 아니라 객체의 생성자의 prototype이라는 속성에 정의되어 있다.
class Human { constructor(name, age) { this.name = name; this.age = age; } sleep() { console.log(`${this.name}은 잠에 들었습니다`); } } Human.prototype; // {constructor: ƒ, sleep: ƒ}
상속 구현을 위해 프로토타입 체인을 사용한다. 프로토타입 체인은 다른 객체에서 정의된 메소드와 속성을 한 객체에서 사용할 수 있게끔 해준다. 이를 위해
extend
,super
키워드를 사용한다. 위에서 정의한 Human 객체를 상속받은 Student를 만들어보자.class Student extends Human { constructor(name, age, school, major) { super(name, age); this.school = school; this.major = major; } }
Yes ! 😏
위에서 말했듯이 프로토타입 체인은 상속을 구현하기 위해 사용된다.
__proto__
로 부모 클래스의 프로토타입, 부모의 부모 클래스의 프로토타입을 탐색할 수 있다.