클래스는 class 키워드를 사용하여 정의한다.
클래스 이름은 생성자 함수와 마찬가지로 파스칼 케이스를
사용하는 것이 일반적이다.
class Person {
//생성자
constructor(name) {
//인스턴스 생성 및 초기화
this.name = name;
}
//프로토타입 메서드
sayHi() {
console.log(`Hi! My name is ${this.name}`);
}
//정적 메서드
static sayHello() {
console.log('Hello!');
}
}
const person1 = new Person('Lee');
person1.sayHi(); // Hi! My name is Lee
Person.sayHello(); // Hello!
클래스는 생성자 함수이며 new 연산자와 함께 호출되어 인스턴스를 생성한다.
class Person {}
const person1 = new Person();
클래스는 인스턴스를 생성하는 것이 유일한 존재 이유이므로
반드시 new 연산자와 함께 호출해야 한다.
클래스를 가리키는 식별자(Person)을 사용해 인스턴스를 생성해야 한다.
constructor는 인스턴스를 생성하고 초기화하기 위한 특수한 메서드이다.
➡️ 객체를 여러 개 복사하고 싶을 때 사용함
class Person {
constructor(name) {
this.name = "Jeong";
this.address = "Seoul";
}
}
const person1 = new Person();
console.log(person1); // Person {name: "Jeong", address: "Seoul"}
class Person {}
const person1 = new Person();
console.log(person1); //{}
//생성자 함수
function Person(name) {
this.name = name;
}
//프로토타입 메서드
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.name}`);
};
const person1 = new Person('Lee');
console.log(person1);
person1.sayHi(); // Hi! My name is Lee
class Person {
constructor(name) {
this.name = name;
}
//프로토타입 메서드
sayHi () {
console.log(`Hi! My name is ${this.name}`);
}
}
const person2 = new Person('Kim');
person2.sayHi(); // Hi! My name is Kim
정적(static) 메서드는 인스턴스를 생성하지 않아도 호출할 수 있는 메서드를 뜻한다.
class Person {
constructor(name) {
this.name = name;
}
static SayHi() {
console.log('Hi~!');
}
}
Person.sayHi(); // Hi
인스턴스 프로퍼티는 constructor 내부에서 정의해야 한다.
class Person {
constructor(name) {
//인스턴스 프로퍼티
this.name = name;
this.lastName = "Jeong";
}
}
접근자 프로퍼티는 자체적으로 값을 갖지 않고 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티이다.
const person = {
//데이터 프로퍼티
firstName : "mujin",
lastName : "Kim",
get fullName() {
return `${this.lastName} ${this.firstName}`;
},
set fullName(name) {
[this.lastName,this.firstName] = name.split(' ');
}
};
//setter 함수 호출
person.fullName = "Lee Jieun";
console.log(person); // {firstName: 'Jieun', lastName: 'Lee'}
//getter 함수 호출
console.log(person.fullName); // 'Lee Jieun'
접근자 함수는 getter 함수와 setter 함수로 구성되어 있다.
getter는 인스턴스 프로퍼티 값을 조작할 때 사용되며, setter은 인스턴스 프로퍼티에 값을 할당할 때 사용한다.
getter/setter는 메서드 이름 앞에 get/set 키워드를 사용해 정의한다.
getter는 반드시 무언가를 return해야 하고 setter는 무언가를 프로퍼티에 할당해야 하므로 반드시 매개변수가 있어야 한다.
상속에 의한 클래스 확장아느 기존 클래스를 상속받아 새로운 클래스를 확장하여 정의하는 것이다.
extends 키워드를 사용해 상속받을 클래스를 정의한다.
클래스를 복사한다고 생각하면 쉽다.
class Father{
constructor(name){
this.lastName = 'Kim';
this.name = name;
}
}
//생성자 함수를 상속받는 서브클래스
class Son extends Father {
constructor(){
super(name);
this.age = 25;
}
}
const son1 = new Son('민수');
console.log(son1); //{age: 25,lastName: "Kim",name: "민수"}
super 키워드는 물려받는 클래스의 constructor를 호출한다.super 키워드는 물려받는 클래스(= 수퍼클래스)의 constructor를 호출한다.
class Base {
constructor(a,b) {
this.a = a;
this.b = b;
}
}
//서브 클래스
class Derived extends Base {
constructor(a,b,c) {
super(a,b);
this.c = c;
}
}
const derived1 = new Derived(1,2,3);
console.log(derived1);
❗❗주의사항
서브클래스의 constructor에서 super를 호출하기 전에는 this를 참조할 수 없다.
서브클래스에서 constructor를 생략하지 않는 경우 서브클래스의 constructor에서 반드시 super를 호출해야 한다.
super는 반드시 서브클래스의 constructor에서만 호출한다.
서브클래스가 아닌 클래스의 constructor나 함수에서 호출하면 에러가 발생한다.
☑️ super 참조
메서드 내에서 super를 참조하면 수퍼클래스의 메서드를 호출할 수 있다.
class Base {
constructor(a,b) {
this.a = a;
this.b = b;
}
printParameter(){
console.log(this.a,this.b);
}
}
class Derived extends Base {
constructor(a,b,c) {
super(a,b);
this.c = c;
}
}
const Derived1 = new Derived(1,2,3);
console.log(Derived1); // Derived {a: 1, b: 2, c: 3}
Derived1.printParameter(); // 1 2