서로 연관되어 있는 필드와 메서드를 한 데 묶어놓은 템플릿이다.

클래스에는 데이터가 없다. 클래스에 데이터를 넣어 메모리에 올린 것을 객체라고 한다.

클래스 정의와 객체 생성

// 클래스 정의
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 !!! 잘 해줬다.

public & private

private 필드는 클래스 내부에서만 값을 접근하고 변경할 수 있다. 외부에서는 불가능하다.

class Experiment {
	publicField = 2;
  #privateField = 0;
}

const experiment = new Experiment();
console.log(experiment.publicField);
console.log(experiment.privateField);  // undefined

experiment.privateField = 3;  // 적용이 안 된다.

static

객체에 상관없이, 객체의 데이터에 모든 해당 클래스의 객체에 동일하게 적용될 필드를 지정할 때 사용한다.

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"