객체 지향 프로그래밍이라는 패러다임이 등장하기 전 먼저 절차 지향 프로그래밍이 있었다. 초기의 C, 포트란 같은 언어들이 절차적 언어에 해당한다.
단순히 별개의 변수와 함수로 순차적으로 작동하는 것을 넘어, 데이터의 접근과, 데이터의 처리 과정에 대한 모형을 만들어 내는 방식
--> 데이터와 기능이 별개로 취급되지 않고, 한 번에 묶여서 처리 가능
JavaScript는 엄밀하게 객체 지향 언어는 아니지만 객체 지향 패턴으로 작성할 수 있다.

4가지 기본 개념을 통해 재사용성을 얻을 수 있다.
데이터(속성)와 기능(메소드)을 하나의 객체 안에 넣어서 느슨하게 결합하는 것을 말한다.
느슨한 결합이란 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.
캡슐화는 은닉화라는 특징도 포함하고 있다.
은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 하는 것 이다. 이렇게 하면 객체 내 메서드의 구현만 수정하고, 코드 흐름은 바뀌지 않도록 만들 수 있다.
추상화란 간단하게 복잡한 것을 단순하게 만든다는 의미이다.
이러한 추상화 덕분에 인터페이스가 단순해진다는 장점이 있다.
많은 메서드들을 노출시키지 않고 단순한 이름을 정의하는 것에 폰커스가 맞춰져있다.
상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것이다.

Student 클래스에서 Human 클래스를 상속받아 Human 클래스에 정의 된 속성과 메서드를 사용할 수 있다.
이처럼 상속을 통해 불필요한 코드를 줄여서 재사용성을 높일 수 있다.
"다양한 형태"를 가질 수 있다는 뜻이다.
같은 메서드라도 다양한 형식으로 구현될 수 있음을 나타낸다.
다형성이 없다면 부모 클래스에서 if문을 통해 조건을 각각 걸어주어야 한다. 이렇게 되면 코드가 길어지고 보기 어렵다.
따라서 다형성을 통해 직관적이고 객체의 특성에 맞게 작성할 수 있다.