[Concepts] 절차지향언어와 객체지향언어의 프로그래밍[Concepts] 절차지향언어와 객체지향언어의 프로그래밍

Posted at 2019. 12. 18. 19:15 | Posted in Computer Concepts
반응형




출처 : IT CookBook, 컴퓨터 사이언스




■ 프로그램 개발 과정



① 사용자 요구사항 분석

 -. 사용자의 필요나 문제가 무엇인지 파악하고 이해하기 위한 단계이다.


② 프로그램 설계

 -. 실제 코딩을 할 때 사용할 논리를 프로그래머가 대략적으로 그려내는 단계로 알고리즘 설계라고 한다.

 -. 알고리즘(Algorithm)이란 문제를 푸는 방법에 대하여 순서를 정하는 것이다.


③ 코딩 및 컴파일

 -. 프로그래밍 언어로 실제 프로그램을 작성하는 과정을 코딩이라고 한다.

 -. 코딩이 끝나면 고급 언어로 작성된 명령문을 기계어로 바꾸는데 이를 컴파일이라고 한다.


④ 디버깅 및 테스트

 -. 디버깅이란 오류를 찾아 제거하는 과정이다.

 -. 모든 오류 점검을 마치면 시험용 데이터를 입력해 테스트한 후 프로그램 개발을 완료한다.










■ 절차 지향 언어의 프로그래밍




1990년대 이전에 나온 대부분의 프로그래밍 언어는 절차 지향 언어이다.


대표적인 예로 파스칼, 코볼, 포트란, 베이직, C언어 등이 있다.


절차 지향 언어의 개념과 특징을 살펴보자.




#01. 절차 지향 언어의 개념



"냉장고에 소고기를 넣는다"는 내용이 다음 그림의 A와 같은 순서로 이루어진다고 가정하자.


이것을 프로그램으로 작성하면 B와 같다.


이와 같은 절차 지향 언어(Procedure Oriented Language)란 프로그램 코드를 순서대로 작성하여 실행하는 언어이다.


   A. 냉장고에 소고기를 넣는 과정

 

   B. 냉장고에 소고기를 넣는 프로그램


     ① 냉장고 문을 연다.

     ② 소고기를 넣는다.

     ③ 냉장고 문을 닫는다.


 

     ① Open 냉장고

     ② Insert 소고기

     ③ Close 냉장고




#02. 구조적 프로그래밍의 이해



절차지향 언어는 명령을 실행하는 순서가 자주 바뀌거나 복잡해지면 운영 및 유지 비용이 많이 든다.


이러한 문제를 해결하기 위해 등장한 개념이 구조적 프로그래밍(Structured Programming)이다.


구조적 프로그래밍은 말 그대로 명령어 실행 순서가 뒤바뀌거나 제어 구조가 복잡해지지 않도록 몇가지 규칙에 따라 프로그램을


체계적으로 관리할 수 있다.



   





위 그림에서 A는 무분별한 goto문과 무한 루프의 사용으로 체계성을 잃어 버린 나쁜 프로그램의 예이다.


프로그램을 이해하기도 어렵거니와 수정하더라도 여러 부분을 고쳐야 하는 문제가 있다.


B는 순차 구조, 선택 구조, 반복 구조를 사용하여 프로그램을 모듈화 시킨 좋은 프로그램의 예이다.


명령문의 처리가 블록으로 모듈화 되어 이해가 쉽고 수정도 수월하다.




#03. 구조적 프로그래밍의 특징


 ① 프로그램을 읽고 이해하기 쉽다.

 ② 프로그램의 개발 및 유지 보수의 효율성이 높다.

 ③ 프로그래밍 규칙이 제공된다.

 ④ 프로그래밍에 대한 신뢰성이 높다.

 ⑤ 프로그래밍에 소요되는 시간과 노력이 감소된다.




#04. 구조적 프로그래밍을 하기 위해 지켜야 할 기준


 ① 프로그램을 구성하는 각 요소를 작은 규모로 조직화 한다.

 ② 단일 입 · 출구(Single Entry, Single Exit) 형태로 작성한다.

 ③ 가능하면 goto문을 쓰지 않는다.

 ④ 순차 구조, 선택 구조, 반복 구조만 쓴다.









■ 객체 지향 언어의 프로그래밍




