
저번 포스팅에서 다뤘던 배열 메소드 fill()과 from()
fill은 왜 Array.prototype.fill()이고 from은 Array.from()일까요?
이 차이는 프로토타입 메서드와 정적 메서드이기 때문에 나타납니다.
프로토타입 메서드는 클래스의 인스턴스에서 호출할 수 있는 메서드입니다. (JS는 프로토타입이지만.. 쉽게 설명하기 위해😉)
각 인스턴스는 프로토타입 체인을 통해 해당 메서드를 공유하고, this는 메서드를 호출한 인스턴스를 가리킵니다.
instance의 뜻을 찾아보면 사례, 경우라고 합니다.
예를 들어, 클래스는 자동차라는 일반적인 개념, 틀과 같습니다.
인스턴스는 myCar라는 객체, 즉, 일반적인 개념을 바탕으로 '실재하는 구체적인 한가지 사례'가 됩니다.
정적 메서드는 클래스 자체에서 호출할 수 있는 메서드입니다. static 키워드를 붙여 정의하며 인스턴스 생성 없이 클래스명으로 직접 호출합니다. this는 클래스 자체를 가리킵니다.
class Calculator {
constructor(value) {
this.value = value;
}
static double(num) {
// ❌ this.value에 접근 불가
// return this.value * 2;
// ✅ 매개변수로 받은 값만 사용 가능
return num * 2;
}
}
const calc = new Calculator(10);
// ❌
calc.double(5); // TypeError: calc.double is not a function
// ✅
Calculator.double(5); // 10
사실 이미 정적 메서드를 아주 흔하게 사용하고 계실 것 같습니다.
Math.max(...);
Array.isArray(...);
Object.keys(obj);
Promise.all();
Number.isNaN(NaN);
JSON.parse(jsonStr);
class를 안쓰고 만들어보면 차이점이 확실히 보입니다.
// 1. 생성자 함수 정의
function Car(name) {
// 인스턴스의 고유한 속성
this.name = name;
}
// 2. 프로토타입 메서드 정의
// 이렇게 정의된 메서드는 모든 Car 인스턴스가 공유합니다.
Car.prototype.drive = function() {
console.log(`${this.name}이(가) 달립니다!`);
};
// 3. 정적 메서드 정의
// 이 메서드는 인스턴스가 아닌, Car라는 생성자 자체에 속합니다.
Car.drive = function(carName) {
console.log(`${carName}이(가) 달립니다!`);
};
// 프로토타입 메서드 사용
const myCar = new Car('Tesla');
myCar.drive(); // "Tesla이(가) 달립니다!"
// 정적 메서드 사용
const yourCar = Car.drive('Hyundai');
어떤 메서드를 선택해야 할지 고민될 때는 이렇게 질문해 보세요.
'이 메서드가 특정 인스턴스에 속해야 하는가?'
만약 '네'라고 답했다면 prototype 메서드를 '아니오'라고 답했다면 static 메서드가 정답일 가능성이 높습니다.
포스팅 읽어주셔서 감사합니다🙇