본문 바로가기

- Programming/- 개념 잡기

★ 19. 객체지향 vs 절차지향 차이점

반응형

객체지향과 절차지향


다양한 프로그래밍을 하기 위한 언어로는 여러 종류가 있습니다.

여러 언어들은 크게 두 가지로 나눌 수 있습니다.

"객체지향과 절차지향"언어 두 가지로 말이죠.

언어들을 설명하기에 앞서 빠른 이해를 위하여 예시를 들어보도록 하겠습니다.


자동차를 만들기 위한 부품으로는 바퀴, 엔진, 의자, 핸들 등 다양한 부품들이 있어야 합니다. 자동차를 조립해야 할 때 절차지향적인 방식으로 만든다면 어느 한 부분을 기점으로하여 순서대로 만들어야합니다. 예를들면, 엔진 -> 차체 -> 핸들 -> 의자 이런 식으로 만들게됩니다. 이 경우 서로 분리되면 안되고 순서가 틀려도 안됩니다. 하나가 고장나게 되면 전체 기능이 흔들릴 정도로 설계되었다고 가정할 수 있습니다. 만약 처음에 조립할 때 부품을 다른 종류로 대체할 수 없다고한다면 상당히 비효율적일 것입니다.

같은 조건으로 이번엔 객체지향을 예로 들어보겠습니다. 일단 제작할 때 순서적이지 않아도 됩니다. 의자든 엔진이든 무엇을 먼저 만들지는 순서가 없어도 상관이 없습니다. 각각 따로 개발되어도 나중에 한 곳에 모였을 때 자신만의 기능을 하면 될 것입니다.

실제 자동차가 제작되는 과정도 같은 원리입니다. 만들어진 자동차가 어느 한 부품이 고장이 나더라도 전체 부품에 영향을 미치지 않으며 고장난 부품만 고쳐주면 됩니다. 또한, 필요할 때 마음에 들지 않는 부품이 있다면 더 좋은 것으로 바꿀 수도 있습니다.


위와 같은 예로 절차지향과 객체지향에 대해 조금은 감을 잡으셨을 것입니다.

- 절차지향 프로그래밍 -

물이 위에서 아래로 흐르듯 순차적인 처리가 중요합니다. 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법입니다. 대표적인 절차지향 언어로는 C언어가 있습니다. 이는 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체지향 언어를 사용하는 것에 비해 더 빠른 처리 시간을 가지게 되는 점에서 유리합니다. 그러나 기술이 발전되고 소프트웨어, 하드웨어가 발전함에 따라 상황은 많이 달라졌습니다. 전에는 하드웨어와 소프트웨어의 개발 속도의 차가 크지 않았지만 소프트웨어 언어의 발달과 컴파일러의 발달로 하드웨어가 소프트웨어의 발달을 따라오지 못하는 상황이 발생했습니다. 이는 객체지향 언어가 등장하게 되는 계기로 작용했습니다. 객체지향 프로그래밍은 개발하려는 것을 기능별로 묶어 모듈화하며 하드웨어가 같은 기능을 중복으로 연산하지 않도록 하고 모듈을 재활용하여 하드웨어의 처리량을 획기적으로 줄일 수 있게 되었습니다.

- 객체지향 프로그래밍 -

실제 세계를 모델링해 소프트웨어를 개발하는 방법입니다. 객체지향 프로그래밍에서는 데이터와 절차를 하나의 덩어리로 묶어서 생각합니다. 마치 컴퓨터 부품을 하나씩 구매해 컴퓨터를 조립하는 것과 같은 방식입니다.
객체지향의 3가지 특성에 대해 알아보겠습니다.

1. 캡슐화
캡슐화는 관련된 데이터와 알고리즘(코드)이 하나의 묶음으로 정리된 것으로, 개발자가 만들었으며 관련된 코드와 데이터가 묶여 있고 오류가 없어 사용이 편합니다. 데이터를 감추고 외부 세계와의 상효 작용은 메소드를 통해 이루어지며 라이브러리를 만들어 업그레이드하면 쉽게 바꿀 수 있습니다.
여기서 메소드란 메시지에 따라 실행시킬 프로시저로서 객체지향 언어에서 사용되는 것입니다. 객체 지향 언어에서는 메시지를 보내 메소드를 수행시킴으로써 통신을 수행합니다.

2. 상속
상속은 이미 작성된 클래스를 이어 받아 새로운 클래스를 생성하는 기법으로 위에서 말한 기존 코드를 재활용하여 사용하는 것을 의미합니다. 객체지향의 큰 장점 중 하나입니다.

3. 다형성
다형성은 하나의 이름으로 많은 상황에 대처하는 방법입니다. 개념적으로 동일한 작업을 하는 함수들에 같은 이름을 부여할 수 있으며 코드가 더 간단해지는 효과가 있습니다.

위의 특성들로 생기는 객체지향의 장점은 다음과 같습니다.

  • 신뢰성 있는 소프트웨어를 쉽게 작성할 수 있다.
  • 코드를 재사용하기 쉽다.
  • 업그레이드가 쉽다.
  • 디버깅이 쉽다.

이론적으로 본다면 객체지향 언어는 절차지향 언어에 비해서 장점이 많은 편입니다. 하지만 프로그래밍에서 항상 객체지향 언어를 사용하는 것은 아닙니다. 객체지향 언어는 어떤 하나의 기능만 필요하더라도 전체를 가져와야하기 때문에 절차지향 프로그래밍보다 프로그램의 사이즈가 커질 수도 있습니다. 또한 데이터에 접근하는 것도 절차지향보다 상대적으로 느려질 가능성이 많습니다. 메소드를 통해 접근이 가능하기 때문에 절차지향처럼 1개를 딱 찝어 접근할 수 없으며 참조하에 접근이 가능하므로 속도적인 측면에서 불이익이 있습니다.

그럼 절차지향, 객체지향을 어느 때 쓰느냐에 대해 궁금하실 수 있을텐데 이것은 개발자의 몫이라고 볼 수 있습니다. 코드의 사이즈를 최소화하고 가장 빠르게 동작하는 것이 최우선의 목적이라면 객체지향보다는 절차지향을 사용하는게 좋습니다. 대부분 C로 구성하고 C++를 쓴다 하더라도 절차지향의 방식으로 사용합니다. 반면 PC 플랫폼의 경우에는 객체지향이 대세입니다. PC는 모바일 디바이스에 비해 무한한 자원을 확보하기 때문에 위에서 말한 오버로드가 아무 것도 아닌 것이 됩니다. 예를 들면 물이 든 컵에 물 한 수저를 넣으면 높이에 차가 있지만 큰 수영장에 물을 한 수저 넣는다고해서 높이의 차가 거의 생기지 않는 것과 비슷합니다. 그정도의 오버로드는 무시가 될 수 있고 대부분 개발 툴들이 이미 객체지향의 형태로 제공되고 있습니다.

두 방식에 견해도 틀리고 호불호도 갈릴 수 있지만 정답은 X! 선택은 개발자가 하는 것입니다.

해당 포스팅은 아래 URL의 게시글을 보며 작성하였습니다.


반응형