객체 지향 언어(Object Oriented Language)는 객체 단위로 데이터와 기능을 하나로 묶어 쓰는 언어이다.


1990년대에 본격적으로 등장했고 대표적인 언어로 비주얼 베이직, C++, 자바 등이 있다.




#01. 절차 지향 언어와 객체 지향 언어의 차이점



절차 지향 언어는 변하는 현실세계와 사용자의 요구에 유연하게 대처하지 못한다.


예를 들어 홍길동이라는 사람을 데이터, 그의 행동을 기능이라고 가정해 보자.


홍길동은 밥을 먹은 후 운동하길 원하는데, 절차 지향 언어로 운동을 한 후 밥을 먹게끔 프로그래밍해 놓으면


순서를 바꾸기 위해 프로그램을 수정해야 한다.


그러나 객체 지향 언어로 밥을 먹는 것과 운동을 하는 것을 분리해 놓으면 프로그램을 수정할 필요가 없다.


이처럼 객체 지향 언어는 원하는 기능과 데이터를 따로 정의한 후 필요할 때마다 묶어 사용하기 때문에


프로그램의 운영 및 유지가 쉽다.








위 그림은 절차 지향 언어와 객체 지향 언어의 차이점을 나타낸 것이다.


절차 지향 언어는 데이터와 기능이 별도로 관리되는 언어로 프로그램은 기능을 호출하여 데이터에 접근하고 일을 처리한다.


객체 지향 언어로 기능과 데이터로 묶어 캡슐화시킨 후 메시지를 전달하여 일을 처리한다.




 Class 소고기 {


       소고기 속성( 무게, 부위, 원산지, 가격 );

       소고기(  );


 }


 Class 냉장고 {


       냉장고 속성( 용량, 전력소모량, 제조사, 색상, 가격 );

       냉장고(  );

       Open(  );

       Insert( 소고기 );

       Close(  );

 }





위 코드는 절차 지향 언어를 객체 지향 언어로 프로그래밍 한 것이다.


객체 지향 언어는 절차 지향 언어와 달리 정해진 순서 없이 단지 해당하는 작업만 수행한다.





#02. 객체 지향 언어의 주요 개념




객체 지향 언어가 공통적으로 가지는 요소와 특징에 대해 구체적으로 살펴보자.




01) 클래스와 객체



클래스(Class)란 다른 사물과 구분되는 속성을 가진 객체가 모여 일반화된 범주로 묶인 것이다.


즉, 객체에 대한 일반화된 틀(Template)을 제공한다.


예를 들어 자동차 클래스가 있다면 이 클래스는 내 자동차, A씨의 자동차, B씨의 자동차, C씨의 자동차 등의 객체로 구성될 수 있다.



객체(Object)는 속성(Attribute)는 기능(Function)을 갖는다.


속성은 각 객체가 가진 고유한 특징이고, 기능은 행동패턴을 말한다.


객체는 바로 이 속성과 기능을 함께 캡슐화 한다.


예를들어 "홍길동 차"라는 객체는 색깔, 차종, 크기, 모양, 최고 속도 등의 속성을 가지고,


전진과 후진, 정지, 가속과 감속 등의 기능을 한다.


이러한 속성과 기능은 패키지로 묶여 관리된다.





02) 상속




클래스는 필요한 경우 더 세분해서 각각의 특성별로 관리할 수 있는데 이것을 하위 클래스라고 한다.


하위 클래스는 상위 클래스가 가지는 속성과 기능을 모두 이어받을 수 있다.


이를 상속이라고 한다.



상속(Inheritance)은 객체 지향 언어에서 주로 사용되는 재사용 수단으로 다형성과 밀접한 관계가 있다.


하위 클래스는 상속을 통해 상위 클래스의 속성과 기능을 그대로 재사용할 수 있다.


다음 그림처럼 개와 고양이는 모두  포유동물의 공통 속성을 물려받으므로


공통 속성 부분은 따로 코딩할 필요 없이 포유동물의 속성을 그대로 가져다 쓸 수 있다.



















03) 메시지



메시지(Message)란 객체 간에 전달되는 명령 단위이다.


객체는 자발적으로 행위를 수행하지 않으므로 객체가 특정 기능을 수행하게 하려면 메시지가 전달되어야  한다.


자동차를 움직이려면 운전자가 가속 페달을 밟아 직진하라고 신호를 줘야 하는 것과 같은 맥락이다.


