들어가면서
자바스크립트 객체와 C++ 클래스의 차이점은 두 언어의 철학과 구조적 차이에서 비롯된다.
자바스크립트는 동적 언어로 객체를 자유롭게 정의하고 다룰 수 있는 기능이 풍부하며, 프로토타입 기반의 상속 방식을 사용한다.
반면, C++은 정적 타입 언어로 클래스 기반의 객체 지향 프로그래밍에 최적화되어 있다.
C++ 객체와 자바스크립트 객체의 주요 차이점
객체 생성과 클래스 개념의 차이
C++
C++에서는 클래스를 정의하고 그 클래스로부터 객체를 생성한다.
클래스는 엄격한 설계를 기반으로 메모리 구조가 고정되며, 컴파일 시 클래스에 대한 모든 정보가 명확해진다.
예를 들면, class 키워드를 사용하여 클래스의 틀을 정의하고, 이를 통해 객체를 생성해야한다.
▷C++의 객체 정의는 반드시 class 키워드를 사용하여 정의해야한다.
자바스크립트
자바스크립트는 원래 클래스 개념 없이도 객체를 정의할 수 있는 언어였다.
객체 리터럴 방식으로 { }을 사용하여 즉석에서 객체를 만들 수 있다.
자바스크립트는 프로토타입 기반의 상속을 사용해 동적 할당이 가능하며, 자바스크립트는 모든 객체가 다른 객체를 상속 받아 확장할 수 있는 구조이다.
ES6(ECMAScript 2015)부터 자바스크립트에서도 class 키워드가 도입되어 클래스 기반 정의가 가능해졌지만, 실제로는 문법적 설탕(syntactic sugar)일 뿐 내부적으로는 프로토타입 기반 상속을 사용한다.
class Person{
constructor(name) {
this.name = name;
}
great() {
console.log(`Hello, $(this.name)`);
}
}
const person = new Person('Alice');
person.great(); // Hello, Aclice
자바스크립트에서 class 문법은 편의성을 제공하지만, C++의 클래스처럼 엄격한 타입 검사나 컴파일 시간 타입 고정은 없다.
상속 구조 : 프로토타입 vs 클래스 기반
C++
C++는 클래스 기반 상속을 사용하며, 상속받은 클래스를 통해 다형성을 구현할 수 있다.
다중 상속을 지원하기도 한다.
C++ 클래스는 명확한 메모리 레이아웃을 가지고 있으며, 상속 관계는 컴파일 시간에 결정된다.
상속 관계에서 객체는 virtual 키워드를 통해 메서드 오버라이딩을 구현하고, 다형성을 확보한다.
자바스크립트
자바스크립트는 프로토타입 기반 상속을 사용한다. 모든 객체는 프로토타입을 통해 다른 객체로부터 메서드와 속성을 상속받는다.
자바스크립트 객체는 __proto__라는 숨겨진 속성으로 연결된 체인을 통해 상속 관계를 유지하며, 이를 통해 프로토타입 체이닝을 구현한다.
다형성을 구현할 때 별도의 가상 함수 테이블이 존재하지 않으며, 동적 바인딩을 통해 객체의 메서드를 탐색하여 실행한다.
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + " make a noise");
}
const animal = new Animal("dog");
animal.speak(); // dog makes a noise
메모리 관리와 동적 속성 추가
C++
C++에서는 객체의 메모리 구조가 컴파일 시점에 결정되며, 객체 생성 시 미리 메모리를 할당한다. 속성을 동적으로 추가하는 것은 불가능하다.
클래스의 모든 멤버 변수가 고정되어 있으며, 동적 메모리 할당은 new와 delete로 개발자가 직접 메모리 관리를 할 수 있다.
자바스크립트
자바스크립트는 객체에 속성을 동적으로 추가 및 삭제할 수 있다. 모든 객체는 동적 구조를 가지며, 객체 생성 후에도 새로운 속성을 자유롭게 추가하거나 삭제할 수 있다.
자바스크립트의 메모리 관리는 가비지 컬렉터에 의해 자동으로 이루어진다.
const car = { make : "Toyota" };
car.model = "Corolla";
console.log(car);
캡슐화와 접근 제한자
C++
C++은 public, protected, private와 같은 접근 제한자를 사용해 클래스 멤버의 접근 수준을 정의한다. 이를 통해 캡슐화를 엄격하게 제어할 수 있다.
외부에서 접근 불가한 속성들은 보안성 및 데이터 무결성을 높인다.
자바스크립트
자바스크립트는 전통적으로 접근 제한자가 없었지만, ES6 이후부터 #을 사용한 프라이빗 필드(private field)를 지원한다.
그 외에는 모든 속성이 기본적으로 public이며, 이를 완전하게 감출 수 있는 방법은 없다. 하지만, 클로저(closure)를 활용하여 비공개 속성처럼 사용할 수 있는 방식이 있다.
class Car {
#engine; //private 필드
constructor(make, model) {
this.make = make;
this.model = model;
this.#engine = "V8";
}
getEngine() {
reuturn this.#engine;
}
}
const car = new Car("Toyota", "Carmry");
console.log(car.make);
console.log(car.getEngine());
특징 | C++ | 자바스크립트 |
상속 구조 | 클래스 기반 상속 | 프로토타입 기반 상속 |
타입 시스템 | 정적 타입 | 동적타입 |
접근 제한자 | public, protected, private | 기본적으로 public (#으로 private 지원) |
동적 속성 추가 | 불가 | 가능 |
가비지 컬렉션 | 수동 관리(new/delete) | 자동(가비지 컬렉터 사용) |
정리
자바스크립트는 유연한 구조와 동적 객체 생성을 특징으로 하며, 프로토타입을 통해 객체를 확장하는 방식이기 때문에 객체 지향의 관점에서 매우 자유롭다. 반면, C++은 강력한 타입 안정성과 메모리 제어가 가능하여 시스템 프로그래밍이나 성능 최적화가 필요한 작업에 적합하다.
'Javascript' 카테고리의 다른 글
[Javascript] 함수의 종류 (0) | 2024.11.05 |
---|---|
[Javascript] 콜백함수란? (0) | 2024.04.02 |
[Javascript] 자바스크립트 언어의 특성 | 비동기, async/await 문법 (0) | 2024.04.02 |
[nodeProject] 학교 공지사항 제목 크롤링 | puppeteer, Express.js (0) | 2024.04.01 |
JS : 객체 지향과 클래스 선언하기(인스턴스,생성자,상속) (0) | 2023.11.18 |