이전까지는 그냥 프로그램 전체가 유기적으로 연결되도록, 물 흐르듯 순차적으로 처리되도록 프로그램을 만들어왔다.
이러한 프로그래밍 방법은 순차적으로 작성하기에 실행속도가 빠르고, 그에 따른 시간적 유리함이 존재한다.
하지만 모든 요소가 유기적으로 연결된 만큼 하나의 고장으로 시스템 전체가 고장이 날 수 있으며, 이를 수정하기 위해서 시스템 전체를 손봐야 한다는, 유지보수 측면에서 까다로운 단점이 있다.
또한 순차적으로 진행되는 프로그램이기에 순서를 바꿀 수 없기 때문에, 융통성 있게 코드를 변경할 수 없다는 점이 또 하나의 단점이다.
이러한 문제점들을 개선하기 위해 등장한 것이 객체지향 프로그래밍이다.
우선 객체지향 프로그래밍이 무엇인지 알아보기 전에 객체란 무엇인지 알아야 할 필요가 있다.
객체는 세상에 존재하는 모든 물체로, 식별이 가능한 것을 의미하며, 이는 물리적인 사물 뿐만이 아니라, 추상적인 개념들도 포함된다.
객체는 다음과 같이 속성과 행위로 구성이 되어있다고 볼 수 있다.

그렇다면 ‘이러한 객체들로 무엇을 하는가?’에 대한 해답이 바로 객체지향 프로그래밍이라 볼 수 있다.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 생성하고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 방법이다.
객체지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 함수와 변수를 하나로 묶어 인스턴스(객체)를 생성해 사용한다는 점이다.
Class
* 객체를 정의하고 만들어 내기 위한 설계도로써, 연관되어 있는 변수와 메서드의 집합이다.
클래스는 객체의 상태를 나타내는 필드와 행동을 나타내는 메서드로 구성되어 있다.
객체
* 클래스를 기반으로 생성된 실체로써, 실제 프로그램에서 사용되는 데이터를 의미한다.
즉, 소프트웨어 세계에 실제로 구현될 대상을 의미한다고 볼 수 있다.
Instance
* 클래스를 기반으로 생성된 객체가 메모리에 할당되어 실제 사용될 때, 이를 인스턴스라 부른다. 즉, 객체와 동일하다.


객체지향 프로그래밍의 장점은 다음과 같다.
협업에 사용하기 좋다.
* 프로젝트를 독립적인 객체 단위로 분리해 작업할 수 있기에 협업을 진행하기에 용이하다.
대형 프로젝트에 적합하다.
* 클래스 단위로 모듈화 시켜 개발할 수 있기에 개발에 유연성이 있고, 변경이 쉬워진다.
즉, 대형 프로젝트와 같이 여러명, 여러 단체에서 개발을 할 때 업무 분담의 효율을 높여준다.
유지보수가 용이하다.
* 프로그램을 수정 및 추가하는 경우에도 캡슐화를 통해 주변에 미치는 영향이 적다.
그로 인해 유지보수가 간편하고, 경제적이다.
코드 재사용성 용이
* 다른 사람이 만든 클래스를 재사용할 수 있고, 상속을 통해 확장해서 사용할 수 있다.
이렇게 좋아 보이지만 가득이지만 단점도 있다.
개발속도가 느림
* 객체가 처리하려는 것에 대한 정확한 이해가 필요하기때문에 설계 단계부터 많은 시간이 모소된다.
실행속도가 느림
* 객체 지향 언어는 절차 지향에 비해 대체적으로 실행속도가 느리다는 단점이 있다.
코딩의 난이도 상승
* 다중 상속이 지원되는 C++같은 경우에 코드가 너무 복잡해질 수 있고, 코딩 난이도가 상승할 수 있다.
용량문제
* 대규모 프로젝트에서처럼 객체가 많이 사용된다면 용량이 커질수 있다.
캡슐화(Encasulation)
객체의 데이터를 외부에서 직접 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업이다.
접근제한자를 통해서 받고자 하는 것들을 클래스로 만들어 반환한다.
접근제한자는 public, protected, default, private이 있으며 각각 모든 접근허용, 상속관계인 다른 패키지의 클래스만, 같은 패키지만, 같은 클래스만 접근을 허용한다.
추상화(Abstraction)
상속(Inheritance)
다형성(Polymorphism)