클래스에서 정의한 메서드들이 인스턴스에 중복적으로 만들어 질 때 인스턴스 레벨의 메서드 즉, 인스턴스 메서드 라고 한다.
class Fruit {
constructor(name, emoji) {
this.name = name;
this.emoji = emoji;
}
display = () => {
console.log(`${this.name}: ${this.emoji}`);
};
}
const apple = new Fruit('apple', '🍎');
// Fruit { display: [Function: display], name: 'apple', emoji: '🍎' }
const orange = new Fruit('orange', '🍊');
// Fruit { display: [Function: display], name: 'orange', emoji: '🍊' }
apple.display(); // apple 인스턴스를 통해 호출
orange.display();
인스턴스 메서드는 클래스안에서 접근, 호출이 불가능하며, 꼭 생성된 인스턴스 객체를 통해 접근하고 호출해야한다.
클래스별로 동일하게 사용할 수 있고 만들어진 인스턴스의 데이터를 참조할 필요가 없는 경우에는 클래스 레벨의 메서드 즉, static 메서드를 사용할 수 있다.
인스턴스 메서드와의 차이는 객체 생성없이 호출이 가능하다는 것.
// static 정적 프로퍼티, 메서드
class Fruit {
constructor(name, emoji) {
this.name = name;
this.emoji = emoji;
}
// 클래스 레벨의 메서드
static makeRandomFruit() {
// 클래스 레벨의 메서드에서는 this를 참조할 수 없음
return new Fruit('banana', '🍌');
//
}
display = () => {
console.log(`${this.name}: ${this.emoji}`);
const banana = Fruit.makeRandomFruit();
console.log(banana);
이처럼 static 메서드를 이용하면 클래스에 한번만 정의하고 재사용할 수 있으며, Fruit.makeRandomFruit() 클래스 레벨에 있는 메서드를 호출할 수 있다.
인스턴스 마다 변경되야 할 데이터가 아니라 클래스 레벨에서 공통적으로 사용할 수 있는 속성과 메서드에는 static을 붙여주는게 좋다.
좋은 예로는 표준 빌트인 객체가 있다.
Math.pow();
Number.isFinite(1);
빌트인 객체는 다양한 정적 메서드를 가지고 있는데, 이를 유틸리티 함수라고 한다. 유틸리티 함수들을 묶어서 관리할 수 있고, 반복적으로 사용하므로 작업이 간편하다.