🍊 객체지향 프로그래밍
객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 현실에 존재하는 객체를 소프트웨어에 표현하기 위한 방법이다. 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성한다.
객체 지향 언어는 크게 두 가지 범주로 나눌 수 있다:
1. 클래스 기반 객체 지향 언어
2. 프로토타입 기반 객체 지향 언어
이번 포스팅에서는 이 두 가지 접근 방식의 개념과 특징, 그리고 주요 차이점을 살펴보려고 한다!
🍊 클래스 기반
클래스 기반 객체지향 언어(Java,C++)
클래스 기반 객체 지향 언어는 객체를 정의하기 위해 클래스라는 구조를 사용한다.
클래스를 통해 객체의 속성(attribute)과 행위(method)를 정의하고, 이를 기반으로 인스턴스를 생성한다.
C++나 Java같은 클래스 기반 객체지향 언어는 클래스를 사전에 정의하고, 필요한 시점에 new연산자와 함께 생성자(constructor)를 호출하여 인스턴스를 생성하는 방식으로 객체를 생성하는 것을 알 수 있다.
클래스 기반 특징
클래스 정의 |
클래스는 객체의 구조와 동작을 정의하는 청사진 역할을 함! 클래스를 통해 객체의 속성(데이터)과 메서드(기능)를 정의할 수 있다. |
상속 |
클래스는 상속을 통해 다른 클래스의 속성과 메서드를 재사용하거나 확장할 수 있다. 자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받으며, 필요한 경우 이를 오버라이드하거나 추가할 수 있다. |
캡슐화 |
클래스는 내부 데이터와 메서드를 캡슐화하여 객체의 상태를 보호한다. 외부에서는 공개된 메서드를 통해서만 객체와 상호작용할 수 있다. |
다형성 |
동일한 메서드 이름이 다양한 클래스에서 다르게 동작할 수 있도록 한다. 이는 메서드 오버로딩과 오버라이딩을 통해 구현된다. |
🍊 프로토타입 기반
프로토타입 기반 객체지향 언어(Javascript)
자바스크립트는 대표적인 프로토타입 기반의 객체지향 언어이다. 프로토타입 기반 언어에서 객체는 다른 객체를 복사하거나 수정하여 생성되며, 객체 간의 상속 관계는 프로토타입 체인을 통해 구현된다.
클래스 기반 객체지향 언어와는 달리 다양한 객체 생성 방법을 지원한다.
- 객체 리터럴 -> 가장 일반적이고 간단한 방식
- Object() 생성자 함수
- 생성자 함수
- Object.create 매서드
자바스크립트는 클래스라는 개념이 없다.(ES6에서 class가 생기긴 했지만 이는 사실 함수이며 프로토타입 기반의 syntatic sugar다.)
// 객체 리터럴
var obj = {
name : 'SuminLee',
job : 'Developer'
}
// Object 생성자 함수
var obj = new Object();
obj.name = 'SuminLee';
obj.job = 'Developer';
// 생성자 함수
function Person(name, job) {
this.name = name;
this.job = job;
}
var obj = new Person('SuminLee', 'Developer');
특징
프로토타입 상속 |
객체는 다른 객체를 프로토타입으로 설정하여 상속을 구현한다. 새로운 객체는 기존 객체의 프로토타입 체인을 통해 속성과 메서드를 상속받는다. |
동적 객체 생성 |
객체는 런타임에 동적으로 생성하고 수정할 수 있다. 객체는 다른 객체를 프로토타입으로 설정하여 기능을 동적으로 확장할 수 있다. |
객체 간 관계 |
객체는 프로토타입 체인을 통해 다른 객체와 관계를 맺는다. 프로토타입 체인은 객체의 상속과 메서드 호출을 처리하는 데 사용된다. |
유연성 |
프로토타입 기반 언어는 클래스의 개념이 없으므로, 객체를 직접 생성하고 수정하는 데 유연성을 제공한다. |
🍊주요 차이점 다시 정리
1. 클래스 vs 프로토타입
클래스 기반: 클래스는 객체의 청사진 역할을 하며, 이를 기반으로 객체를 생성
프로토타입 기반: 객체는 다른 객체를 프로토타입으로 설정하여 생성되며, 프로토타입 체인을 통해 상속을 처리
2. 상속 방식
클래스 기반: 클래스를 상속받아 새로운 클래스를 정의
프로토타입 기반: 프로토타입 객체를 상속받아 새로운 객체를 생성
3. 정적 vs 동적
클래스 기반: 클래스 정의가 정적으로 이루어지며, 객체는 클래스의 인스턴스로 생성됨
프로토타입 기반: 객체는 동적으로 생성되고 수정될 수 있으며, 프로토타입 체인을 통해 기능을 확장
4. 캡슐화
클래스 기반: 클래스는 캡슐화를 통해 객체의 내부 상태를 보호
프로토타입 기반: 객체는 동적으로 수정되므로 캡슐화가 약할 수 있음! 그러나, 객체의 메서드와 프로퍼티를 수정하여 비슷한 효과를 얻을 수 있음