안녕하세요! 위시켓입니다.

지난 그린 클라이언트, “파이썬 시리즈 1탄 – Monty Python’s Flying Circus”에서는 요즘 뜨거운 관심을 받는 언어인 파이썬에 대해 다뤄봤습니다.
이번 시간에는 프로그래밍 언어를 분류할 수 있는 가장 명확한 기준에 대해 알아볼텐데요.

객체지향 및 절차지향 프로그래밍에 대한 내용으로 주제를 정했습니다.

 

 

컴퓨터 프로그래밍을 하기 위한 언어에는 많은 종류가 있습니다. 이러한 언어들은 크게 두 가지로 나누어집니다. 바로 객체지향 언어와 절차지향 언어입니다. 이 언어들에 대한 설명에 앞서 빠른 이해를 위해 예시를 하나 들어보겠습니다.

자동차를 만들기 위해서는 엔진, 핸들, 바퀴, 의자, 엑셀, 브레이크 등등… 많은 부품들이 있어야 합니다. 기존 방식 절차지향적 관점으로 본다면 자동차를 만들기 위해서는 어느 한 곳을 기점으로 순서대로 만들어가야 합니다. 엔진 -> 차체 -> 핸들 -> 의자 -> 바퀴 이런 식으로 만들어가며 이들은 서로 분리되면 안되고 순서가 틀려서도 안되며 하나가 고장 나면 전체 기능이 마비되도록 설계되었다고 가정해봅시다. 또한 이들은 처음에 조립될 때의 부품을 다른 종류의 것으로 대체할수도 없다는 전제도 있다고 한다면! 얼마나 비효율적이고 비생산적일까요? 허나 여기에 객체지향 개념의 방식이 도입되면 상황은 달라집니다. 그러면 일단 제작에 있어서 이들은 순서적이지 않아도 됩니다. 핸들을 먼저 만들든, 바퀴를 먼저 만들든, 엔진을 먼저 만들든 상관이 없어집니다. 이들은 각각 따로 독립적으로 개발되어 나중에 한곳에 모여 자신의 기능만 제대로 발휘하면 되니까요. 실제 자동차를 만드는 과정과 똑같은 원리입니다. 부품들이 결합되어 움직이다 어느 하나가 고장이 나더라도 전체 부품들에 영향을 미치지는 않습니다. 고장난 부품만 고쳐주면 될 뿐, 다른 부품들은 아무 영향을 받지 않습니다. 그리고 필요하면 어느 때든 마음에 안드는 부품을 다른 것으로 교체할 수 있고 더 좋은 것으로 바꿀수도 있습니다.

 

이 예에서 대략적인 감을 잡으셨을 거라 생각하고 더 자세한 설명을 시작해 보겠습니다.

 

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

 

객체지향의 정의를 살펴보면 객체지향이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방법입니다. 객체지향 프로그래밍에서는 데이터와 절차를 하나의 덩어리로 묶어서 생각하게 됩니다. 이는 마치 컴퓨터 부품을 하나씩 사다가 컴퓨터를 조립하는 것과 같은 방법입니다. 객체 지향의 3대 특성으로는,

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

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

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

 

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

  •  신뢰성 있는 소프트웨어를 쉽게 작성할 수 있다. (개발자가 만든 데이터를 사용하기에 신뢰할 수 있다.)
  •  코드를 재사용하기 쉽다.
  •  업그레이드가 쉽다.
  •  디버깅이 쉽다.

 

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

 

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

 

두 방식에 대해 호불호가 가려질 수 있지만 정답은 없습니다. 선택은 개발자가 하는 것 입니다.
이번 시간에는 절차지향 언어와 객체지향 언어를 통한 두 가지 프로그래밍에 대해 설명해드렸는데요, 이해하기 쉽고 도움이 되는 포스팅이었길 바랍니다.
다음 그린 클라이언트 역시 재밌고 유익한 개발 상식으로 찾아뵐게요:D

 

 

 
150120_wishket_blog_under

블로그 이미지

532

처음 프로그래밍을 시작한 개발자들은 Hello World!를 기억 할 것이다. Hello world가 Hell World가 될 줄 몰랐던 한 개발자의 이야기. 게시글의 출처를 표기하며, 출처를 남기지 않고 펌을 하는것에 대해 법적 책임을 묻지 않습니다.

댓글을 달아 주세요