클래스는 ES6에 추가된 기능임
- 클래스가 없었을 때에는 function을 이용해서 바로 object를 만들었다(이게 prototype)
- 기존 프로토타입 기반으로 하며 간편하게 쓸 수 있도록 문법적으로만 추가되었다고 해서 문법적 설탕(Syntatic sugar)이라고 한다. (여전히 클래스도 프로토타입 기반이다)
클래스 몸체에서 정의할 수 있는 메소드
- constructor(생성자)
- 프로토타입 메소드(일반 메소드)
- 정적 메소드(static)
class Person {
// 생성자를 이용해서 데이타를 전달한다.
constructor(name, age) {
// filed
this.name = name;
this.age = age;
}
// method
speak() {
console.log(`${this.name}: hello`);
}
}
const yoon = new Person("yoon", 25);
console.log(yoon.name); // yoon
console.log(yoon.age); // 25
yoon.speak(); // yoon: hello
Person
이라는 클래스를 만들고 constructor
→ 생성자 를 이용해서 값을 전달한다.const yoon = new Person('yoon', 25)
에 의해서 yoon
이라는 값에 해당 값이 전달되었다.yoon
이라는 변수 뒤에 .
을 이용하여 참조한다.get
과 set
키워드를 써서 작성한다.get
은 property를 읽을 때 동작된다.set
은 property에 값을 쓸 때 호출된다.get
함수는 파라미터 값을 가질 수 없다.set
함수는 한개의 파라미터를 가져야 한다.getter, setter를 이해하기 쉬운 이야기
- 자판기 = class
- 자판기에는 커피가 있지
- 커피 개수 = 프로퍼티
- 동전을 넣고, 커피를 만들고 = 메소드
- 커피 개수가 마이너스인게 맞을까 안맞을까? 당연히 안맞지 그러니까 getter, setter를 쓰는거지
- 사용자가 마음대로 커피 개수를 설정하는게 좋을까 안좋을까 안좋으니까 private로 만드는거지
class User {
constructor(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
// constructor의 this.age가 getter 호출
get age() {
return this._age;
}
// constructor의 age가 setter 호출
set age(value) {
this._age = value < 0 ? 0 : value; //나이는 음수가 없으므로, 삼항 연산자 처리함
}
}
const user1 = new User("Steve", "Jobs", -1);
console.log(user1.age); // -1
age
를 _age
로 선언한 것은 무한콜백 오류를 방지하기 위함#
를 붙이면 클래스 내부에서만 사용가능하고 외부에서는 값을 읽을 수도 변경할 수도 없는 private으로 정의할 수 있다.
class Experiment {
publicField = 2;
#privateField = 0;
}
const experiment = new Experiment();
console.log(experiment.publicField); // 2
console.log(experiment.privateField); // undefined
class Article {
static publisher = "Dream Coding";
constructor(articleNumber) {
this.articleNumber = articleNumber;
}
static printPublisher() {
console.log(Article.pusblisher);
}
}
const article1 = new Article(1);
const article2 = new Article(2);
console.log(article1.pusblisher); // undefined → object는 복사되지만 static은 할당 않됨
console.log(Article.pusblisher); // Dream Coding
Article.printPublisher(); // Dream Coding
extends
키워드를 사용하여 상속 후 기존의 class의 값을 모두 접근하여 사용할 수 있다.class Shape {
constructor(width, height, color) {
this.width = width;
this.height = height;
this.color = color;
}
draw() {
console.log(`drawing ${this.color} color!`);
}
getArea() {
return width * this.height;
}
}
class Rectangle extends Shape {}
class Triangle extends Shape {
draw() {
super.draw(); // 부모 메소드 호출
console.log("🔺");
}
getArea() {
return (this.width * this.height) / 2;
}
}
const rectangle = new Rectangle(20, 20, "blue");
rectangle.draw(); // drawing blue color!
console.log(rectangle.getArea()); // 400
const triangle = new Trinangle(20, 20, "red");
triangle.draw(); // drawing red color! 🔺
console.log(triangle.getArea()); // 200
A instanceof B
선언되며, A
의 object가 B
class의 instance인지 확인 후 true
, false
반환 한다.
console.log(rectangle instanceof Rectangle); // true
console.log(triangle instanceof Rectangle); // false
console.log(triangle instanceof Triangle); // true
console.log(triangle instanceof Shape); // true (상속)
console.log(triangle instanceof Object); // true (모든 object는 Object를 상속)