
객체 지향 프로그래밍 패러다임이 등장하기 이전, 일반적으로 초기의 프로그래밍 언어들(C, 포트란)은 객체 지향의 개념이 없는 절차적 언어였다. 절차적 언어는 순차적인 명령의 조합을 말한다.
후에 객체 지향 프로그래밍이라는 패러다임이 등장하면서, 단순히 별개의 변수와 함수로 순차적으로 작동하는 것을 넘어, 데이터의 접근과 데이터의 처리 과정에 대한 모형을 만들어 내는 방식을 고안해냈다.
따라서, 데이터와 기능이 별개로 취급되지 않고 한 번에 묶여서 처리할 수 있게 되었다.
"클래스"라고 부르는 데이터 모델의 청사진을 사용해 코드 작성
- 현대의 언어들은 대부분 객체 지향의 특징을 갖고 있음
(대표적으로 Java, C++, C# 등)
- JavaScript: 객체 지향으로 작성 가능
이러한 객체 지향의 특징은 빠르게 현대 언어에 적용이 되었다. 자바스크립트는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.
1. 캡슐화(Encapsulation)
캡슐화는 외부에서 속성과 메서드를 따로 정의하는 것이 아닌, 하나의 객체 안에 넣어서 묶는 것이다. 객체지향 프로그래밍의 기본적인 객체 구성 형태를 나타내는 것이라고 할 수 있다.

느슨한 결합(Loose Coupling)
느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.
코드만 보고도 인스턴스 객체의 기능을 상상할 수 있게 작성하는 것이 느슨한 결합을 추구하는 코드 작성법이다.
은닉화
캡슐화라는 개념은 은닉화의 특징도 포함하고 있는데, 은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것이다. 따라서, 디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 메서드만 노출시켜야 합니다.
은닉화의 특징을 살려서 코드를 작성하면 객체 내 메서드의 구현만 수정하고, 노출된 메서드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있다.
❕ 자바스크립트에서는 캡슐화와 은닉화를 클로저를 통해 구현할 수 있다.
- 속성과 메서드를 하나의 단위로 묶는 것
- 은닉(hiding): 내부 데이터나 구현은 숨기고, 객체 외부에서 필요한 메소드는 노출시킴.
- 느슨한 결합(Loose Coupling)에 유리: 언제든 구현을 수정할 수 있음.
2. 추상화(Abstraction)

추상화는 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념이다. 다시 말해, 객체가 가진 여러 가지 속성들 중 사용자가 필요로 하는 속성만 간추려 내어 표현하는 것을 말한다.
캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면, 추상화는 클래스를 사용할 때, 필요하지 않은 메서드 등을 노출시키지 않는 것에 포커스가 맞춰져 있다. 즉, 인터페이스의 단순화를 추구한다고 할 수 있는 것이다.
3. 상속(Inheritance)
상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것이다. 즉, 어떤 객체의 속성과 메소드를 다른 객체가 상속받아 그대로 사용할 수 있는 것을 말한다.

예를 들어, 사람(Human)이라는 클래스가 있다고 가정했을 때, 사람은 기본적으로 이름과 성별, 나이와 같은 속성, 그리고 먹다, 자다 등과 같은 메서드가 있다고 볼 수 있다.
추가적으로 학생(Student)이라는 클래스를 작성한다고 생각해 보자. 그런데 이때 앞서 구현했던 사람(Human) 클래스의 속성과 메서드를 다시 구현한다면 비효율적일 것이다. 학생의 본질은 결국 사람이므로, 상속을 이용하여 학생(Student) 클래스는 사람(Human) 클래스를 상속받을 수 있다.
4. 다형성(Polymorphism)
Polymorphism이라는 단어의 poly는 "많은", 그리고 morph는 "형태"라는 뜻을 가지고 있다.
"말하다"라는 동작의 본질은 "입으로 소리를 내다"를 의미하는데, 각기 다른 동물들이 "말할 때" 제각각의 소리를 내는 것처럼, 객체 역시 똑같은 메서드라 하더라도 다른 방식으로 구현될 수 있다.