1. 객체지향의 프로그래밍의 탄생 배경
하드웨어는 무어의 법칙으로 2배씩 빨라지고 성장하고 있는 반면 소프트웨어는 발전이 더디고 소프트웨어가 하드웨어의 발전을 따라가지 못하는 현상이 발생하여 소프트웨어 위기(Software Crisis)라는 문제점이 발생함.
소프트웨어의 위기의 주요 원인 중 하나는 기존 절차식 프로그래밍 방법의 낮은 생산성이다.
절차식 프로그래밍은 간결하고 빠른 실행 파일을 만들기는 하지만 규모가 커지면 개발뿐만 아니라 유지보수에 한계를 드러냈다.
또한 코드의 일반성이 없으므로 한 번 만든 코드는 수정없이 재사용되는 경우가 드물고 매번 현실의 문제에 맞게 처음부터 다시 개발해야한다.
설사 재사용 하더라도 기존코드를 그대로 쓰기 보다는 필요에 따라 조금씩 수정해야만 했다.
그러다보니 대규모의 소프트웨어를 만드는데 수년의 개발 기간과 과다한 인력을 소모하게 되어 고급인력은 부족하고 소프트웨어의 공급 부족을 초래했고 시간의 부족으로 소프트웨어의 질을 저하시켰다.
그래서 대안으로 여러가지 개발 기법들이 제시되었는데 그 중에서 가장 탁월한 기법으로 인정받은 것이 절차지향 방식이 아닌 데이터를 중심으로 개발을 진행하는 객체지향적 프로그래밍 방식이다.
2. 객체지향 프로그래밍이란?
객체지향 프로그래밍은 데이터를 정의하고 데이터에 절차를 결합하여 현실의 사물을 표현할 수 있는 객체를 만든다. 그리고 이런 독립적인 객체를 조립하여 프로그램을 완성해 나가는 방식이다.
- 객체는 재활용성이 높아서 다른 프로젝트에서도 사용할 수 있고 신뢰성도 확보된다.
- 개발자는 객체의 내부 구조나 동작원리를 잘 몰라도 객체들을 조립하여 고기능의 소프트웨어를 신속하게 만들 수 있다.
- 객체지향 방식은 조립식이기 때문에 결과물의 성능이 맞춤형의 절차식에 비해 조금 떨어지는 단점이 있다.
그러나 하드웨어의 발전에 힘입어 그 정도의 차이는 큰 문제가 되지 않는다.
3. 객체지향 프로그래밍의 특징
- 캡슐화(Encapsulation - 묶는다) : 표현하고자 하는 자료(data)와 동작(function)을 하나의 단위로 묶는 것이며 이렇게 묶어 놓은 것을 객체(Object)라고 한다. 대상의 특징을 나타내는 데이터와 이 데이터를 관리하는 함수가 항상 하나의 묶음으로 사용되므로 객체는 스스로 독립적이며 프로그램의 부품으로 활용될 수 있다 .
- 정보은폐(Information Hiding - 숨긴다) : 객체는 자신의 상태를 기억하기 위한 속성과 속성을 관리하는 동작을 정의한다. 이중 외부에서 사용하는 기능만 공개하고 나머지는 숨길 수 있는 것을 정보은폐라고 한다. 외부에서 객체의 상태를 마음대로 바꾸거나 허가되지 않은 동작을 요청하지 못하도록 함으로 스스로의 안정성을 확보하는 수단이다.
- 추상화(Abstraction - 표현한다) : 객체의 효율적이고도 안전한 사용을 위해 인터페이스를 설계하는 것이며 캡슐화와 정보은폐에 의해 구현된다. 추상화에 의해 외부에서는 객체의 인터페이스만 볼 수 있으며 내부구현은 할 수 없다. 그래서 사용방법이 간단 명료하고 외부의 조작에 대해 안전해지며 객체는 추상적인 인터페이스를 유지하는 한도 내에서 숨겨진 내부 구현을 마음대로 수정할 수 있어 기능 개선이 쉬어진다.
- 상속(Inheritance - 재사용한다) : 이미 만들어진 클래스를 파생시켜 새로운 클래스를 정의하는 기법이다. 파생된 클래스는 기존 클래스의 모든 속성과 동작을 물려 받으며 여기에 더 필요한 기능을 추가하거나 필요없는 기능을 제거 또는 변경할 수 있다.
- 다형성(Polymorphism - 상황에 따라 달라진다) : 똑같은 호출이라도 상황에 따라 호출하는 객체에 따라 다른 동작을 할 수 있는 능력을 다형성이라고 한다.
실제 내부 구현은 다르더라도 개념적으로 동일한 동작을 하는 함수를 하나의 인터페이스로 호출할 수 있으므로 객체들을 사용하는 코드를 일관되게 유지할 수 있다. 다형성은 동적 바인딩을 하는 가상함수에 의해 구현됨.