프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

실세계에 존재하고 인지하고 있는 객체를 소프트웨어의 세계에서 표현하기위해 객체의 핵심적인 개념, 기능만 추출하는 추상화를 통해 모델링하려는 프로그래밍 패러다임이다.
즉, 우리가 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상이다.
C++ , C# , Java , Python ,Dart , Ruby , Swift 등이 있다.
불필요한 정보는 숨기고 중요한 정보만 표현함으로써 프로그램을 간단히 만드는 것

추상화로 'car'를 구현해두면 car class에 volvo,nissan과 같은 브랜드 네임만 추가하여 객체를 생성할 수 있다.
객체의 속성과 행위를 하나로 묶고, 실제 구현 내용 일부를 내부에 감추어 은닉하는 것

속성과 기능을 정의하는 변수와 메소드를 클래스라는 캡슐에 넣어 분류함. 때문에 재활용이 용이하고 이를 통해 정보은닉을 활용할 수 있다.
새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게하는 것
어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩이나 오버로딩을 의미한다객
객체지향적으로 설계하기 위해선 SOLID 원칙을 지켜야한다 !
Javascript는 완전한 객체 지향 언어이다.
자바스크립트는 클래스 개념이 없어서 다른 객체지향 프로그래밍언어들과 차이가 있다. 하지만, 별도의 객체 생성 방법들이 존재한다.
// 객체 리터럴
var obj1 = {};
obj1.name = 'Lee';
// Object() 생성자 함수
var obj2 = new Object();
obj2.name = 'Lee';
// 생성자 함수
function F() {}
var obj3 = new F();
obj3.name = 'Lee';
자바스크립트는 이미 생성된 인스턴스의 자료구조와 기능을 동적으로 변경할 수 있다.
객체지향의 상속, 캡슐화 등의 개념은 프로토타입 체인과 클로저 등으로 구현할 수 있다.
자바스크립트는 클래스, 생성자, 메소드 모두 함수로 구현 가능하다.