2020. 5. 22. 12:30ㆍ정리/JAVA
절차지향 프로그래밍(Procedural Programming)이란?
절차지향 프로그래밍이란 순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다.
장점
- 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체지향 언어보다 코드의 실행처리속도가 빠르다.
단점
- 프로그램의 동작 순서와 동일하게 개발되었으므로 코드간의 연결이 긴밀(결합도가 높음)하기 때문에 요구사항 변경 등의 이유로 코드의 수정이 필요할 경우, 해당 코드와 연관된 모든 코드를 수정해야 하기 때문에 유지보수가 어렵다.
- 하나의 기능을 구현한 코드에 문제가 생긴 경우, 해당 코드와 연관된 모든 코드를 분석하면서 문제의 원인을 찾아야 하기 때문에 디버깅이 어렵다.
- 프로그램의 동작 순서와 동일하게 개발되기 때문에 동일한 기능을 여러 번 사용해야 할 경우, 동일한 코드를 사용해야 한다.
객체지향 프로그래밍(Object Oriented Programming)이란?
객체지향 프로그래밍이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방법.
프로그램을 객체라는 최소 단위로 나누고 객체의 상호작용을 통해 정해진 알고리즘대로 프로그램을 서술하는 방법.
객체지향 프로그래밍의 특징으로는 추상화, 다형성, 상속, 캡슐화가 있으며 이러한 특징을 통해 객체지향 프로그래밍의 장점을 활용할 수 있다.
이에 대해서는 너무 길어지기 때문에, 추후 정리해야 할 듯 하다.
간단하게 정리해보자면,
캡슐화로 결합도를 낮추고 응집도를 높일 수 있음
상속 및 다형성을 통한 확장성과 코드의 재사용성
추상화 및 다형성을 통한 유연한 설계와 복잡도 관리
으로 볼 수 있다.
장점
- 하나의 객체에 프로그램에 필요한 데이터 구조와 데이터를 다루는 방법을 정의해놓은 뒤, 필요에 따라 호출해 사용하기 때문에 코드의 재사용성이 좋다. (복잡한 로직을 메소드를 통해 간단히 호출해 사용할 수 있다.)
- 객체의 상호작용을 통해 프로그램을 서술하며, 이 객체는 다른 객체와의 확연한 차이점을 가지고 있고 결합도가 낮아 변경 시에도 상호작용 관계에 있는 다른 객체들에게 영향을 최소한으로 미치기 때문에 수정이 필요한 코드가 있을 경우 다른 코드에 신경 쓰지 않고 해당 구간만을 수정하면 되기 때문에 유지보수에 좋다.
- 프로그램을 정해진 알고리즘대로 실행하는 주체인 객체들간의 결합도가 낮기 때문에 특정 기능에서 문제가 생길 경우 특정 구간만을 확인하면 되기 때문에 디버깅이 쉽다.
- 대형 프로젝트를 진행할 경우, 프로그램의 기능을 모듈화시켜 개발을 진행하기 때문에 각자 담당한 모듈만을 개발한 뒤 이를 최후에 결합하는 식으로 개발할 수 있으므로 협업에 용이하다.
단점
- 객체 지향 프로그래밍이 가진 대부분의 장점은 객체 간의 결합도가 낮을 때 적용되기 때문에 프로그램에 사용될 객체들의 결합도를 낮추는 과정이 필수적이므로 설계 단계에서 많은 시간과 비용이 소모된다.
- 프로그램의 알고리즘대로 실행될 코드가 바로 구현된 절차지향과는 달리 객체지향은 실행될 코드를 필요할 때 마다 객체에서 호출해서 사용하는 식으로 진행되기 때문에 코드의 실행처리속도가 비교적 느리다.
다음은 절차지향과 객체지향의 차이점에 대해 설명해야 하는데, 그 전에 짚고 넘어가야 할 사항이 있다.
객체지향의 반대는 절차지향이 아니고,
절차지향의 반대는 객체지향이 아니다
절차지향이나 객체지향이나 모두 프로그램의 알고리즘대로 실행되기 때문이다.
해당 사진은 어떠한 자판기의 동작을 각각 절차지향, 객체지향적으로 분석한 사진이다.
절차지향 분석의 경우
1) 고객이 돈을 준비하고 준비한 돈을 자판기에 넣고
2) 자판기에서는 고객이 넣은 돈을 검사해 준비한 제품과 잔돈을 거슬러주고
3) 고객은 잔돈과 제품을 받아가는
식으로 순서대로 진행되지만
객체지향 분석의 경우
1) 고객 객체에서 돈을 -> 자판기 객체에게 전달해주고 이를 검사한다. (돈을 넣는다 -> 돈을 받는다, 돈을 검사한다)
2) 자판기 객체에서 잔돈을 -> 고객 객체에게 전달해준다. (잔돈을 준다 -> 돈을 받는다)
3) 자판기 객체에서 제품을 -> 고객 객체에게 전달해준다. (제품을 준다 -> 제품을 받는다)
이를 보면 절차지향이나 객체지향이나 모두 같은 단계로 진행되며, 진행 방식 또한 동일하다.
즉 객체지향에서 자판기 객체와 고객 객체라는, 각각 다르게 분류할 수 있는 객체들로 나눈 뒤 이를 필요할 때마다 호출해 참조하고는 있지만 절차지향이나 객체지향이나 순서대로 한 단계씩 진행되는 실행방식을 가지고 있다.
자판기의 동작을 두 개의 방식을 통해 순서도로 표현한 사진이다.
보다시피 각 단계를 표현하는 방식만 다를 뿐, 두 방식 모두 정해진 알고리즘에 의해 실행된다는 점을 알 수 있다.
객체지향의 개념과 특징을 설명하면서 굳이 절차지향과 서로 비교할 필요는 없다.
객체란 기존의 방식인 변수 따로, 함수 따로의 분산적이고 통일성 없는 추상화 과정을 통합하여 문제해결대상을 좀 더 모듈화하기 쉽게 도와주는 도구에 불과하다.
그리고 객체지향 프로그래밍은 이러한 객체의 디자인을 먼저 한 뒤에 이들의 데이터플로우를 짜고 진행 알고리즘을 설계하는 방식의 개발방법론일 뿐이다.
이후에는 절차지향이나 객체지향이나 모두 정해진 알고리즘대로 실행되는 것은 동일하다.
굳이 객체지향의 특징을 '절차지향'이라는 단어를 통해 표현해야 한다면,
절차지향 프로그래밍은 프로그램의 순서와 흐름을 먼저 세우고 필요한 잘구조와 함수들을 설계하는 방식이고,
객체지향 프로그래밍은 반대로 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 이들의 실행순서와 흐름을 짜는 방식이다.
라고 표현하는 것이 혼동을 줄일 수 있는 설명으로 보인다.
물론 위 사진과 같이 객체지향은 기존의 방식에 비해 프로그램의 수행절차를 간소화해 주기는 한다.
모듈화를 통해, 단 몇 줄의 메소드 호출만으로 메인 스레드에서의 필요한 동작을 할 수 있도록 도와주기 때문이다.
하지만 간소화되어 코드가 줄어들었다고 할지라도 코드 각 부분의 실행순서는 엄연히 존재하며, 근본적으로 모듈화라는 것은 그 함수가 호출될 때 참조되어 실행되어야 할 다량의 본체코드가 존재하고 단지 이를 별도의 장소로 분리해서 정리해놓는 기술이라는 사실을 잊어서는 안된다.
절차를 줄여주고 코드의 가독성이 좋은 이유는 순전히 개발자 입장에서나 그렇게 느끼는 것일 뿐 시스템 내부적인 관점에서는 실제로 실행되는 양은 절차지향이나 객체지향이나 큰 차이가 없으며 둘 다 한 번에 한 줄씩 '순서대로' 실행시키는 것에는 다름이 없다.
이러한 점을 고려한다면, 객체지향과 절차지향의 차이점을 좀 더 명확하게 나눌 수 있을 것이다.
객체지향과 절차지향의 차이점
- 절차지향은 변수 따로 함수 따로의 분산적이고 통일성이 없는 코드이지만 객체지향은 좀 더 모듈화되어 체계적이다.
- 절차지향은 과도한 전역변수의 사용으로 인한 디버깅과 확장이 어렵지만 객체지향은 코드의 재사용성이 높으며 디버깅, 유지보수 및 확장이 용이하다.
- 절차지향은 프로그램의 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식이고, 객체지향은 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음 이들의 실행순서와 흐름을 설계하는 방식이다.
- 절차지향은 데이터 중심이며 객체지향은 기능 중심이다.
해당 글은 개인이 공부하면서 정리한 글이기 때문에 정확하지 않은 내용이 있을 수 있습니다.
참조