※본 포스팅은 개인 학습을 목적으로 작성된 것이므로 정확하지 않은 정보가 포함되어 있을 수 있음을 참고 부탁드립니다.
본 포스팅에 앞서 나는 단순히 객체지향과 절차지향 프로그래밍이 서로 반대되는 개념이라고 이해하고 있었던 것 같다. 하지만 포스팅 과정에서 반대 개념으로 접근하는 것이 아닌 방법론적 차이라는 것을 알았다.
(포스팅 타이틀에 절차적 프로그래밍이라고 기재한 이유도 이와 같은 이유에서이다.)
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
절차지향언어 vs 객체지향언어
안녕하세요! 그린컴입니다. 오늘은 sw프로그래밍 분야에서 자주 보이는 단어, 절차지향언어와 객체지향언어...
blog.naver.com
https://gracefulprograming.tistory.com/130
[객체지향] Object-Oriented Programming 핵심 개념의 이해
배경 데이터 흐름(Flow)에 기반한 절차지향적 프로그래밍 방법은 복잡한 로직을 갖는 큰 규모의 소프트웨어 개발에는 적합하지 않습니다. 하드웨어 성능이 폭발적으로 성장하면서 요구되어지는
gracefulprograming.tistory.com