객체지향 프로그래밍. 개발 공부를 시작하면서 너무나도 자주 들었던 말이다. 자주 들었던 말이지만 어떤 사람이 객체 지향 프로그래밍이 정확하게 어떤거야? 라고 물어본다면 대답하기 어려울 것 같아 이번 기회에 개인 공부도 할 겸 정리해볼까 한다.
절차지향 프로그래밍(Procedural Programming)
초기 프로그래밍 방식은 절차적 프로그래밍 방식이었다고 한다. 절차적 프로그래밍 방식은 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다. 절차적 프로그래밍은 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리하다고 한다.
하지만 절차적 프로그래밍 방식은 각 코드가 유기적으로 연결되어 있어서 유지보수가 어렵다. 실행 순서가 정해져 있기 때문에 코드의 순서가 바뀌면 동일한 결과를 보장하기가 어렵다. 새로운 코드나 데이터를 추가 할 경우 부분 고장이 전체 고장으로 확대되기 때문에 디버깅이 어렵다. 이에 따라 객체지향 프로그래밍의 필요성이 늘어났다.
특징
절차지향 언어에 대표적인 예로 C언어(C++은 객체지향)가 있다. 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리하다.
장점
- 컴퓨터의 처리구조와 유사해 실행속도가 빠르다.
단점
- 유지보수가 어려움
- 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움
- 디버깅이 어려움
객체지향 프로그래밍(Object Oriented Programming)
이전에 절차적 프로그래밍은 컴퓨터 중심의 프로그래밍이었다면, 객체 지향 프로그래밍은 인간 중심적 프로그래밍이라고 볼 수 있다. 현실 세계를 프로그래밍으로 옮겨와 현실 세계의 사물들을 객체라 보고 그 객체로부터 개발하고자 하는 어플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것이다. 마치 컴퓨터 부품을 하나씩 사다가 컴퓨터를 조립하는 것과 같은 방법이다. 즉 객체들을 조합해서 큰 문제를 해결하는 상향식 방법이다.
처음 객체 지향 프로그래밍이 등장 했을 당시에는 기존의 절차적 프로그래밍과 비교했을 때 매우 이질적이고, 당시 컴퓨터의 처리능력이 별로 좋지 않아서 주목을 받지 못했었다. 하지만 GUI가 등장하면서 객체 지향 프로그래밍이 급 부상하게 된다.
객체 지향으로 코드를 작성하면 이미 작성된 코드에 대한 재사용성이 높다. 자주 사용되는 로직을 라이브러리로 만들어두면 계속해서 사용할 수 있으며 라이브러리를 예외상황에 맞게 잘 만들어두면 개발자가 사소한 실수를 하더라도 전체를 디버깅 할 필요 없이 컴파일 단계에서 잡아낼 수 있으므로 디버깅이 쉬워진다. 또한 내부적으로 어떻게 동작하는지 몰라도 개발자는 라이브러리가 제공하는 기능들을 사용할 수 있기 때문에 생산성이 높아지게 된다.
특징
- 캡슐화
- 캡슐화는 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것으로 객체의 가장 본질적인 특징이다. 변수와 함수를 하나의 단위로 묶는 것을 의미하며 데이터의 번들링을 뜻한다. 대개 프로그래밍 언어에서 번들링은 클래스(Class)를 통해 구현되고, 해당 클래스의 인스턴스(Instance) 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드(Method)에 쉽게 접근 할 수 있다.
- 상속
- 상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려 받는 것을 말한다. 기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의하게 되는데, 이러한 작업을 오버라이딩(Overiding)이라고 한다. 상속은 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 해준다. 상속을 하면 코드의 중복 작성을 방지하고 코드 재사용성이 높아져 코드 작성에 드는 시간과 비용을 줄일 수 있다.
- 다형성
- 하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다. 실세계를 예를 들자면, 동물들은 소리를 낼 수 있지만 강아지는 '멍멍', 고양이는 '야옹'하고 우는 것처럼 낼 수 있는 소리는 다양하다. 즉 서로 다른 클래스에 속해있는 객체들이 동일한 메시지에 대해 다른 방식으로 응답될 수 있다.
장점
- 코드의 재활용성이 높음
- 코딩이 절차지향보다 간편함
- 디버깅이 쉬움
단점
- 처리속도가 절차지향보다 느림
- 설계에 많은 시간소요가 들어감
'Computer Science' 카테고리의 다른 글
네트워크 라우터 개념(Router) (0) | 2023.01.03 |
---|---|
동기와 비동기 개념과 장단점 (0) | 2022.12.30 |
OSI 7 Layer 디테일 정리(+ TCP/IP 4계층) (2) | 2022.12.30 |
프로토콜(Protocol)의 개념, 요소, 특징, 계층 구성 (2) | 2022.12.29 |
마이크로서비스 아키텍처(MSA)란? (0) | 2022.12.29 |