절차 지향과 객체 지향 언어의 프로그래밍 특징
절차 지향 언어(Procedure Oriented Language)
란 프로그램 코드가 순서대로 실행되는 언어입니다. 4세대 이전의 모든 프로그래밍 언어가 절차 지향 언어에 해당하며, PASCAL, COBOL, FORTRAN, BASIC, C언어 등이 있습니다.
창고에 사과를 넣는다는 내용을 절차 지향 언어의 프로그래밍 개념으로 설명하겠습니다.
절차 지향 언어의 프로그래밍 개념 |
|
1. 창고 문을 연다 | open – 창고 |
2. 사과를 넣는다 | insert 사과 |
3. 창고 문을 닫는다 | close 창고 |
창고에 사과를 넣는 과정 | 창고에 사과를 넣는 프로그램 |
절차 지향 언어는 소프트웨어 규모가 복잡해지면 운영 및 유지 비용이 많이 든다는 단점이 있습니다. goto문의 잦은 사용으로 몇 번의 수정을 거친 프로그램이 너덜너덜해져서 더 이상 정상적인 기능을 하지 못하기 때문인데요. 이러한 단점을 보완하고자 goto문의 무분별한 분기 구조를 개선하고 모든 명령문의 처리를 블록으로 모듈화 시키기 위해 구조적 프로그래밍(Structured Programming)이 등장했습니다.
구조적 프로그래밍의 특징
1. 프로그램을 읽고 이해하기가 쉽습니다.
2. 프로그램의 개발 및 유지 보수의 효율성이 높습니다.
3. 프로그래밍 규칙이 제공됩니다.
4. 프로그래밍에 대한 신뢰성이 높습니다.
5. 프로그래밍에 소요되는 시간과 노력이 감소됩니다.
구조적 프로그래밍을 위해 지켜야 할 준수 사항
1. 프로그램을 구성하는 각 요소는 작은 규모로 조직화합니다.
2. 단일 입출구(Single Entry, Single Exit) 형태로 작성합니다.
3. 가능한 한 goto문은 사용하지 않습니다.
4. 순차 구조, 선택 구조, 반복 구조만 사용합니다.
객체 지향 언어(Object Oriented Language)
란 데이터와 기능을 하나로 묶어 객체 단위로 실행되는 언어입니다. 1990년대에 본격적으로 등장했으며, C++, JAVA, Visual Basic 등이 있습니다.
절차 지향 언어와 객체 지향 언어의 차이점
절차 지향 언어는 데이터와 데이터를 처리하는 기능(=프로그램)이 분리되어 변화하는 현실세계와 사용자의 요구를 제대로 반영하지 못합니다. 예를 들어 박철수라는 사람을 데이터, 그의 행동을 기능이라고 가정합니다. 박철수 씨는 휴식을 원하고 있는데 정작 일을 한다면 정상적으로 살 수 없는 것처럼, 데이터와 기능이 분리되면 프로그램의 운영 및 유지가 어렵습니다.
객체 지향 언어는 데이터와 기능을 묶어 캡슐화시키므로 효율적입니다. 아래의 이미지는 절차 지향 언어와 객체 지향 언어의 차이점을 보여주고 있습니다. 좌측부터 첫 번째 이미지는 데이터와 기능이 별도로 관리되는 절차 지향 언어로, 프로그램은 기능 호출을 통해 데이터에 접근하여 일을 처리합니다. 그 오른쪽에 있는 이미지는 객체 지향 언어로 기능과 데이터로 묶어 캡슐화시킨 후 메시지를 전달하여 일을 처리합니다.
객체 지향 언어의 주요 개념
객체(Object)는 개별적으로 식별되는 사물을 지칭하는 뜻으로, 우리 주위에 컴퓨터, 책상, 선풍기, 자동차 등이 해당됩니다. 객체는 속성(Attribute)과 기능(Function)을 가지는데, 속성은 각 객체가 가진 특징적인 성질이고 기능은 객체의 행동 패턴입니다. 객체는 바로 이 속성과 기능을 함께 캡슐화합니다. 비행기라는 객체는 비행기의 색깔, 종류, 크기, 모양, 최고속도 등의 속성을 가지고 이륙과 착륙, 활공 등의 기능을 합니다.
클래스와 상속
클래스(Class)란 다른 사물과 구분되는 속성을 가진 객체가 모여, 일반화된 범주로 묶인 것을 뜻합니다. 클래스에 속한 객체는 공통 속성과 기능을 가집니다. 예를 들어 내 차와 박철수 씨 차는 각각 객체로 구분되고, 이들이 모이면 자동차라는 클래스가 됩니다. 모든 객체는 하나의 핸들과, 4개의 타이어를 가지면 전진과 후진, 주차와 가속이 가능합니다. 이때 클래스 속성을 데이터 멤버, 기능을 메소드(Method)라고도 합니다. 모든 객체는 클래스에 속하며 자동으로 클래스에 속하는 모든 속성과 기능을 가집니다.
클래스는 다시 하위 클래스로 나눌 수 있습니다. 하위 클래스는 상위 클래스가 가지는 속성과 기능을 모두 가지고 있는데, 이를 클래스 상속(Inheritance)이라 합니다. 예를 들어 자동차는 소형, 중형, 대형 자동차로 나눌 수 있고, 이들 모두 자동차의 속성과 기능을 가집니다. 하위 클래스는 상속된 속성, 기능과 함께 자신만의 독특한 속성과 기능을 가지기도 합니다.
메시지
메시지(Message)란 객체 간에 전달되는 명령 단위라고 할 수 있습니다. 객체는 자발적으로 행위를 수행하지 않으며, 객체가 특정 기능을 수행하기 위해서는 메시지가 전달돼야 합니다. 자동차가 움직이려면, 운전자가 가속 페달을 밟아 직진하라고 신호를 줘야 하는 것과 같은 맥락입니다. 메시지가 다듬어져서 프로그램화되면 메소드로 진화합니다.
추상화
추상화(Abstraction)란 어떤 객체가 상대하는 다른 객체에 대해, 꼭 필요한 부분만 알고 나머지 세부적인 사항은 감추는 것을 뜻합니다. 추상화는 객체 지향 프로그래밍에서 매우 중요한 개념이며 이를 얼마나 잘 구현하느냐에 따라 시스템의 품질이 결정됩니다.
캡슐화
객체를 정의한다는 것은 객체가 가진 속성과 기능, 다른 객체와의 관계를 정의하는 것입니다. 캡슐화(Encapsulation)란 객체에 속성과 기능을 포함하면서 추상화 개념을 통해 객체의 세부 내용은 사용자로부터 은폐하는 것입니다. 예를 들어 자동차의 엔진 객체에 대해서는 사용자가 세부 동작 원리를 알 필요 없이 어떤 기능을 하는지만 알면 됩니다.
캡슐화는 제삼자로부터 객체 내부의 데이터와 기능의 변조를 막아 프로그램의 재사용성과 유지 보수성이 뛰어납니다. 따라서 개발자는 캡슐화로 발생하는 불편함을 감내할 만한 충분한 가치가 있다고 판단합니다.
다형성
위에서 언급했던 상위 클래스를 일반화된 클래스, 하위 클래스를 특정화된 클래스라고 합니다. 일반화된 클래스는 어떤 특정화된 클래스 객체를 지칭할 수 있기 때문에 같은 동작을 하지만 다른 성질을 가질 수 있습니다. 이런 성질을 다형성(Polymorphism)이라 합니다.
상속
상속(Inheritance)은 객체 지향 언어에서 주로 사용되는 재사용 수단으로 다형성과 밀접한 관계가 있습니다. 하위 클래스는 상속을 통해 상위 클래스의 속성과 기능을 그대로 재사용할 수 있습니다.
객체 지향 언어를 이용한 프로그래밍 오해
객체 지향 언어를 사용한다고 해서 절차 지향 언어를 사용할 때보다 무조건 유지 보수성이 더 좋아지는 것은 아닙니다. 오히려 절차 지향 언어보다 더 복잡해지며 유지 보수성 또한 훼손시킬 수 있습니다. 무늬만 객체 지향 프로그래밍이 아닌, 객체 지향 언어의 특성이 반영된 설계를 바탕으로 구현해야 합니다. 그러기 위해서는 객체 지향 언어의 본질적인 개념부터 이해해야 할 필요가 있습니다.