먼저 객체 란 구체적인 사물, 사람, 추상적인 개념이 될 수 있는 무언가 이다.
컴퓨터로 예를 들면, 컴퓨터에 쓰이는 모든 부품과 컴퓨터가 제공하는 모든 기능이 전부 객체이다.
객체지향언어 란 프로그램을 다수의 객체로 만들고, 이들끼리 서로 상호작용하도록 만드는 프로그래밍 언어이다. 컴퓨터의 모든 부품을 적절히 연결하고 조립해서 컴퓨터가 제대로 작동하도록 만드는 것이라고 볼 수 있습니다.
우리가 들어보고 알고 있는 자바, C++, 파이썬 등등이 있다.
객체지향 언어의 특징은 크게 4가지로 나눌 수 있다.
캡슐화 (Encapsulation)
: 데이터와 알고리즘을 하나로 묶어 하나의 캡슐처럼 만드는 것이다. 이 특징 때문에 데이터와 코드의 형태를 외부에서 알 수 없다. 캡슐화 되어 있지 않은 데이터와 코드는 사용하기 어렵다.
상속 (inheritance)
: 부모와 자식간에 유전자를 물려주듯이 상위 클래스의 모든 것을 하위 클래스가 물려받는 것이다.
다형성 (polymorphism)
: 상속과 연관된 개념으로, 하나의 객체가 다른 여러 객체로 재구성 되는 것이다.
부모가 쌍둥이 자식을 낳으면 부모의 유전자가 두 명명의 자식으로 재구성되는 것과 같은 개념이다. 하지만 그렇다고해서 두 쌍둥이(재구성된 객체들)의 유전자가(원 개체)의 유전자와 똑같다고 볼 수 없다. 자바의 오버로드, 오버라이드 다형성이 이 다형성을 보여주는 대표적인 예이다.
추상화 (abstraction)
: 실존하는 객체의 여러 특성 중, 프로그램을 만드는데 필요한(공통적인) 부분만 파악해서 추출하고 필요하지 않은 것은 제거하는 것이다.
재사용성
: 상속이 가능하기 때문에 코드를 재사용할 수 있어 편리하다.
생산성 증가
: 컴퓨터가 고장났을 때 문제가 되는 부품만 수리하면 다시 정상 가동됩니다.
마찬가지로 독립된 객체로 이루어져 있기 때문에 생산적으로 작업할 수 있고, 유지보수가 용이하다.
유동적인 모델링
: 객체는 세상에 존재하는 모든 것이다. 객체지향언어 자체가 우리가 사는 세상을 닮았기 떄문에 개발자가 생각하는대로 자연스럽게 구현할 수 있다.
느린 개발 속도
: 모든 객체의 역할과 기능을 이해해야하기 때문에 프로그래밍에 많은 시간이 소요된다.
느린 실행 속도
: 객체지향언어의 처리 속도는 절차지향언어보다 느리다.
높은 난이도
: 객체지향언어는 대체로 난이도가 높다. 특히 다중 상속이 지원되는 C++은 어렵다.
객체지향언어가 절차지향언어의 단점을 보완하고자 만들어졌다고 마냥 우수하다고 볼수는 없다. 구조와 특징이 다를 뿐, 어떻게 활용하느냐에 따라 다르다.