REPORT객체지향 프로그래밍과 목 명 :학 과 :학 번 :이 름 :제 출 일 :담당교수 :목 차제 1 장 객체지향은 왜 필요한가1.1소프트웨어의 중요성·············································21.2소프트웨어의 위기·············································21.3소프트웨어의 위기극복·············································21.3.1프로그래밍·············································21.3.2데이터 관리·············································31.3.3소프트웨어 공학·············································41.3.4개발 방법론·············································51.4객체지향 프로그래밍의 필요성·············································6제 2 장 객체지향 프로그래밍2.1객체지향의 기본적인 개념·············································72.1.1자연의 지혜·············································72.1.2인간의 본능적 사고 방식·············································72.1.3인터페이스·············································82.2객체지향 기술의 원리·············································92.2.1추상화·············································92.2.2프로세스 추상화·············································102.2.3데이터 추상화·················양조약기구) 국제회의에서 ‘소프트웨어 위기’로서 선언된 내용은 다음과 같습니다.‘소프트웨어 위기’(Software Crisis)는 증대하는 소프트웨어 개발 수요에 비해서 공급 능력이 따라가지 못하는 상황을 가리키는 말로, 1968년에 독일에서 NATO주최의 국제회의에서 선언되었습니다. 더불어 이때에 ‘소프트웨어 공학’이라는 말도 만들어져 품질 높은 소프트웨어를 효율적으로 개발하기 위한 각종 수법과 프로그래밍 기술의 연구가 학문으로서 성립되었습니다. 그리고 객체 지향 기술은 현재 이 분야의 중심적인 테마가 되었습니다.몇 년 전에 발표된 미국 소프트웨어 현황에 대한 한 통계치에 의하면, 100억 줄의 코드를 유지하기 위해 매년 700억 달러의 비용이 쓰이고 있으며, 52.7%에 해당하는 프로젝트가 예산을 초과하여 진행되며, 이 초과분을 금액으로 환산하면 약 590억 달러에 달하는 것으로 추정되고 있다고 합니다.) 즉, 소프트웨어의 개발도 중요하지만 이미 생산된 소프트웨어를 유지/보수하는 과정이 더더욱 중요합니다. 최초 개발단계에서부터 효율적으로 개발해야 하겠지만, 요구사항이 변할 때 마다 소프트웨어를 다시 생산할 수도 없는 노릇이기 때문입니다. 최소의 비용으로 최대의 효과를 거둘 수 있는 프로그래밍을 하기 위해 수많은 개발자 들은 노력을 기울여 왔습니다.1.3. 소프트웨어의 위기 극복1.3.1. 프로그래밍컴퓨터로 하여금 특정한 일을 시키기 위해서는 이를 지시하는 명령어가 필요합니다. 이러한 한정된 수의 명령어들을 잘 정의된 문법과 구문, 그리고 의미들에 대한 형식화된 규칙 등으로 묶어 놓은 것이 프로그래밍 언어입니다.초기의 프로그래밍은 판매의 목적 보다는 대부분 자체 내의 필요에 의해서 아주 소규모로 이루어지는 것이 대부분이었습니다. 개발은 주로 한 두 사람의 손으로 이루어졌으며, 따라서 프로그램의 설계는 한 사람의 머리 속에서 이루어지는 함축적인 과정이었고 문서로는 거의 남겨지지 않았습니다. 이 시기에는 하드웨어 비용이 매우 높았으므로, 프로그램의 크기를 작게하기에서 소프트웨어에 대한 전혀 새로운 시각, 현대 컴퓨터의 창시자인 폰 노이만 이후로 컴퓨터 하드웨어와 소프트웨어의 전반에 걸쳐 불변의 사실로 인식되어 왔던 개념에 대한 타파가 필요해지게 됩니다. 즉, 소프트웨어를 데이터와 프로세스로 구분하지 않고, 실세계에 이미 존재하고 있는 사물이나 개념, 즉 객체를 그대로 소프트웨어로 구현하는 객체지향 기술이 등장하게 되는 것입니다.소프트웨어가 안고 있는 또 다른 문제점으로 낙후된 생산성 및 유지보수의 난해성이 있습니다. 이 역시 상당 부분 데이터와 프로세스로 구성되는 소프트웨어의 이중적 구조에 기인합니다. 이러한 이중적 구조는 간단하고 적은 규모의 소프트웨어 시스템에서는 크게 문제시되지 않습니다만, 시스템의 규모가 커지면 그에 따른 복잡성은 기하급수적으로 커지게 됩니다. 즉, 프로세스와 데이터가 각기 세분화되고 확장되어 그 수량이 증가하게 되면 상호간에 연관 고리가 기하급수적으로 증가하게 되는 것입니다.객체 기술에서는 상세서로부터 실세계에 존재하는 그대로의 객체를 찾아내어 모델화 작업을 합니다. 간단한 예를 들자면, TV와 리모콘을 모델화 한다면 다음 그림과 같습니다.실존세계객 체TV리모콘TV프로세스데이터리모콘프로세스데이터이러한 분석의 결과는 그대로 설계와 구현으로 이어집니다. 각 객체는 내부적으로 자신의 행위에 해당하는 모든 프로세스와 자신이 관할하는 모든 데이터를 가지고 있게 되며, 이는 객체 외부로 나타나지 않습니다. 다른 객체와의 의사 교류는 메시지를 상호 주고 받음으로서 이루어집니다. 즉, 객체의 외부에서는 각 객체가 어떤 데이터를 가지고 있는지, 어떤 프로세스로 어떻게 이를 가공하는지에 대해 알 필요도 없고 또 전혀 알 수도 없는 것입니다. 필요한 사항이 있으면 단지 이를 요청하는 메시지를 전달할 뿐입니다.굳이 TV의 내부를 뜯어보지 않아도 리모컨을 통해 TV를 사용할 수 있습니다. 또한 자동차가 어떻게 작동하는 지 알지 못해도 운전하는 방법만 알고 있다면 자동차를 운전할 수 있습니다.따라서 객체지향적인 설계되는 것입니다. 즉, 딸랑이 객체는 ‘흔들다’라는 행위를 포함하고 있는 것입니다. 조금 더 어린아이가 자라면 금새 궁금해집니다. ‘딸랑이 안에 뭐가 있길래 흔들면 소리가 나는 거지?’ 마침내 딸랑이를 벽에 힘껏 던져 깨뜨려 버립니다. ‘아하! 이 안에 방울이 숨어 있구나!’ 결국 어린아이는 딸랑이 객체에 ‘방울’이라는 특성이 포함되어 있음을 알게 됩니다. 그런데 방울은 딸랑이 안에 감추어져 있습니다.이처럼 인간의 본능적 사고방식, 사물을 이해하고 사용하는 방식처럼 인간이 사고하는 방식을 그대로 컴퓨터 소프트웨어 기술에 도입하려는 시도이며, 따라서 객체라는 단어가 의미하는 바는 사실 우리에게 너무도 친숙한 내지는 친숙해 있어야만 하는 개념입니다.2.1.3. 인터페이스앞 절에서 설명한 어린아이가 사물을 인식하고 세상을 배워나가는 기본 원리에서 볼 수 있듯이, 하나의 객체는 다른 객체를 인식할 때, 그 객체의 외적 속성과 그 객체와의 교류를 위한 메시지의 전달 방식만으로 인식한다는 것입니다. 다시 말해서 각 객체는 객체가 가지고 있는 인터페이스(interface)만이 객체 외부로 공개되며, 전달받은 메시지에 대응하는 행위를 수행하는 방식이나 내부의 데이터는 철저히 숨겨져 있다는 것입니다. 이러한 기본 원리를 소프트웨어 기술에 적용시키고자 하는 것이 객체지향 기술입니다.객체지향 소프트웨어 시스템은 문자 그대로 모든 것이 객체를 중심으로 이루어져 있습니다. 여기서 객체는 흔히 메시지를 주고 받는 블랙박스(black-box)에 비유됩니다.인터페이스↘ ↖블랙박스(black-box)이 블랙박스 안에는 전달받은 메시지에 대응하는 행위를 수행하기 위한 코드(일련의 컴퓨터 명령어)와 객체 내부에서 사용하는 정보인 데이터(컴퓨터 명령어가 취급하는 정보)가 들어 있습니다. 코드와 데이터는 객체라는 단위 안에 철저히 결합되어 숨어 있습니다. 객체는 코드와 데이터를 감싸고 있는 블랙박스인 것입니다. 객체의 사용자는 이 블랙박스 안을 들여다볼 필요도 없고, 또 들여다보아서도 안 된다는 것데이터 타입의 사용자들에게 숨겨버리는 것입니다. 즉, 프로그래머들은 평소에 흔히 사용하는 십진법의 수를 정수 타입으로 정의된 변수의 값으로 부여하기만 하면 되도록 하는 것입니다.연산자도 이와 마찬가지입니다. 두 수의 곱을 하는 연산을 뜻하는 ‘*’연산자를 통해 컴퓨터 내부에서는 상당히 많은 일들이 벌어집니다. 하지만 프로그래머 입장에서는 단순하게 구구단만을 연상하는 것으로 문제를 해결할 수 있는 것입니다.결론적으로 새로운 변수의 타입을 단지 정의하는 것만으로 이 변수에 대한 내부 자료 구조에 더 이상 신경을 쓸 필요가 없으며, 또한 ‘+’, ‘-’, ‘*’, ‘/’ 연산자 따위도 이미 정의된 바를 그대로 사용하면 됩니다.2.2.4. 추상화 데이터 타입의 예 : 스택프로그램을 하면서 흔히 사용하는 스택(stack)이라는 데이터 구조에 대해서 생각해 보겠습니다. 스택은 널리 알려진 데이터 구조로서 이 스택 내에서 제공되는 기능으로는 스택에 새로운 구성 요소를 집어 넣고(push), 최상단에 있는 구성 요소를 빼내며(pop), 최상단에 있는 구성 요소를 조회하고(top), 스택이 비어 있는가를(empty) 테스트 할 수 있는 데이터 구조를 말합니다.실제로 스택의 구현은 다른 여러 가지 물리적 구조로 이루어질 수 있습니다. 아래에서 위로 채워나가는 방식의 반대로 위에서 아래로 채워 나간다든지, 또는 링크드리스트(linked list)를 이용하여 구현하는 등의 여러 다른 구현 방법이 존재합니다.물리적 구조가 변화하더라도 여전히 스택임에 틀림 없습니다. 여기서 추상화란 앞에서도 정의한 바와 같이 “꼭 필요한 근본적인 특성에 집중하여 여타의 부분이나 상세 내역들을 없애 나가는 과정”을 의미합니다.요약하면, 추상 데이터 타입은 외부의 눈에 의해서 기술되는 데이터 구조의 종류입니다. 즉, 물리적인 구현 방식이 아닌 제공되는 서비스와 이들 서비스들의 특성입니다.2.2.5. 추상화의 결과스택이라는 데이터 타입은 배열 또는 리스트 등의 자료 구조로 구현할 수 있습니다만, 사용자 입ion