1. <OOP(Object-Oriented Programming)>
객체-지향 프로그래밍(Object-Oriented Programming), 줄여서 OOP라고 부른다(앞으로의 글에도 OOP라고 명시하겠다). OOP는 현재 프로그래밍 설계의 패러다임 중 가장 오래되고 현재까지 가장 많이 쓰이는 프로그래밍 방법중 하나다. 이 패러다임이 존재하기전까지는 단순히 순서가 있는 명령의 조합이었다. 대표적인 언어로는 포트란 및 각종 C 언어가 있었다.

세월이 흐르고 프로그래밍이 발달되면서 OOP 라는 새로운 개발 방법이 만들어졌다. 이전에는 단순히 변수 및 함수로 순차적으로 작동하는 절차-지향 언어였다면, 이제는 객체를 통해 데이터를 만들고 접근하며, 데이터의 상호작용을 일으킬 수 있는 로직을 만들어 낼 수 있다. 오늘날에 쓰이는 현대 프로그래밍 언ㄷ어들은 대부분 OOP 의 특징을 가지고 있다.
-OOP의 4가지 주요 특성-
1) Encapsulation(캡슐화)
- 이름 그대로 여러가지의 정보를 하나로 묶는 과정이다. 더 개발자 답게 설명하자면 해당 데이터와 기능을 따로 정의하지 않고 하나의 class 로 묶는다.
- 캡슐화 과정에는 '은닉화' 라는 특징이 있는데, 이를 통해 내부 데이터나 내부 동작이 외부로 노출되지 않도록 만들어준다. 이 부분을 더 자세히 말한다면, 디테일한 구현이나 데이터는 숨기지만 동작하는 부분만 노출시는거다.
- 캡슐화의 장점중에는 '느슨한 결합'을 할 수 있게 해준다. 절차적인 코드의 경우 데이터의 형태가 바뀌게 되면 코드에 영향을 줄 수 있지만, OOP 의 경우 객체 내 메소드만 바꿔주고, 노출된 메소드를 사용하는 코드 흐름은 바뀌지 않도록 만들어 준다. 즉 instance 의 메소드만 바뀌고, 사용된 틀은 계속해서 재사용이 가능하다.
2) Abstraction(추상화)
- 추상화의 정리는 내부 안에 구현된 형태는 복잡할 수 있지만, 사용자가 사용할때 실제로 외부에 보이는 인터페이스를 단순하게 만들어주는 과정이다.
- 사용자 입장에서는 필요한 메소드만 알아보기 쉬운 이름으로 만들어서 보이도록 설정해주고, 굳이 필요하지 않은 메소드는 보이지 않게 만들어준다. 이를 통해, 불필요하거나 예기치못한 변화는 일어나지 않고 인터페이스를 단순화할 수 있다.
3) Inheritance(상속)
- 상속은 말 그대로 부모에서 자식에게 물려주는 과정이다. 이때 부모와 자식은 class 로 분류를 한다. 부모 class 는 'base class' 라고 부르면 자식 class 는 'derive class' 로 다시 분류 시킬 수 있다.
- 비효율적이게 코드를 반복해서 작성하기보다는, 상속이라는 특성을 통해 부모 class 라는 틀을 통해 자식 class 를 만들때, 새로운 정보를 추가해주기만 하면된다.
4) Polymorphism(다양성)
- 다양성은 단어에도 나와있듯이 다양한 형태를 가질 수 있는 객체를 뜻한다. 자동차를 예로들면, 같은 자동차라는 class 라고 하더라도 여러가지 브랜드와 특성을 지닌 자동차가 만들어진다. 이때의 다양한 형태의 객체를 instance 라고 명시한다.
2. <JavaScript에서 사용하는 Prototype>
JavaScript 에서 OOP 를 얘기할때 class 에 관한 설명을 많이한다. 하지만 아이러니하게도 JavaScript 는 처음부터 class 라는 개념이 없었다. 그 전에는 기존에 있는 객체를 복사하여 새로운 객체를 생성하는 prototype(프로토타입) 기반의 언어였다. ES6 문법이 업데이트 되면서 class 라는 문법이 추가된것이다.
Prototype 은 객체 원형인 prototype 을 이용해 새로운 객체를 만들 수 있다. 그리고 그렇게 만들어진 객체는 또다른 객체의 원형이 될 수 있다. 이런 방법으로 계속 확장해 나가면서 OOP 를 할 수 있게 해준다. 이를 또다른 말로 'prototype object' 라고 부를 수 있다. 예를 들어, 우리가 자동차에 색깔을 알고싶다면 우선 자동차 자체에 대한 객체를 prototype 을 이요해 만들 수 있다. 이렇게 되면 car.prototype.color 라고 표현하면, car 라는 객체의 prototype 을 접근해서 color 라는 속성은 조회하여 사용할 수 있다.