메시지가 다듬어져서 프로그램화되면 메소드로 진화한다.


다음 그림의 객체 간 메시지 교환 과정은 수강 신청을 예로 들어 나타낸 것이다.








사각형은 객체를 의미하며 번호와 표시된 화살표는 객체간의 메시지 송수신을 의미한다.





04) 추상화



추상화(abstraction)란 어떤 객체가 상대하는 다른 객체에 대해 꼭 필요한 부분만 드러내고 나머지 세부적인 사항은 감추는 것이다.


추상환느 객체 지향 프로그래밍에서 매우 중요한 개념으로 이를 얼마난 잘 구현하는냐에 따라 시스템의 품질이 결정된다.


아래 림은 추상화의 개념을 고객센터를 예로 들어 나타낸 것이다.








한 고객이 D사의 노트북을 사용하다 고장이 났다고 가정하자.


일단 고객은 D사의 고객센터로 연락해 수리를 맡길 것이다.


하지만 고객이 직접 수리하는 엔지니어를 상대해야 하는 경우라면 어떤 일이 생길까?


고객은 여러번의 통화를 거쳐 엔지니어를 찾을 것이다.


하지만 엔지니어가 다른 부서로 옮겨 갔거나  연락이 닿지 않는 다면 여러 가지 번거로운 상황을 만날 수 있다.


이 예에서 전자가 추상화한 경우이고 후자가 추상화하지 못한 경우이다.


추상화를 해둔 경우라면 고객은 고객서비스센터의 대표 전화번호 하나만 알면 된다.





05) 캡슐화


객체를 정의한다는 말은 객체가 가진 속성, 기능 다른 객체와의 관계를 정의하는 것이다.


캡슐화(Encapsulation)란 속성과 기능을 하나로 묶되, 추상화하여 객체의 세부 내용을 사용자가 보지 못하도록 은폐하는 것이다.


예를 들어 사용자에게 자동차 엔진(객체)을 설명할 때 세부 동작 원리를 설명하지 않고 어떤 기능을 하는지 정도만 알려주는 것이다.



캡슐화는 제3자가 객체 내부 데이터와 기능을 변조하는 것을 막아주므로 프로그램의 재사용성과 유지 보수성을 향상시킨다.


이러한 이유로 개발자는 캡슐화해서 생기는 불편을 충분히 감내할 만 하다고 여긴다.





06) 다형성


상속에서 언급했던 상위 클래스를 일반화된 클래스라고 하고 하위 클래스를 특정화된 클래스라고 한다.


일반화된 클래스는 어떤 특정화된 클래스 객체를 지칭할 수 있기 때문에 같은 동작을 하지만 다른 성질을 가질 수 있다.


이런 성질을 다형성(Polymorphism)이라 한다.






포유 동물은 일반화된 클래스이고 강아지와 고양이는 구체적인 개념을 가진 틍정화된 클래스이다.


강아지 클래스인 바둑이와 고양이 클래스인 나비는 모두 포유동물 클래스에 속한다.


두 경우 포유동물의 공통 속성인 "동물 소리를 낸다"라는 기능을 한다.


하지만 바둑이는 "멍멍"이라고 소리를 내고 나비는 "야옹"이라고 소리를 낸다.


즉 포유동물 객체가 가진 "동물은 소리를 낸다."라는 기능은 하나라도 어느 객체가 지정되느냐에 따라 그 객체가 내는 소리가 다르다.


이것이 바로 다형성이다. 객체 지향 언어에서 다형성을 이용하면 프로그램의 유연성과 재사용성이 높아진다.





※ 객체 지향 언어로 프로그래밍을하면 유지 보수성이 무조건 좋다?



객체 지향 언어를 사용한다고 해서 절차 지향 언어을 사용할 때보다 무조건 유지보수성이 좋아지는 것은 아니다.


오히려 절차 지향 언어보다 더 복잡해지기도 하고 유지 보수성을 훼손시키기도 한다.


즉 무늬만 객체 지향 프로그래밍이 아닌


객체 지향 언어의 특성이 반영된 설계를 바탕으로 제대로 구현된 프로그램이어야 비로소 효율성도 높아지고 유지 보수도 편해진다.


제대로 된 객체 지향 프로그램을 만들려면 객체 지향 언어의 본질적 개념부터 확실히 이해해야 한다.










반응형
//