자바스크립트 프로토타입 Prototype (1)
(원시 타입을 제외했을 때)
자바스크립트를 이루고 있는 모든 것은 객체다.
📌 객체지향 프로그래밍 특징?
명령형 프로그래밍 <===> 객체지향 프로그래밍
✔ 그래서, 객체지향 프로그래밍이 뭔데 ?
프로그램을 객체의 집합 으로 표현하려는 프로그래밍 패러다임 이다.
📎 객체 Object
📎 메서드 Method
📎 속성 Property
객체지향 프로그래밍은 실제 세계의 실체를 인식하는 철학적인 사고를 프로그래밍에 접목한 결과다.
현실에서 사물이나 개념은 각자의 '속성'을 가지고 있기 때문에 이를 기준으로 실체를 인식하거나 구분한다.
이 방식을 프로그래밍에 접목시켜보면,
하나의 객체(사물)는 상태(사물의 색상, 너비, 무게)와 동작(사물의 부피를 구하는 수식)으로 표현할 수 있다.
상태 state는 속성 property/attribute , 동작 behavior은 메서드 method라 부른다.
객체 object 는 상태 데이터와 동작을 하나의 논리적인 단위로 묶은 복합적인 자료구조다.
✔ 객체지향 프로그래밍과 상반되는, 명령형 프로그래밍은 뭐야 ?
프로그램을 명령어, 함수의 목록 으로 보는 프로그래밍 패러다임 이다.
객체지향 프로그래밍과 명령형 프로그래밍 모두 프로그래밍 패러다임 의 일부다.
객체지향 프로그래밍 은 프로그램을 객체의 집합 으로 바라보지만,
명령형 프로그래밍 은 명령어와 함수의 목록 으로 본다는 차이점이 있다
자바스크립트는 멀티 패러다임 프로그래밍 언어이다.
📍 멀티 패러다임 → 명령형 + 함수형 + 프로토타입기반 객체지향 프로그래밍
C++과 JAVA는 클래스기반 객체지향 프로그래밍을 지원한다. 프로토타입은 자바스크립트만의 특징이다.
📌 프로토타입 기반? 클래스 기반?
클래스 기반 프로그래밍은 클래스 개념이 존재하고, 상속을 사용한다.
프로토타입 기반 프로그래밍은 클래스 개념이 존재하지 않고,
상속대신 객체의 원형을 복사하는, 복제의 개념을 사용한다.
두 방법 모두 부모 객체로부터 속성과 메서드를 물려받아 사용하거나 변경할 수 있다는 공통점이 있다.
일반적으로 객체지향이라고 하면, 클래시 기반의 객체 지향을 의미한다.
클래스를 통해 객체지향을 구현해온 역사가 더 깊기 때문이다.
ex. 클래스 기반의 언어 : JAVA, C++, Python, PHP, Ruby, Object-C
📍 클래스기반 객체지향 언어
클래스
클래스란, 같은 종류의 집단에 속하는 속성(property/attribute)과 행위(behavior)를 정의한 것이다.
객체지향 프로그램의 기본적인 사용자 정의 데이터 타입이라고 할 수 있다.
즉, 클래스는 객체 생성에 사용되는 패턴이고, new 연산자를 통해 인스턴스화 과정이 필요하다.
모든 인스턴스는 클래스에서 정의된 범위 내에서만 작동하며, 런타임에 그 구조를 변경할 수 없다.
(동적 할당이 가능한 자바스크립트와는 너무 다른 포인트)
이러한 특성은 정확성, 안정성, 예측성 측면에서
클래스기반 언어가 프로토타입기반 언어보다 더 나은 결과를 보장한다.
📍 클래스기반 객체지향 언어의 특징
✔ 캡슐화 Encapsulation
✔ 추상화 Abstraction
✔ 상속성 Inheritance
✔ 다형성 Polymorphism
✔ 집합 Aggregation
✔ 캡슐화 Encapsulation
정의 : 비슷하거나 서로 관련된 역할을 하는 property와 method들을 하나의 틀 안에 담는 것.
필요한 이유 : 정보 은닉을 위해 → 노출이 필요하지 않은 정보는 숨김.
✔ 추상화 Abstraction
정의 : 대상의 특징 중 프로그래밍에 필요한 속성만 추려 표현하는 것.
필요한 이유 : 불필요한 정보를 제거하기 위해 → 코드의 가독성을 높임.
✔ 상속성 Inheritance
정의 : 부모 객체의 속성과 메서드를 이어받아 사용할 수 있는 것.
필요한 이유 : 코드의 불필요한 중복을 줄이기 위해 → 코드의 재사용성을 높임.
✔ 다형성 Polymorphism
정의 : 객체의 property와 method가 다양한 타입을 받아들일 수 있는 것.
필요한 이유 : 기능의 확장과 변경의 편리성 위해 → 코드의 재사용성을 높임.
✔ 집합 Aggregation
정의 : 여러 객체를 합쳐 하나의 객체를 만드는 것.
필요한 이유 : 분리된 모듈을 모아 하나의 기능을 구현하기 위해 → divide&concuer 해당.
📍 프로토타입기반 객체지향 언어
객체 (Feat. 다양한 생성 방법)
• 객체 리터럴
• Object 생성자 함수
• 생성자 함수
• Object.create 메서드
• 클래스 (ES6)
자바스크립트는 프로토타입 prototype 을 기반으로 상속을 구현한다.
JAVA나 C++와 같은 클래스 개념은 없는 대신, 별도의 객체 생성 방법이 존재한다.