서로 연관되어 있는 필드와 메서드를 한 데 묶어놓은 템플릿이다.
클래스에는 데이터가 없다. 클래스에 데이터를 넣어 메모리에 올린 것을 객체라고 한다.
// 클래스 정의
class Person {
constructor(name, age) { // 생성자 정의
this.name = name;
this.age = age;
}
speak() {
console.log (`${this.name} : Hello!`);
}
}
// 객체 생성
const john = new Person("john", 20);
console.log(john.name);
console.log(john.age);
john.speak();
객체를 만들 때 이상한 데이터를 넣지 않도록 하기 위한 방어적인 프로그래밍이 가능하도록 만들어주는 역할을 한다.
class User {
constructor(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
const user1 = new User("Steve", "Jobs", -1); // 잉?
console.log(user1.age); // -1 잉?
객체지향적으로 봤을 때 나이가 -1이라는 게 맞지가 않다. 게터와 세터를 통해 조정해줄 수 있다.
class User {
constructor(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
// 게터와 세터 안의 필드는 다른 필드를 쓴다.
get age() {
return this._age;
}
set age(value) {
this._age = value < 0 ? 0 : value;
}
}
const user1 = new User("Steve", "Jobs", -1);
console.log(user1.age); // 0 !!! 잘 해줬다.
private 필드는 클래스 내부에서만 값을 접근하고 변경할 수 있다. 외부에서는 불가능하다.
class Experiment {
publicField = 2;
#privateField = 0;
}
const experiment = new Experiment();
console.log(experiment.publicField);
console.log(experiment.privateField); // undefined
experiment.privateField = 3; // 적용이 안 된다.
객체에 상관없이, 객체의 데이터에 모든 해당 클래스의 객체에 동일하게 적용될 필드를 지정할 때 사용한다.
class Article {
static publisher = "John Yeah" // static 필드
constructor(articleNumber) {
this.articleNunber = articleNumber;
}
static printPublisher() { // static 메서드
console.log(Article.publisher);
}
}
const article1 = new Article(1);
const article2 = new Article(2);
console.log(article1.publisher); // undefind
console.log(Article.publisher); // "John Yeah"
Article.printPublisher(); // "John Yeah"