November 08, 2021
객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
자바스크립트는 다른 언어(C++, Java 등)와 다르게 클래스 기반의 객체 지향 프로그래밍 언어가 아니고, 프로토타입 기반 객체 지향 프로그래밍 언어이다.
클래스 기반 언어들은 클래스
로 객체의 자료구조와 기능을 정의하고 생성자를 통해 객체(인스턴스)를 생성한다. 그러나 자바스크립트는 클래스라는 개념이 없고, 생성자 함수
가 그 역할을 대신한다.
(ES6에서 Class가 도입되었다. 그러나 Class는 사실 함수이고, 기존 prototype 기반 패턴의 Syntactic sugar이다.)
추상화
공통의 속성이나 기능을 묶어 이름을 붙이는 것
즉, 클래스(JS에서는 사실은 생성자 함수)를 설계하는 것을 의미한다.
캡슐화
관련 있는 속성이나 기능을 한 곳에 모으는 것
캡슐화를 통해 코드를 재활용할 수 있고, 정보를 은닉할 수 있다.
JS에서는 public, private 등의 키워드를 제공하지 않으므로 클로저를 이용해 정보 은닉을 구현한다.
상속
부모의 속성과 기능을 그대로 이어받아 사용할 수 있게 하는 것
JS에서는 프로토타입(체인)을 통해 상속을 구현한다.
다형성
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것
JS에서는 오버라이딩을 통해 다형성을 구현한다. (JS에서 오버로딩은 불가능하다.)
모든 객체는 프로토타입
이라는 다른 객체를 가리키는 내부 링크를 가지고 있다. 즉, 프로토타입을 통해 직접 객체를 연결할 수 있는데 이를 프로토타입 체인이라 한다.
자바스크립트의 모든 객체는 부모 역할을 담당하는 객체와 연결되어 있다. 그래서 부모 객체의 프로퍼티와 메서드를 사용할 수 있다. 이러한 부모 객체를 프로토타입
이라 한다.
일반 함수와 동일한 방법으로 생성자 함수를 정의하고 new 연산자와 함께 호출하면 해당 함수는 생성자 함수
로 동작한다.
자바스크립트는 생성자 함수와 new 연산자를 통해 인스턴스를 생성할 수 있다. 이때 생성자 함수
는 클래스이자 생성자의 역할을 한다.
클래스는 다른 글에서 따로 다루기로 하자.