🧹 ES6 클래스 문법 vs 기존 prototype 방식 – 차이와 내부 구조 비교
ES6(ECMAScript 2015)부터 자바스크립트에 class 문법이 도입되면서, 기존의 prototype 기반 객체 생성 방식이 훨씬 직관적으로 변했습니다.
하지만 내부적으로는 여전히 프로토타입 체인 위에서 동작한다는 점에서 본질은 동일합니다.
이번 글에서는 ES6 클래스 문법과 기존 prototype 방식의 차이점과 동작 방식의 유사성을 비교합니다.
1. ES5 – prototype 기반 객체 생성
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function () {
return `Hi, I'm ${this.name}`;
};
const p1 = new Person("Alice");
console.log(p1.sayHi()); // 👉 Hi, I'm Alice
Person
은 생성자 함수sayHi
는Person.prototype
에 정의됨- 모든 인스턴스는
__proto__
를 통해 해당 메서드에 접근
2. ES6 – class 문법 기반 객체 생성
class Person {
constructor(name) {
this.name = name;
}
sayHi() {
return `Hi, I'm ${this.name}`;
}
}
const p2 = new Person("Bob");
console.log(p2.sayHi()); // 👉 Hi, I'm Bob
- 훨씬 직관적이고 익숙한
OOP 스타일
- 내부적으로는 여전히 prototype에 메서드를 정의
3. 클래스와 함수 방식의 내부 구조 비교
console.log(typeof Person); // 👉 "function"
console.log(Person.prototype.sayHi); // 👉 함수 존재 (prototype에 저장됨)
클래스도 결국 함수로 동작하며, 메서드는 prototype에 저장됩니다.
즉, 문법이 달라졌을 뿐 프로토타입 기반 구조는 동일합니다.
4. class 문법의 주요 특징
- 생성자 함수는 constructor()로 정의
- 메서드는 prototype에 자동으로 등록
- 클래스는 호이스팅되지 않음 (선언 전에 사용 불가)
new
없이 호출하면 오류 발생
const p = Person("Charlie"); // ❌ TypeError: Class constructor Person cannot be invoked without 'new'
5. 클래스 상속도 프로토타입 체인을 활용
class Animal {
speak() {
return "Generic sound";
}
}
class Dog extends Animal {
speak() {
return "Bark!";
}
}
const d = new Dog();
console.log(d.speak()); // 👉 "Bark!"
Dog
는 Animal
의 프로토타입을 상속받습니다.
extends
는 내부적으로 Object.setPrototypeOf()
로 연결됩니다.
6. class 문법 vs prototype 방식 비교
항목 | class 문법 (ES6) | prototype 기반 (ES5) |
---|---|---|
문법 | 간결하고 명확한 OOP 스타일 | 함수 + prototype 조합 |
메서드 위치 | 자동으로 prototype에 저장 | 직접 prototype에 추가 |
호출 시 | new 필수 |
new 없이 호출 가능 (권장 X) |
상속 | extends , super() |
prototype 연결 수동 처리 |
📌 마무리
ES6 클래스 문법은 자바스크립트를 더 객체지향적으로 표현할 수 있도록 추상화한 문법입니다.
그러나 내부적으로는 기존의 prototype
기반 구조와 동일하게 동작하며, 표현 방식만 달라졌을 뿐 핵심 원리는 같습니다.
다음 글에서는 extends와 super를 활용한 클래스 상속 구조를 상세히 설명하고,
실제 메서드 오버라이딩과 super 호출 타이밍까지 함께 살펴보겠습니다.
'language > javascript' 카테고리의 다른 글
🧹 private, static, getter/setter 실전 예제 – ES6 클래스 고급 문법 정리 (0) | 2025.05.10 |
---|---|
🧹 클래스 상속 구조 완전 정리 – extends와 super() 사용법 (0) | 2025.05.10 |
🧹 프로토타입 체인과 __proto__, prototype의 차이 완전 정리 (0) | 2025.05.10 |
➕ NaN, undefined, null 완전 정리 – 차이점과 주의사항 (0) | 2025.05.10 |
➕ Truthy / Falsy 값 정리와 예외 케이스 – 자바스크립트 조건문의 핵심 (0) | 2025.05.10 |
댓글