본문 바로가기
Computer Science/Software Engineering

[Software Engineering] 객체지향 프로그래밍, 절차적 프로그래밍

by Baest 2022. 2. 17.

※본 포스팅은 개인 학습을 목적으로 작성된 것이므로 정확하지 않은 정보가 포함되어 있을 수 있음을 참고 부탁드립니다.


본 포스팅에 앞서 나는 단순히 객체지향과 절차지향 프로그래밍이 서로 반대되는 개념이라고 이해하고 있었던 것 같다. 하지만 포스팅 과정에서 반대 개념으로 접근하는 것이 아닌 방법론적 차이라는 것을 알았다.

(포스팅 타이틀에 절차적 프로그래밍이라고 기재한 이유도 이와 같은 이유에서이다.)

 

 

1. 객체지향 프로그래밍 (OOP: Object Oriented Programming)

객체지향 언어: Java, C#, Python 등

 

배경

소프트웨어의 발전 속도가 빨라지며, 자연스럽게 코드도 복잡해졌다. 복잡한 알고리즘을 구현할 때 절차적 프로그래밍을 하면 순서도가 꼬이기 시작하고 코드를 읽어도 동작을 이해할 수 없게 되는 '스파게티 코드'가 되어버린다는 단점이 대두되며 등장했다.

그리고 현재까지도 대세를 유지하고 있다.

일부 절차적 프로그래밍 언어들도 객체지향의 특징을 가져오기 시작했는데, 대표적으로 C++이 있다. C언어 기반이며, 추가적으로 캡슐화와 상속 등을 지원하게 만들어져있다. 다만, C++의 경우 하나의 패러다임일 뿐 객체지향적 특징을 지원한다고 해서 객체지향 언어라고 불리지는 않는다고 한다.(내가 참고한 블로그에 따르면, C++을 객체지향 언어라고 하는 사람들이 꽤나 있다고 언급했다.)

 

 

객체

'객체'에 대해여 Java를 공부할 때 수없이 많이 들었다. 하지만, 매번 설명하려고 하면 애매해지는건 왜일까.

객체란.. 그냥 어떤 사물,사람? 이랄까.. 역시 애매해 지는 설명

 

왜 이렇게 낯설까? 생각해봤다. 객체, 즉 Object는 서양문화를 기반으로 탄생한 프로그래밍과 함께 쓰이는 경우가 많다. 17세기 철학이 발전하며, 철학가들은 이성, 인간, 신, 실체 등에 대해서 고민하고 연구한다. 그 중 데카르트가 아래와 같은 명언을 남긴다.

 

"나는 생각한다. 고로 존재한다"

 

여기서 주체와 객체로 나눌 수 있는데, 주체는 실체인 나를 가리키는 말이고 객체는 주체가 사고하는 무언가이다.

예를 들어 'John이 사과를 산다'라는 문장이 있다면, 어떤 행위를 하는 'John'은 주체이고 판매되어지는 '사과'는 대상인 객체가 된다.

정리하자면, 객체(Object)는 '사람이 인지할 수 있는 대상들이라고 할 수 있다'.

 

 

특징 및 장단점

'데이터와 기능(함수)들을 묶어 하나의 객체'로 만들어 사용'

특징 중 일부는 아래와 같다. 대체적으로 아래 두 가지가 적용 가능할 경우 객체지향 성격이 강하고, 그렇지 않을 경우 절차적 성격이 강하다고 할 수 있다.

 

- 캡슐화, 다형성, 상속

- 데이터 접근 제한 가능

 

장점

- 모듈화, 캡슐화로 인해 유지보수에 용이

- 현실 세계와 유사성에 의해 이해하기 쉬운 코드 작성이 가능

- 코드의 재활용성이 높음

- 디버깅이 쉬움

 

❌단점

- 대체적으로 객체지향 프로그래밈의 속도가 상대적으로 느리고 많은 양의 메모리 사용

- 현실 세계와 유사성에 의해 이해하기 쉬운 코드 작성이 가능한 만큼 설계 과정에서 시간이 많이 필요

 

 

흐름도

*이미지 출처: https://blog.naver.com/atalanta16/220249264429

 

👉 1) 고객이 할 수 있는 행위(기능)들과 데이터들을 하나로 묶어 고객이라는 객체 생성

       2) 자판기에서 할 수 있는 행위들과 데이터들을 묶어 자판기라는 객체로 묶어서 처리

 


 

2. 절차적 프로그래밍 (PP: Procedure Programming)

절차지향 언어: C (그 외: ALGOL, COBOL, FORTRAN)

 

배경

위의 객체지향 파트에 언급한 바와 같이 소프트웨어의 급격한 발전이전까지는 절자적 프로그래밍으로 진행되었으나 이후 규모가 커지고, 복잡해지면서 낮은 품질 등으로 인해 객체지향 프로그래밍이 대안으로 나오게 되었다.

 

 

특징 및 장단점

'데이터를 중심으로 함수'를 만들어 사용

특징 중 일부는 아래와 같다. 대체적으로 아래 두 가지가 적용 가능할 경우 객체지향 성격이 강하고, 그렇지 않을 경우 절차적 성격이 강하다고 할 수 있다.

 

- 캡슐화, 다형성, 상속

- 데이터 접근 제한 가능

 

장점

- 객체지향 프로그래밍에 비해 속도가 빠른편

 

❌단점

- 유지보수가 어려움

- 코드의 순서가 바뀌면 의도와 다르게 동작할 수 있음 (엄격한 순서 -> 비효율이라고 할 수 있음)

- 프로그램 분석과 디버깅이 어려움

 

 

흐름도

*이미지 출처: https://blog.naver.com/atalanta16/220249264429

 

👉 데이터의 순서를 파악하고 필요한 기능을 함수로 만들어 절차적으로 진행

 

 

 

References

 

https://st-lab.tistory.com/151

 

객체지향(OOP)과 절차적 프로그래밍(PP)

오늘은 프로그래밍에서 중요한 개념 중 하나인 객체지향 프로그래밍(Object Oriented Programming)과 절차적 프로그래밍(Procedure Programming)에 대해 알아보고자 합니다. 대개 객체지향 프로그래밍 언어를

st-lab.tistory.com

 

https://brownbears.tistory.com/407

 

절차지향 VS 객체지향

절차지향(Procedural Programming)이란? 절차지향 프로그래밍이란 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법

brownbears.tistory.com

 

https://blog.naver.com/PostView.naver?blogId=gitacademy01&logNo=222394033958&redirect=Dlog&widgetTypeCall=true&directAccess=false 

 

절차지향언어 vs 객체지향언어

안녕하세요! 그린컴입니다. 오늘은 sw프로그래밍 분야에서 자주 보이는 단어, 절차지향언어와 객체지향언어...

blog.naver.com

 

https://gracefulprograming.tistory.com/130

 

[객체지향] Object-Oriented Programming 핵심 개념의 이해

배경 데이터 흐름(Flow)에 기반한 절차지향적 프로그래밍 방법은 복잡한 로직을 갖는 큰 규모의 소프트웨어 개발에는 적합하지 않습니다. 하드웨어 성능이 폭발적으로 성장하면서 요구되어지는

gracefulprograming.tistory.com