객체지향(OOP)과 절차적 프로그래밍(PP)#
객체지향언어와 절차지향언어는 절대 반대되는 개념이 아니다. 그렇다면 객체지향언어와 절차지향언어는 무엇인가?
우리는 보통 Java, Python, C# 등의 언어를 객체지향 언어라고 부르며 C언어는 절차지향언어라고 부른다. 하지만 어디까지나 이 언어들이 지향하는 것이지 C언어는 절차적 프로그래밍만 가능하고 Java나 Python 등은 객체적 프로그래밍만 가능하다는 것이 아니다.
어떤 언어를 사용하든 상관없이 절차지향적 프로그래밍을 할 수 있다. 반대로 C언어를 사용하더라도 객체지향적으로 코딩을 할 수 있는 것이다.
‘절차지향’이라는 용어의 오해#
사실 절차지향적 언어라 하는 것은 잘못된 것이다. 모든 프로그래밍 언어가 절차를 기반으로 두고 있는데 절차를 지향한다는 말은 앞뒤가 맞지 않는다.
하나의 예를 비유하자면:
- 역도라는 스포츠는 바벨을 이용한 운동을 기반으로 하는 것인데 바벨을 지향하는 스포츠라고 하는 것과 같은 맥락이다.
- 그럼 역도를 덤벨로 해야 하나…?
다시 말해 절차지향이 아닌 절차적 프로그래밍이 맞는 것이다.
핵심 차이점#
- 절차적 프로그래밍: 데이터를 중심으로 함수를 만들어 사용
- 객체지향 프로그래밍: 데이터와 기능(함수)들을 묶어 하나의 객체로 만들어 사용
절차적 언어와 객체지향언어를 구분하는 기준#
여러가지 방식이 있겠지만 큰 틀에서는 아래와 같이 나뉜다.
- 캡슐화, 다형성, 클래스 상속을 지원하는가?
- 데이터 접근 제한을 걸 수 있는가?
대게 위 기준을 만족하면 객체지향 성향이 강해진다고 보면 된다.
절차적 프로그래밍#
절차적 프로그래밍은 말 그대로 절차적으로 코드를 구성한다는 것이다.
데이터에 대한 순서를 파악하고 필요한 기능을 함수로 만들어 절차적(순서대로) 진행시키는 방식
객체지향 프로그래밍#
객체지향 프로그래밍의 경우 기능들을 묶어 하나의 객체로 만든다.
다시 말하면 각각의 객체를 생성하고 그 객체마다 할 수 있는 행위(기능)들과 데이터를 하나로 묶어주는 것이다.
예시#
자동차 호출 서비스를 구현한다고 가정해보자:
- 자동차 객체: 자동차가 할 수 있는 행위(기능)를 하나로 묶음
- 기사 객체: 기사가 할 수 있는 행위를 묶음
- 승객 객체: 승객이 할 수 있는 행위를 묶음
각 객체의 메소드나 필드를 호출하면서 서로 간의 상호작용을 통해 알고리즘을 구성하는 방식이다.
그럼 어떤 방식이 더 좋은가?#
과거의 프로그래밍#
과거에는 현재처럼 큰 규모의 하드웨어와 소프트웨어가 필요치 않았다. 오래된 언어인 C, 포트란, 코볼 같은 절차적 언어의 대표라 할 수 있는 언어들이 사용되어졌다.
현대의 프로그래밍#
현대에 들어서면서 점점 소프트웨어 발전이 빨라졌고 이에 따라 코드들도 복잡해져갔다.
그러다 보니 복잡한 알고리즘들이 꼬이기 시작했고 작성한 코드를 사람이 읽었을 때 이해하기 힘들거나 이해할 수 없는 스파게티 코드가 되어버린 것이다.
이러한 문제의 대안으로 객체지향적 프로그래밍이 나온 것이다.
왜 객체지향이 우세한가?#
다만 현재 기준 객체지향 프로그래밍이 우세하게 사용되어지고는 있다. 그 이유는:
- 복잡한 프로그래밍일수록 절차적 프로그래밍을 사용한다면 코드들이 꼬이기 쉽다
- 확장성 측면에서도 유지 보수를 할 때 메리트가 떨어진다
절차적 프로그래밍 장단점#
장점#
- 객체나 클래스 생성 없이 바로 프로그래밍
- 필요한 기능을 함수로 만들어 복붙하지 않고 호출하여 사용
- 프로그램 흐름을 쉽게 추적
단점#
- 각 코드들의 끈끈한 우정 때문에 수정이 힘들다 (유기성이 높아 추가, 수정이 힘듦)
- 디버그(오류검사)가 힘듦
객체지향 프로그래밍 장단점#
장점#
- 모듈화, 캡슐화로 유지보수가 편함
- 객체지향적으로 현실 세계와 유사성에 의해 코드를 이해하기 쉽다
- 객체는 그 자체가 하나의 프로그램으로 다른 프로그램에서도 재사용이 가능
단점#
- 대부분의 객체 지향 프로그램은 속도가 상대적으로 느려지고 많은 양의 메모리를 사용하는 경향이 있음
- 현실세계와 유사성에 의해 코드를 이해하기 쉽게 만들기 위해 설계 과정에 있어 많은 시간이 들어간다
정답은 없다! 적재적소에 맞추어 사용하자#
절차적 프로그래밍을 사용하는 경우#
보통 프로젝트 규모가 크지 않고 재사용할 일이 크지 않는 경우에 많이 사용된다.
장점:
- 프로그램 자체가 가벼워짐
- 객체지향으로 만드는 것보다 개발시간과 인력도 줄어듦
객체지향 프로그래밍을 사용하는 경우#
큰 규모의 프로젝트에서 코드들을 재사용해야 한다면 초기 개발비용을 제외하고 객체지향 프로그래밍이 적합하다.
장점:
- 유지보수 측면에서 안정적

