객체 지향 프로그래밍(Object-Oriented Programming, OOP)이란, 여러개의 객체 단위로 이루어지는 컴퓨터 프로그래밍을 의미한다.
컴퓨터 프로그래밍을 순차적인 명령어의 목록으로 보는 것이 아닌, 여러가지의 객체를 조합하여 객체들 간의 상호작용을 통해 프로그램을 구축하는 방식이다.
객체 지향 프로그래밍이 나오게 된 이유
이전의 프로그래밍은 절차 지향 프로그래밍(Procedural Programming)이다.
절차(프로시저)는 프로그래밍에서 일렬의 동작 단위로, 매개변수를 받아들이고 작업을 수행 후에 결과를 반환한다.
이때 프로시저와 함수의 차이점은 프로시저는 반환값이 없고, 함수는 반환값이 있다.
절차 지향 프로그래밍은 코드를 모듈 단위로 구성하여 작업한다.
이는 반복되는 작업을 모듈화 하여 코드의 재사용성을 높인다.
그러나 절차지향 코드를 변경해야하는 경우에서 문제가 발생할 수 있다.
절차 지향 프로그래밍에서는 모든 코드가 연결되어 있는데,
이때 일부를 수정해서 코드가 진행하는 순서가 바뀐다면 동일한 결과를 보장하기 어렵다.
또한 순서가 바뀜으로써 디버깅하기도 쉽지 않다.
절차지향의 문제를 해결하고자 등장한 것이 '객체 지향 프로그래밍'이다.
객체 지향 프로그래밍의 특징
객체지향의 주요 특징은 크게 4가지가 있다.
1. 캡슐화(Encapsulation)
관련된 데이터와 메서드를 하나의 단위로 묶는 것을 의미한다.
하나의 단위로 묶음으로서, 내부 상태와 구현 세부사항 정보를 외부로부터 숨기는 정보은닉을 한다.
정보은닉을 통해 높은 응집도, 낮은 결함도를 유지 할 수 있게된다.
접근제어자를 통해서 불필요한 직접 접근을 제한하고, 필요에 따라 인터페이스를 제공한다.
높은 응집도는 모듈 내부의 데이터, 메서드들이 함께 동작하여 하나의 기능을 수행하는 것을 말한다.
하나의 기능을 수행하기 때문에 내부 구조는 서로 단단하게 결합되어 있으며, 모듈이 독립적이고 명확한 기능을 하게 해준다.
낮은 결함도는 다른 모듈과의 상호작용을 최소화 하는 것을 의미한다.
외부에서의 불필요한 접근을 최소화하여 각 모듈의 독립성을 유지하고, 개별 모듈이 수정되거나 교체 할 수 있어 유지보수성이 향상된다.
2. 상속(Ingeritance)
클래스간의 계층적 관계를 나타낸다.
상위-하위, 부모-자식 클래스 등으로 불리며, 부모 클래스의 특성과 동작을 자식 클래스에게 전달한다.
자식 클래스는 부모 클래스의 멤버를 상속받아 그대로 사용할수도, 필요에 따라 필드를 추가해서 사용할 수 있다.
이를 통해 코드의 재사용성과 유지보수성을 향상시켜준다.
3. 다형성(Polymorphism)
같은 이름의 메서드를 여러 클래스에서 다른 방식으로 구현한다.
다형성은 같은 이름의 메서드라도 다른 매개변수와, 다른 내용으로 구현하는 것을 말한다.
예를 들어, 동물이 앞으로 가는 동작이 있다고 한다면, 뱀은 기어간다, 사자는 달려간다, 새는 날아간다 등으로 구현하는 것을 의미한다.
이렇게 정의함으로서 불필요한 코드를 없앨 수 있으며, 코드의 가독성과 재사용성을 높일 수 있다.
4. 추상화(Abstraction)
복잡한 시스템을 단순화하고, 중요한 부분에 집중하는 개념을 말한다.
공통적인 부분을 일반화하고, 이를 기반으로 추상적인 개념을 정의한다.
추상화는 객체들 사이의 관계를 명확하게 표현하고, 코드를 단순하고 유연하게 만들어주는 역할을 한다.
예를들어 자전거, 차, 버스 등의 공통점은 교통수단이라는 일반화가 가능하다.
그리고 전진한다, 멈추다, 후진한다 등의 행동을 모아서 추상클래스나 인터페이스와 같은 개념으로 정의한다.
이렇게 만들어진 추상클래스나 인터페이스는 실체 객체가 아닌 일종의 틀로서 기능을 하진 않는다.
다만, 다른 클래스가 이를 상속하거나 구현함으로서 사용이 가능하다.