
자바스크립트는 명령형, 함수형, 프로토타입 기반, 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어이다. 하지만 C++이나 JAVA 등의 클래스 기반 객체지향 프로그래밍 언어와는 조금 다른 프로토타입 기반의 프로그래밍 언어이다. 프로토타입이라는 개념을 정리하기 전에 객체 지향 프로그래밍이 무엇인지에 대해 정리하고 넘어가도록 하자.
객체 지향 프로그래밍이란 소프트웨어 설계의 패러다임 중 하나로, 프로그램을 여러 개의 독립적인 객체로 구성하여 개발하는 방식
클래스는 객체를 생성하기 위한 청사진(템플릿)이다.
클래스는 프로퍼티와 메서드를 정의하여 어떤 종류의 객체가 만들어질지를 규정한다.
// Car 클래스 정의
class Car {
constructor(brand, color) {
this.brand = brand; // 속성
this.color = color; // 속성
}
drive() { // 메서드
console.log(`${this.brand} is driving.`);
}
}
클래스에는 프로퍼티(변수)와 메서드(함수)가 정의된다. 여기서 프로퍼티는 객체가 가지는 데이터(ex. 자동차의 색상, 모델명)를 의미하고, 메서드는 객체가 수행할 수 있는 동작(ex. 운전하기, 멈추기 등)을 의미한다.
인스턴스는 클래스라는 설계도를 기반으로 만들어진 구체적인 '실체'를 의미한다.
new 키워드를 사용하여 인스턴스를 생성한다.Car 클래스를 사용해 new Car('Kia', 'Red')로 만든 자동차 인스턴스는 Kia의 빨간색 자동차를 의미한다.// Car 클래스의 인스턴스 생성
const myCar = new Car('Kia', 'Red');
const yourCar = new Car('Hyundai', 'Blue');
myCar.drive(); // "Kia is driving."
yourCar.drive(); // "Hyundai is driving."
핵심적인 부분만 드러내고 불필요한 세부 사항을 감추는 것
복잡한 시스템을 단순화하여 사용자에게 필요한 정보만을 제공하고 불필요한 내부 구현 세부 사항을 숨기는 것을 의미한다. 추상화는 소프트웨어를 설계할 때 복잡성을 줄이고, 사용자가 중요한 것에만 집중할 수 있도록 도와준다.
현실 세계에서 '자동차'를 예로 들면, 자동차를 운전할 때 '핸들 돌리기', '브레이크 밟기' 등의 기능을 사용하지만 기능을 사용할 때 내부에서 엔진이 어떻게 작동하고, 연료가 어떻게 연소되는지 알 필요가 없습니다. 즉 이러한 내부 작동 방식은 사용자에게 추상화된 것입니다.
객체의 데이터(프로퍼티)와 그 데이터를 조작하는 메서드를 하나로 묶고 외부로부터 데이터를 보호하는 방법
캡슐화는 객체의 내부 데이터를 외부에서 직접 접근하지 못하도록 막고, 데이터를 조작하는 메서드를 통해서만 접근할 수 있게 해줍니다. 이를 통해 객체의 무결성을 지킬 수 있습니다.
예를 들어, 은행 계좌 객체가 있다고 하면 잔액(balance) 데이터를 외부에서 수정할 수 없게하여 잘못된 값이 입력되는 일을 방지할 수 있습니다.
하나의 클래스가 다른 클래스의 특성(프로퍼티와 메서드)을 물려받아 재사용하는 것.
상속을 통해 코드를 재사용할 수 있고, 기존의 클래스를 확장하여 새로운 기능을 추가하거나 수정할 수 있습니다.
부모 클래스와 자식 클래스를 정의하였을 때 자식 클래스는 부모 클래스의 프로퍼티와 메서드를 그대로 물려받아 사용할 수 있으며, 필요한 경우 이를 수정하거나 추가할 수도 있습니다.
이를 통해 코드 중복을 줄이고, 프로그램의 유지보수성과 확장성을 높일 수 있습니다.
동일한 인터페이스(메서드)를 여러 객체가 각기 다른 방식으로 구현할 수 있는 능력
"연주하다"라는 동작으로 예를 들면, 악기마다 "연주하다"라는 동작은 같지만 피아노를 연주할 때와 기타를 연주할 때 나오는 소리는 다릅니다. 각각의 악기(객체)는 "연주하다"라는 명령을 받으면 자기만의 소리를 냅니다.
이와 비슷하게 프로그래밍에서도 다형성을 사용하면 같은 메서드를 호출하더라도 객체의 타입에 따라 다른 동작을 하도록 만들 수 있습니다.