본문 바로가기

CS/Basic

[CS] 절차 지향 vs 객체 지향

절차 지향(Procedural Programming)

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

 

절차 지향(Procedural Programming) 특징

  • 대표적인 예로는 C언어
  • 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리

 

장점

- 컴퓨터의 처리구조와 유사해 실행 속도가 빠름.

 

단점

- 어려운 유지보수와 디버깅

- 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움

 

객체지향(Object Oriented Programming)

객체지향 프로그래밍에서는 데이터와 절차를 하나의 덩어리로 묶어서 생각.

 

소프트웨어 언어의 발달과 컴파일러의 발달로 하드웨어가 소프트웨어의 발달을 따라오지 못하는 상황이 발생함. 이는 객체지향(Object Oriented Programming) 언어가 등장하게 되는 계기로 작용. 객체지향 프로그래밍은 개발하려는 것을 기능별로 묶어 모듈화를 함으로써 하드웨어가 같은 기능을 중복으로 연산하지 않도록 하고, 모듈을 재활용하기 때문에 하드웨어의 처리량을 획기적으로 줄여줌.

 

이론적으로만 본다면 객체지향 언어는 절차 지향 언어에 비행 장점이 많지만 프로그래밍을 할 때 항상 객체지향 언어만 사용하는 것은 아니다. 객체지향 언어는 어떤 모듈에 있는 하나의 기능만 필요하더라도 모듈 전체를 가져와야 하기 때문에 절차 지향 프로그래밍보다 프로그램 사이즈가 더 커질 수도 있다. 또한 데이터에 대한 접근도 상대적으로 절차 지향식보다 느려질 가능성이 많다. 메소드를 통해서만 접근이 가능하기 때문에 절차 지향식처럼 특정 함수에 접근할 수 없고, 식으로만 접근이 가능해 속도적인 측면에서 불이익이 있다.

 

객체지향(Object Oriented Programming) 특성

 

1. 캡슐화(Encapsulation)

- 객체를 캡슐로 싸서 그 내부를 보호하고 볼 수 없게 하는 것으로 객체의 가장 본질적인 특징

* 필드 : 물체의 상태 / Ex) String name, String CarName, Int age  등
* 메소드 : 물체의 행동 / Car에 이름과 번호가 있기도 하지만, Car는 앞으로 전진할 수도 있고 후진하는 행동도 할 수 있다. / Ex) void go(); , void Back(); 등

2. 상속(Inheritance)

상위 개체의 속성을 하위 개체에 물려줘 하위 개체가 상위 개체의 속성을 모두 가지는 관계
상속은 슈퍼클래스에 만들어진 필드와 메소드를 물려받음으로써 코드의 중복 작성을 방지하고, 코드를 재사용함으로써 코드 작성에 드는 시간과 비용을 줄여줌.

3. 다형성(Polymorphism)

같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 구현되는 것
JAVA로 예를 들면, 슈퍼 클래스에 구현된 메소드를, 서브 클래스에서 자신의 특징에 맞게 동일한 이름으로 다시 구현하는 이른바 메소드 오버라이딩(Overriding)으로 부르고, 클래스 내에서 같은 이름의 메소드를 여러 개 만드는 메소드 오버로딩(Overloading)이 있습니다.

 

장점

- 코드의 높은 재활용성

- 절차 지향보다 간편한 코딩

- 쉬운 디버깅

 

단점

- 절차 지향보다 느린 처리속도

- 설계에 많은 시간 소요

 

차이점

절차지향과 객체 지향의 방식

 

객체지향 역시 절치 지향과 동일한 순서로 실행되지만 절차 지향은 데이터를 중심으로 함수를 구현하고, 이에 반해 객체지향은 기능을 중심으로 메소드를 구현한다.

 

절차 지향 언어를 사용한다면, 말 그래도 실행 순서, 절차가 더 중점이 되고, 객체지향 언어를 사용한다면, 필요한 객체들의 종류와 속성 등이 더 중점이 된다.

 

즉, 절차 지향의 반대는 객체지향이 아니고, 객체지향의 반대는 절차 지향이 아닙니다.

절차 지향과 객체 지향의 예시


자판기로 예를 들면,

 

절차 지향 프로그래밍(POP)의 경우

"시작 -> 동전 입력 -> 돈이 충분한가? -> 상품 선택 -> 상품 재고가 남아있나? -> 상품 인도 -> 종료"처럼 절차가 중점

 

객체 지향 프로그래밍(OOP)의 경우 또한 절차를 따르지만

"돈통, 커피통, 물통, 프림통, 컵통, 디스플레이, 자판기 엔진, 버튼 1,2,3..."객체가 중점

 

 

정리

  절차지향(POP) 객체지향(OOP)
접근 방식 Top-Down
(시스템 동작 방식을 먼저 생각,
그 다음 세부 모델 디자인)
Bottom-Up
(세부 모델 디자인 후 조립)
구현 관점 전체적인 기능 동작을 고려

각 단계별로 기능을 구현
필요한 속성의 객체를 설계
(보안성, 데이터, 함수 등)

각 객체의 상호작용(절차)을 설계
구성 요소 함수 객체
접근 제어 Public Public, Protected, Private
오버로딩, 다형성 불가능 함수, 생성자, 연산자 등을 오버로딩 가능
상속 불가능 가능(Public, Protected, Private)
보안성 낮음 높음
데이터 공유 모든 함수가 공유 가능 객체 간 멤버함수로만 공유 
Friend 함수 없음 C++에 있음
가상 클래스, 가상 함수 없음 상속 개념 아래 존재함
예시 언어 C, Visual Basic, Fortran, Pascal C++, Java, VB.NET, C#, Python
장점 설계하기 좋음 구조를 파악하기가 좋음
코드를 절약할 수 있음
단점 구조가 복잡해지고 중복 코드를 작성할 수 있음 오버헤드를 최적화 하지 않으면 상대적으로 느려짐
용도 한정된 자원
초기부터 설계
큰 규모
잦은 협업
생산성 중시

 

 

참고

참고 블로그 - UsefulToKnow

참고 블로그 - 불곰