LHJ

I'm a FE developer.

9.2.4 정적 메서드

10 May 2020 » js_lj

지금까지 우리는 인스턴스 메서드, 즉 인스턴스에서 사용하게끔 만든 메서드를 주로 살펴봤습니다.
메서드에는 인스턴스 메서드 외에도 정적 메서드(클래스 메서드) 가 있습니다.
이 메서드는 특정 인스턴스에 적용되지 않습니다.
정적 메서드에서 this는 인스턴스가 아니라 클래스 자체에 묶입니다.
하지만 일반적으로 정적 메서드에는 this 대신 클래스 이름을 사용하는 것이 좋은 습관입니다.

정적 메서드는 클래스에 관련되지만 인스턴스와는 관련이 없는 범용적인 작업에 사용됩니다.
예제로 자동차 식별 번호(VIN)을 붙이는 메서드를 생각해 봅시다.
개별 자동차가 자신만의 VIN을 생성한다는 것은 불가능합니다.
다른 자동차에 같은 VIN이 이미 부여됐는지 자동차가 어떻게 알겠습니까?
VIN을 할당한다는 것은 자동차 전체를 대상으로 하는 추상적인 개념이므로 정적 메서드로 사용하는 게 어울립니다.
정적 메서드는 여러 인스턴스를 대상으로 하는 작업에도 종종 쓰입니다.
예를 들어 두 자동차의 제조사와 모델이 모두 같으면 true를 반환하는 areSimilar 메서드, 두 자동차의 VIN이 같으면 true를 반환하는 areSame 메서드를 만들어 봅시다.

class Car {
	static getNextVin() {
		return Car.nextVin++; // this.nextVin++ 라고 써도 되지만,
		                      // Car를 앞에 쓰면 정적 메서드라는 점을
													// 상기하기 쉽습니다.
	}
	
	constructor(make, model) {
		this.make = make;
		this.model = model;
		this.vin = Car.getNextVin();
	}
	
	static areSimilar(car1, car2) {
		return car1.make === car2.make && car.model === car2.model;
	}
	static areSame(car1, car2) {
		return car1.vin === car2.vin;
	}
}
Car.nextVin = 0;

const car1 = new Car("Tesla", "S");
const car2 = new Car("Mazda", "3");
const car3 = new Car("Mazda", "3");

car1.vin; // 0
car2.vin; // 1
car3.vin; // 2

Car.areSimilar(car1, car2); // false
Car.areSimilar(car2, car3); // true
Car.areSame(car2, car3); // false
Car.areSame(car2, car2); // true