<aside>
💡 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
</aside>
OOP의 탄생 배경
- 기존 절차적 프로그래밍 방식은 복잡한 프로그래밍 문제를 순서도로 나타내는 것이 불가능할 정도로 꼬인 코드를 만들게 되는 문제를 가지고 있었다.
- 이후 복잡한 프로그램의 문제를 해결하기 위해 몇개의 작은 문제들로 나누어 해결하는 하향식(Top-down) 방식을 적용한 구조적 프로그래밍 방식이 나왔지만, 데이터 자체를 구조화하지 못했기에 근복적인 해결책이 필요했다.
- 객체지향 프로그래밍 방식은 큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것이다. 이 객체란 것을 일단 한번 독립성/신뢰성이 높게 만들어 놓기만 하면 그 이후엔 그 객체를 수정 없이 재사용할 수 있으므로 개발 기간과 비용이 대폭 줄어들게 된다.
- 즉, 프로그램을 상태(state)와 행위(behave)로 이루어진 객체라는 기본단위로 나누고, 이 객체들 간의 상호작용을 통해 프로그램을 설계하고 개발하는 것

장점
- 코드 재사용이 용이, 코드의 중복을 어느 정도 줄일 수 있다.
- 유지보수가 쉽다
- 대형 프로젝트에 적합
단점
- 처리 속도가 상대적으로 느리다.
- 객체가 많으면 용량이 커질 수 있다.
- 설계시 많은 시간과 노력이 필요하다.
응집력과 결합력
위의 장점들을 관통하는 객체 지향 프로그래밍의 중요한 특성은 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 지향한다는 점이다.