한국리눅스유저그룹 - LUG KOREA 토크박스/가입인사 | SW/HW 사용기 | LUG 위키 | wiki 영어공부 | 사이트맵 | 즐겨찾기 | Home
[메일링리스트] - Slashdot | Kernel News | GNOME | KDE | linux.kernel | C++ | wxWidgets | Java | Python | Android
구인/서버,개발자 | 장터 | 리눅스 QA | JSP & JAVA 입문 | 쉘 스크립트 입문 [오타]| gcc/C++ 입문 | CentOS 리눅스구축관리실무 [오타], [찾아보기]
공지 사항 : 유익한 문서/글 자료실 : 보안 : 임베디드 : 안드로이드 : 회원 랭킹 : 한국LUG 소개
2024년 4월 25일 목요일
현재접속자 : 113 (0)
보안 LOGIN :  자동 [ID/PASS 찾기]
총 회원: 20,028명
Today Join: 0명
지역 모임 게시판 : [대구지역] , [서울지역]

[보안로그인 인증서설치]
[회원 이메일 재인증하기]

MY IP : 13.58.247.31





[사이트내 검색]
  ◆ Translation
[ Foreigner Join ]

[ Korean to English ]

[ Korean to Japanese ]

  ◆ 유용한 문서 읽기
  • 리눅스 관련문서
  • 리눅스 맨페이지 검색
  • 리눅스 커널 소스
  • C/C++ Reference
  • C Programing
  • C Socket Programing
  • UNIX IPC
  • Automake/Autotools
  • Python Document
  • wxWidgets Document
  • PHP Document
  • JDK5 API Document
  • JDK6 API Document
  • J2EE API Document
  • JSTL 1.1 Reference
  • MySQL Reference
  • Iptables Tutorial
  • Bash Scripting Guide
  • Android Reference
  • Web Programming
  • JQuery Tutorials
  • node.js guide
  • node.js docs
  •   ◆ LUG 세미나 자료
      ◆ 개발자 게시판 링크
      ◆ 전체 최근게시물
    [ 100일 베스트 100 게시물 ]
    [ 전체 베스트 100 게시물 ]
    * [코][CentOS 리눅스 …
    * [코][CentOS 리눅스 …
    * 가입인사요
    * bacula 백업 서비…
    * 안녕하세요
    * [코]가입인사 드립…
    * [코]debian 원격 CPU …
    * [코]debian 원격 CPU …
    * [코]debian 원격 CPU …
    * [코]debian 원격 CPU …
    * [코]debian 원격 CPU …
    * [코]debian 원격 CPU …
    * debian 원격 CPU …
    * 가입인사 드립…
    * [초대] 아시아 …
      ◆ LUG 회원 동지분들

  • 총회원 : 20,028명

  • 최근 7일간 가입자 : 0명

  • 박원진[경기][10-08]
    권수혁[서울][10-06]
    임호진[서울][10-02]
    손주민[KR][10-01]
    Elliot[KR][09-30]
    김태욱[충남][09-28]
    최선길[서울][09-26]
    조규선[서울][09-26]
    임형규[경북][09-25]
    윤태준[서울][09-24]
      ◆ Recommend Book
    리눅스 입문, 서버운영, 개발입문을 하실분들은 아래 도서를 탐독하시기 바랍니다.

    [ 저자 : 김태용 ]
    1. CentOS 리눅스구축관리실무[출간]
  • [관련자료 링크]
  • [찾아보기(색인)]

    2. 김태용의 gcc와 C++ 기초 입문::gcc로 공부하는 C++ programming과 wxWidgets GUI 개발[출간]
    3. 김태용의 쉘 스크립트 프로그래밍 입문[출간]
    4. 김태용의 JSP 웹 프로그래밍 입문[출간. 2011.01]

  •   ◆ Sponsor
    DNS Powered by DNSEver.com
      ◆ OS, Office 다운로드
    [Download - x86, 32bit]
    CentOS 5.0 커널 업데이트
    * Android Platform
    Linux + Dalvik vm
    * CentOS 5.6
    DVD 넷인스톨시디
    * Fedora 8
    DVD, 라이브시디
    * Fedora 12
    DVD, 라이브시디
    * Fedora 이전버전
    * Ubuntu 9.10 CD
    CD, Kubuntu 9.10
    * VirtualBox
    All Platform
    * 오픈오피스 3.X
    다운로드 사이트
    * Code::Blocks(GCC)
    Code::Blocks 다운로드
    * CodeLite(GCC)
    CodeLite 다운로드
    * 이클립스
    이클립스 다운로드
    * Windows Text Editor
    PsPad
    notepad++
    Komodo Editor, AcroEditor
    * 윈도우용 한글 Putty
    한글 Putty 0.60.h

    [ 한국LUG 소개 ]
    [ Administrator Contact ]
    리눅스용 네이트온 다운로드
      ◆ LUG 접속자 수(IP 수)

    최근 방문자 IP수

    885
    308
    243
    389
    806
    1016
    20 21 22 23 24 25
    최대 : 15,320
    전체 : 4,230,448




    Will be Prosumer's Revolution and Technical Revolution in the Future!
    Linux User/Developer is also Windows User/Developer... Cross Platform Engineer...

    "21C 공학인을 대통령, 국회의원으로 만들자!"
    "더욱 더 많은 동지분들이 공학제국 건설에 동참할 수 있도록 널리 알려주세요~" [ F = m * a ]
    과학기술/공학인이 대한민국 국회 의석의 50% 이상을 확보하는 그날을 위하여~ ^___^

  • 한국리눅스유저그룹은 공학인들의 커뮤니티입니다.(http://www.lug.or.kr)
  • 로그인하면 100포인트씩 추가됩니다(1일 1회).
  • 질문을 하기전에 먼저 문서를 검색해서 읽어봅시다! (RTFM : Read The Fine Manual)
  • LUG 동지 여러분께서는 자신이 알고 있는 작은 지식이라도 주저하지 말고 지금 당장 포스팅하시기 바랍니다.
  • 개인게시판 Home ▶ [우성창] 개인 게시판
    [본문 프린트하기]
      문득 생각이나서 다시한번 찾아본 단어...
      글쓴이 : 우성창     날짜 : 08-05-01 19:48     조회 : 5372    
      태그 : 태그 없음

    문득 생각이나서 다시한번 찾아본 단어... 그이름 객체지향.


    나는 과연 이 객체지향이라는것을 이론으로 알고 있는 것이 아닌


    실제로 느끼며 정확히 파악을 하며 사용하는지 의심이 들어 인터넷을 뒤적이며


    이론적이지만 다시한번 읽어보게 되었습니다.


    여러분은 이 '객체지향' 을 바르게 파악하고

    프로그래밍에 바르게 응용하시는지 궁금하네요

    아래는 인터넷에서 뒤적거렸던 자료입니다.^^

    ===========================================

    1. 객체 지향적 시각

     

     객체지향 프로그래밍의 가장 근본이 되는 개념은 주어진 문제나 사물을 이해하고 관찰하는 시각에 있다.

    , 문제 영역 안에 존재하는 여러 개의 사물이나 객체들을 파악하고 이들이 서로 정보를 주고 받는다고 보는 시각이다. 이는 프로그래밍을 떠나, 사람들이 일상생활에서 어떤 문제에 대해 생각하고 이해하며 관찰하는 일반적인 방법과 동일하다.

     대학교의 인사관리 소프트웨어의 예를 들어 보자. 우선 보통 사람들의 일차적인 고찰은 인사관리의 대상이 되는 사람들, 즉 교수, 교직원 및 학생들이 될 것이다. 이런 고찰 과정은 바로 객체지향식 개발 방법의 첫 단계이다.

     , 인사관리 문제 영역 안 에 있는 대상이나 객체들이 무엇인가를 고찰하고 그들의 역할과 상호관계를 규명하는 일인데, 이는 사람들의 일반적인 사고방식이며 객체지향 프로그램 개발에 가장 근본이 되는 정보들이 된다. 이러한 방법을 실세계 중심의 개발 방법이라고 한다.

     

    소프트웨어에 관한 기존의 시각과 객체지향적 시각을 비교해 보자. 기존의 소프트웨어에 관한 시각은 하나의 프로그램은 여러 개의 데이터와 이 데이터 위에 수행되는 여러 함수들의 집합이다.

     

    데이터 + 함수들 = 프로그램

     

     이러한 방식의 가장 큰 문제점은 상호 연관된 데이터와 함수들이 별도의 독립된 정보인 것처럼 취급 되는 것이다.

     , 데이터 부분은 흔히 전역변수 정의 부분에 포함되어 있고, 이 데이터들과 연관된 함수들은 다른 함수들과 함께 정의되어 있어 이들 사이의 연관 관계를 잘 표현하지 못하고 있다. 연관된 데이터와 함수를 설계나 프로그램상에서 정형적으로 한 군데 묶어서 표현 관리하는 개념적 단위를 추상 데이터 타입 (Abstract Data Type)이라고 하는데, 이렇게 함으로서 프로그램의 이해가 쉽고 유지 보수 등이 용이해 지며, 효율적인 재사용을 가능하게 한다. 기존의 소프트웨어 개발 방법은 이러한 추상 데이터 타입을 프로그램상에서 효과적으로 표현 활용하지 못하고 있다.

     

     소프트웨어에 관한 객체지향식 시각은 하나의 객체지향 프로그램을 여러 개의 객체들로 구성되며, 각 객체는 위에서 필요로 하는 소수의 데이터와 이 데이터상 에 수행되는 소수의 함수들로 구성된다.

     

    객체 + 객체 = 프로그램데이터 + 함수 = 객체

     

    이렇게 구성된 각 객체는 필요로 하는 모든 데이터와 이 데이터상에 서 수행될 모든 함수들을 포함하고 있음으로 추상 데이터 타입을 프로그램으로 구현한 것이 된다.

     

     

     

     

     

    2. 객체 (Object)

      객체지향 프로그래밍에서 가장 기본이 되는 단위는 객체이다. 객체는 문제 영역의 실세계에 존재하는 어떤 사물이나 개념을 나타낸다.

    그림 1의 그래픽 라이브러리의 경우 점, , 사각형, , 윈도우 등이 모두 객체이며, 문서편집기 프로그램의 경우 글자, 단어, 문장, 문단, 문서, 글씨체 등이 모두 객체이다.

      이처럼 객체를 찾는 과정은 데이터 타입이나 구조를 결정하는 등의 세부적인 작업이 아니라, 문제 영역에서 실제로 존재하는 정보를 자연스럽게 찾아내는 과정이다.
    그림 1. 화면상의 그래픽 객체 들

     

      객체지향식 개발 과정에서 제일 먼저 해야 하는 일은 문제 영역 안의 객체를 찾는 일이다. 그림 1의 그래픽 화면 예에서 점, , 윈도우 등 눈으로 관찰할 수 있거나 실제로 존재하는 물리적 객체도 있지만, 어떤 객체는 개념적 객체이다.

      예를 들면, 재고 관리 프로그램에서 주문, 휴가 관리 프로그램에서 휴가 등은 물리적이지는 않지만 문제영역에 존재하는 중요한 정보이다.

    1) 객체의 정의

    Class Point {
        int xPosition;
        int yPosition;
        boolean status;
        colorType color;public:
        ...
        void move (int x, int y);
        void setColor (colorType c);
        void penUp( );
        void penDown( );

    }

      프로그램상에서 각 객체는 필요로 하는 데이터와 그 데이터 위에 수행되는 함수들을 가진 작은 소프트웨어 모듈이다.

    그러므로 각 객체는 데이터와 함수의 두 가지로 구성되는데 데이터는 그 객체의 상태(State)를 저장하는데 사용이 되며, 함수는 그 객체가 수행할 수 있는 기능을 정의한다. 예를 들어 화면에서 하나의 점을 나타내는 객체에서는 그 점의 현재 수평 및 수직 위치가 바로 그 객체의 상태이다.

      따라서, 각 객체 는 상태를 저장하기 위해 최소한 한 개 이상의 변수를 가지고 있어야 한다. 이 점이란 객체의 경우, 필요한 함수는 그 점의 위치를 옮기는 함수, 점의 색깔을 바꾸는 함수 등이 된다.

      다음은 Point라는 객체를 정의하는 C++ 코드이다. 여기서 Class Point Point라는 객체를 정의하는데, xPosition, yPosition, status, color의 네 개 변수를 가지며, public: 밑에 move, setColor, penUp, penDown의 네 개 함수를 가지고 있다.

    이렇게 생성된 객체는 필요로 하는 모든 데이터와 함수를 물리적으로 언어상에서 한 장소에 정의하므로 프로그램 개발 시나 수정 시 매우 편리하다. 또한, 객체는 필요한 정보와 기능을 모두 포함하므로 재사용의 기본적인 단위가 된다.

    2) 캡슐화 (Encapsulation)

    그림 2. 연관된 정보와 기능의 캡슐화

     

       필요한 데이터와 함수를 하나의 단위로 묶여져 정의된 것을 캡슐화 되었다고 하는데, 캡슐화는 정보 은폐와 함께 객체의 중요한 두 가지 특성이다.

    캡슐화에 대해서 좀 더 살펴보자. 대부분의 데이터 혹은 정보는 어떤 종류의 기능들과 연관이 있기 마련이다. 예로서, Point라는 객체의 위치를 나타내는 xPosition, yPosition 정보는 move( )라는 함수와 연관이 있다. 이렇게 연관된 정보와 기능을 그림2 처럼 한 군데 모아서 정 의하는 일이 매우 상식적인 것인데, 이를 캡슐화라 부른다.

     3) 정보 은폐 

    그림 3. 정보 은폐가 된 객체의 모습

     

      캡슐화는 연관된 것들에 캡슐을 쉬우는 일인데, 캡슐화 그 자체가 캡슐 안에 있는 정보나 함수의 내역이 캡슐 외부에 노출되지 않는 것을 보장하지는 않는다. 이는 마치 콘텍 600이라는 감기 약이 캡슐 안에 들어 있지만 캡슐이 투명하여 그 안의 약이 들여 다 보이는 것과 흡사하다. 그림 3처럼 객체는 가지고 있는 정보와 함수들의 상세한 내역을 외부에 노출시키지 않는데 이것을 정보 은폐(Information Hiding)의 원칙이라 하며, 캡슐화와 함께 객체의 두 가지 중요한 특성을 이룬다.
     
    객체지향 프로그램에는 객체만이 존재하며 객체간에 메시지 교환을 통하여 정보 교류를 하게 되는데, 메시지 교환을 위한 일정한 규격이 필요하게 된다. , 각 객체는 다른 객체가 어떤 메시지를 보낼 수 있는가를 정의해야 하는데, 이를 외부 인터페이스(Public Interface) 혹은 메시지 프로토콜이라 한다. 그림 4 처럼 외부 인터페이스는 주변 객체들에게 나는 이러한 정보를 제공할 수 있다와 나는 이러한 기능을 수행할 수 있다 는 선언이다. 그러나, 외부에 제공할 기능들이 어떤 알고리듬으로 구현된 것인지, 어떻게 수행되는지의 어떻게(How) 부분은 노출시키지 않는다. 다만, 외부 인터페이스에 포함된 기능의 함수이름, 함수 매개 변수, 함수의 결과 등만 외부에 공개된다.

     그림 4. 객체의 외부 인터페이스 모습

     

      예를 들어, 하나의 Point 객체가 xPosition, yPosition, status, color 변수의 값으로 각각 10, 20, true, blue를 가지고 있다면 객체의 보습은 그림 5 과 같다. , 세 개의 변수들의 값은 외부로부터 은닉되어 있고 네 개의 함수들이 외부 인터페이스를 이루고 있다. 따라서, 객체의 외부에서는 이 외부 인터페이스에 정의되어 있는 함수들만을 통하여 이 객체와 정보 교환을 할 수 있다.

    그림 5. Point 객체의 외부 인터페이스

     

      한 객체의 외부 인터페이스에는 객체가 가지고 있는 데이터와 함수들의 일부나 전부가 포함될 수 있다. 실제 프로그램 개발의 경우, 데이터 부분은 거의 감추고 함수들 전부나 일부만 포함시키는 경우가 많은데, 이것은 데이터 부분의 변수들이 외부 객체나 프로그램에 의해서 검색되거나 임의로 값이 수정되는 것을 피하기 위해서 이다.

      그러면, 객체가 가지는 캡슐화와 정보 은폐가 왜 중요한 것일까 ? 객체 내의 정보와 기능이 캡슐화되고 그 안의 정보가 은폐됨으로 외부의 객체는 그 객체의 외부 인터페이스에만 의존하여 메시지를 보내고 작업이 수행된다. 따라서, 객체 내의 감추어진 데이터를 삭제하거나 그 데이터 타입을 변경하거나 새로운 데이터를 추가하여도 외부의 객체들 나아가서는 전체 프로그램에 아무런 영향을 주지 않는다. 객체 내의 함수 부분도 마찬가지인데, 함수의 알고리즘을 더 효율적인 것으로 바꾸거나 함수의 기능 자체를 변경해도 함수의 프로토콜만 변경하지 않으면 주변 프로그램을 수정할 필요가 없다. 따라서, 객체는 캡슐화와 정보 은폐를 통하여 비로소 완전 독립된 소프트웨어 IC가 된다. 이러한 객체의 특성으로 인해 객체지향 프로그램은 개발 시 고도의 모듈화가 가능해지며, 프로그램 시험과 기능 보완 등 유지 보수가 용이해지며, 독립성으로 인하여 재사용하기가 쉬워 진 다.

    4) 메시지 전달

      한 객체가 다른 객체의 함수를 부르는 과정을 메시지 전달(Message Passing)이라고 부르는 데, 메시지의 일반적 형태는 다음과 같다.

    <수신 객체> <함수이름> < 매개변수>
    <
    수신 객체>는 이 메시지를 받을 객체를 나타내며, 화살표 는 메시지가 전달된다는 부호인데, 언어에 따라서 사용되는 부호가 다르다.

    <함수 이름 >은 수신 객체의 외부 인터페이스에 포함되어 있는 함수들 중의 하나로 수신 객체가 이 메시지를 받은 후 이 함수를 수행하게 되며, <매개 변수>는 그 함수가 필요로 하는 매 개 변수들을 나타낸다. 예를 들어, 한 점을 나타내는 객체의 이름을 myPoint라 하면, 외부 인터페이스에 의해 다음과 같은 메시지를 보낼 수 있다.
    myPoint . move (10, 20);
    myPoint . setColor (Blue);
    myPoint . penUp ( );
    처음 메시지는 move라는 함수의 수행을 myPoint에 요청하며 매개 변수 (10, 20)을 이 메시지에 포함하고 있다. 두 번째 메시지는 myPoint라는 객체에게 setColor를 통하여 점의 색깔을 Blue로 바꾸는 메시지이다. 이렇게 객체지향 프로그램에서 는 객체와 객체가 메시지를 교환하여 작업을 수행하는데 그림 6은 두개의 객체간의 메시지 전달을 개념적으로 나타낸 것이다.

    그림 6. 객체간의 메시지 전달

     

    5) 복합 객체 (Composite Object)

      일상생활에서나 시스템 문제 영역에서 어떤 객체가 다른 객체들을 그 객체 안에 포함하여 구성되어 있는 경우가 있다. 예를 들면, 자동차는 하나의 엔진과 네 개의 바퀴 및 다른 부속물들로 이루어져 있고, 다각형은 여러 개의 Point 객체들로 구성되어 있다. 이처럼, 한 객체가 다른 여러 개의 객체들을 그 객체 내의 변수로 가지고 있는 경우를 복합 객체(Composite Object) 라 한다.

    Class Line { Point p1, p2; // 두개의 내부 객체public: void move (int x, int y); ...}

    예를 들어, 두개의 Point 객체들을 이용하여 Line 객체를 만들 수 있다. 이 때 Line 객체가 두개의 Point 객체들 p1, p2를 가지고 있으나, p1, p2가 가지고 있는 은폐된 정보를 직접 접근할 수는 없으며 Point 객체의 외부 인터페이스를 통하여만 p1, p2를 사용할 수 있다. , 복합객체도 포함된 객체들의 정보 은닉은 보장해 주어야 한다.

    실제로 객체지향 시스템을 개발하다 보면 상당히 많은 복합객체들을 발견하게 된다. 복합 객체는 작은 단위의 객체들을 이용하여 더 큰 객체를 만들어 가게 하는 효과적인 모듈화 개발 방법을 지원한다

    3. 클래스(Class)

    1) 개념

      모든 사물에 어떤 종류가 있듯이 객체에도 종류가 있다.

    예를 들면, 각기 다른 크기의 열 개의 원들이 있다면 이들 모두가 원의 종류이며 문구 가게에 수십 개 가 있다면 이들 모두가 연필이라는 종류에 속한다. 어떤 회사에 수백 명의 직원들이 근무한다면 일부는 남자 직원, 나머지는 여자 직원일 것이며 어떤 이들은 안경을 쓴 사람도 있고 이들의 나이도 다양할 것이다. 그러나, 이들 모두가 직원이라는 부류에 속하며 직원으로서의 공통점을 가지고 있다.

    이러한 객체의 종류를 소프트웨어적으로 표현 구현한 것을 클래스라 부른다. , 클래스는 유사한 여러 객체들에게 공통적으로 필요로 하는 데이터와 이 데이터 위에서 수행되는 함수들을 정의하는 소프트웨어 단위이다.

    다음의 프로그램은 위에서 예를 든 직원이란 클래스를 C++로 작성한 것이다. 이 클래스에 속하는 각 객체는 name, title, dept, salary등의 변수를 가지며 promote, changeSalary등의 함수를 수행할 수 있다.

    class Employee {
        char* name;
        titleType title;
        // titleType defined elsewhere
        deptType dept;
        // deptType defined elsewhere int salary;
        ...public:
        void promote (titleType newTitle);
        // updates title
        void changeSalary (int newSalary);
        // updates salary ...

    };

    2) 인스턴스 (Instance)


    그림 7. 'Employee' 클래스와 생성된 인스턴스들

      클래스가 유사한 여러 객체들을 집약적으로 묘사하고 있는데, 이 클래스에서 각 객체를 생성해 내는 과정을 객체 생성이라고 부르며 생성된 각 객체를 인스턴스(Instance)라 부른다. 실제로 객체지향 프로그램에서 모든 객체는 어떤 클래스로부터 생성된 인스턴스들이다

      , 객체나 인스턴스는 같은 것인데 인스턴스라는 용어는 어떤 클래스로부터 생성됐다는 의미를 강조한 것으로, 클래스와 대조적인 개념이다. 위에서 예를 든 직원 클래스의 경우 클래스와 인스턴스의 관계를 나타내면 그림 7 과 같다. Employee 클래스에서 생성된 인스턴스의 이름은 Bob, Susan인데, 이렇게 클래스를 한번 정의해 놓고 간단히 인스턴스를 만들 수 있어 매우 편리하다.

    그림 8. 인스턴스내의 고유의 변수들

     

      어떤 클래스에서 하나의 인스턴스가 생성될 때, 인스턴스가 속해 있는 클래스에 정의되어 있는 모든 변수들의 장소가 만들어진다.

    오류! 참조 원본을 찾을 수 없습니다. Employee 클래스에서 Bob Susan이란 객체, 즉 인스턴스가 만 들어 질 때, 이 클래스에 정의된 name, title, dept, salary의 네 개의 변수가 각 인스턴스에 생성된다. Bob이라는 인스턴스는 그 고유의 name이라는 변수를 가지며, Susan도 그 고유의 name이라는 변수를 가진다. 이 때, name이라는 이름은 같아도 실제 메모리에서는 인스턴스 별로 별도의 변수가 생성된다. 그림 8 은 인스턴스들이 각자 고유의 데이터 저장 장소를 갖는 모습이다. 따라서, 클래스는 각 인스턴스들이 가져야 할 데이터의 종류, 즉 변수들의 종류와 타입들을 정의하고 있다.

    4. 속성상속Properties

    1) 개념

      문제 영역에서 존재하는 어떤 클래스들은 다시 여러 가지의 세부 종류로 분류할 수 있다. 예를 들면, 대학교 학생은 학부 학생과 대학원생으로 분류할 수 있고, 그래픽 객체는 선, , 사각형등 여러 세부 종류로 나눌 수 있다. 이때, 넓고 일반적인 범위의 클래스를 부모 클래스(Parent Class) 혹은 슈퍼 클래스(Superclass)라고 하며, 세부 분류된 클래스를 자식 클래스(Child Class) 혹은 서브 클래스(Subclass)라고 한다. 이러한 클래스의 세부 분류 방식은 사람들이 일상 생활에서 흔히 적용하는 종류 나누기이다.

    그림 9. 서적들의 분류 체계

     

      그림 9의 예제처럼, 어느 전산학과 학생의 서가에 많은 책들을 정리 할 때 교양서적, 전공서적, 정기간행물 등으로 대분류를 하고, 전공서적을 더 세부적으로 수 학, 전산학, 통계학등으로 나눌 수 있다. 또한, 전산학 서적을 운영체계, 컴퓨터구조, 언어, 소프트웨어공학, 데이터베이스로 분류 정돈할 수 있다.

    이처럼, 하나의 클래스를 여러 서브 클래스들로 세분하거나, 유사한 클래스들을 군으로 묶어서 하나의 슈퍼 클래스로 정의하는 과정을 소프트웨어적으로 구현한 장치를 속성 상속(Inheritance)이라 부르며, 속성 상속 의 관계를 나타내는 츄리(Tree) 형태의 도식을 상속 구조 (Inheritance Hierarchy) 라고 한다.

     

    그림 10. 날 수 있는 물체들의 상속구조

     

      그림 10 은 날 수 있는 물체들을 하나의 상속구조에 표현하고 있는 데, 특성에 따라 Flying Object Bird, Helicopter, Airplane의 서브 클래스로 분류되며 Airplane은 다시 DC-10, B-747등의 기종별로 분류할 수 있다.

      분류의 기준은 문제영역의 특성과 개발하려는 시스템의 기능에 따라 정해진다. 만일, Airplane을 기종이 아닌 용도로 분류하여 기능을 구현해야 한다면 그림 11에서처럼 Airplane Passenger(승객용), Cargo (화물용), Military(군사용)의 서브 클래스들로 나눌 수 있다.

      이처럼, 객체지향 프로그래밍 의 속성 상속은 사물을 특성에 따라 분류하여 정리하는 사람들의 사고 습관을 그대로 지원해 준다. 이처럼, 객체와 클래스 및 상속 구조는 문제영역의 정보를 사람들의 사고 방식과 매우 유사한 방법으로 찾고 표현하게 해 주는데 이를 자연적 모델링(Natural Modeling)이라 부르며 객체지향 프로그래밍의 큰 장점으로 알려져 있다.

    그림 11. 용도로 분류된 'Airplane'의 상속구조

     

     

      소프트웨어에서 속성 상속은 새로운 클래스를 정의할 때, 처음부터 모든 것을 다 정의하지 않고 기존의 클래스들의 속성을 상속 받고 추가로 필요한 속성만 추가하는 방법이다. 여기서 속성이란 그 클래스가 가지고 있는 데이터와 기능을 의미한다.

      이렇게 생성된 서브 클래스는 슈퍼 클래스에 정의된 모든 변수들을 가지며, 슈퍼 클래스의 함수들을 상속받아 수행한다. 이때, 대개의 경우 서브 클래스는 슈퍼 클래스의 변수들 외에 몇 개의 변수를 추가로 가지며, 함수 또한 슈퍼 클래스의 함수 이외에 몇 개의 함수를 추가로 가진다.

    그림 12. 서브 클래스에서 생성된 객체가 갖는 변수들

     

    그림 13. 재정의된 'getPerimeter' 함수들

     

      예를 들어 Airplane 클래스가 그림 12에서처럼 두개의 변수를 가지고, 그 서브 클래스인 Passenger(승객용 비행기) 클래스가 승객용 의자 수를 나타내는 numSeats라는 변수를 가질 수 있다. 이때, Passenger 클래스에서 생성된 각 객체는 Airplane에서 상속 받은 두개의 변수에다 자신이 속한 Passenger 클래스에 정의되어 있는 하나의 변수, 즉 세 개의 변수를 저장할 장소가 생기게 된다. 변수 뿐 아니라, 함수들도 같은 맥락으로 상속된다.

     

    2) 함수의 재정의(Redefinition)

      슈퍼 클래스에 정의된 함수를 서브 클래스에서 다시 정의할 수도 있는데 이것을 함수가 재정의(Redefined) 되었다고 한다.

    예를 들어 그림 13 Polygon(다 각형)이란 클래스는 Triangle(삼각형), Rectangle(사각형)이란 서브 클래스를 가질 수 있는 데, Polygon에서 그 둘레의 길이를 계산하는 getPerimeter 함수를 생각해 보자. Polygon 의 둘레를 계산하는 방법을 각 변의 길이를 차례로 더하게 되는데 프로그래밍 언어에서는 for등의 루프(loop)문을 사용하여 변의 숫자만큼 반복하여 그 길이를 더 하면 된다. Triangle의 경우는 세변의 길이를 계산하여 더해야 하므로 getPerimeter 함수를 Triangle 클래스에 다시 정의해야 한다. 이후 삼각형에서 생성된 객체는 삼각형 클래스에 재정의 된 getPerimeter 함수를 수행한다. 사각형 클래스도 가로와 세로의 합에 2를 곱하는 방식 으로 getPerimeter를 재정의 한다.

     3) 다중성(Polymorphism)

      그림 13에서 Polygon 클래스가 가고 있는 getPerimeter 함수가 여러 서브 클래스에서 재정의 되었다. 그 결과, 한 프로그램 안에 getPerimeter라는 함수가 여러 군데에 정의되게 되는데, 이러한 현상을 다중성(Polymorphism)이라 한다. C등의 재래 식언어에서는 동일한 이름의 함수를 두 번 이상 정의할 수가 없었으나, 객체지향 언어에서 는 여러 클래스들이 각 클래스의 목적에 맞게 동일한 이름의 함수를 가질 수 있다.
     
    예를 들어 여러 가지 파일의 내용을 출력하는 Print( )라는 함수를 생각해 보자. 파일의 종류에 따라 Print( )하는 알고리듬이 달라지는데 TextFile인 경우는 한 line을 읽고 프린터로 보내는 작업의 연속이며, 문서편집기 파일인 WPFile인 경우는 파일의 그 문서편집기에 맞는 머리 부문(Header)의 해석을 통해서 출력을 해야 하며, GraphicFile인 경우 그래픽 포맷에 따라서 그림을 해석 출력해야 한다. 따라서, 이런 경우 는 그림 14처럼 세 개의 클래스를 두고 그 위에 공통으로 File 클래스를 두면 된다. 이때, Print( ) 함수가 여러 클래스에 걸쳐 정의된 것을 함수의 다중성이라 한다.

    그림 14. 다중적으로 정의된 Print( ) 함 수

     

      객체지향 프로그래밍에서 다중성은 동일한 메시지를 사용하면서 각 클래스의 성격과 목적에 적합하게 달리 수행할 수 있는 편리함을 제공한다. 또한, 앞으로 다루어질 가상클래스와 함께 사용하면 자연스럽고 효율적인 프로그램을 설계할 수 있다.

     1) 객체지향 언어의 특징

      기존 대부분의 언어들이 프로그램의 프로세스 흐름을 표현하는데 비중을 두고 개발된 반면, 객체지향 언어들은 데이터나 정보의 표현에 비중을 두고 있다. 이를 Data-driven Program Design이라고 부르는데, 객체지향 프로그래밍에서는 대표적으로 객체가 이 Data부분에 해당된다. 그림 20은 객체지향 프로그래밍 언어들의 특징을 보여주고 있다.

    그림 15. 객체지향 언어들의 특징

      이 그림에서처럼 객체지향 언어들은 전역변수를 거의 사용하지 않는다. 일부 객체지향 언어들이 전역변수를 허용하지만 각 모듈의 독립성을 유지하기 위해 그 사용은 권장되고 있지 않다. 상자 모양에 외부 인터페이스가 추가된 것이 하나의 클래스를 나타내고 있으며 여러 클래스들은 상속 구조로 연결되어 있다. 이처럼 객체지향 언어들은 기존 언어들에 비해 전역 변수의 사용을 제한하고 객체와 클래스란 장치를 사용하여 프로그램을 설계함으로써 모듈간의 높은 독립성을 유지한다. 또한, 클래스간의 상속 관계를 정의할 수 있도록 하여 한 프로그램 내의 중복 코드를 최소화하며 결과 유지 보수도 용이하게 해 준다.

     2) 객체지향 언어의 종류

    모든 객체지향 언어들이 개발 과정에서 다른 언어들에 영향을 받아 발전되었는데 그림 211은 객체지향 언어들의 발전 과정을 나타내고 있다.

     

     

     

    그림 16. 객체지향 언어들의 진화 과정

      객체지향 언어를 더 상세히 살펴보면 혼합 (Hybrid) 객체지향 언어와 순수 (Pure) 객체지향 언어로 구분할 수 있다. 혼합 객체지향 언어는 지존의 절차적 (Procedural) 언어를 객체지향식 프로그래밍도 가능하도록 확장한 것인데, 이런 언어로는 한 프로그램 안에서 절차적 프로그래밍과 객체지향 프로그래밍을 모두 할 수 있다. 따라서, 이미 개발된 절차적 프로그램이나 라이브러리를 활용하면서 객체지향식 프로그램을 개발할 경우는 이런 혼합 언어가 적절하다.

      순수 객체지향 언어들은 객체지향 방식의 프로그램 개발만 가능하게 하는데, 절차적 프로그램에 흔히 사용되는 전역 변수나 함수들을 지원하지 않는다. 이런 언어로 개발된 프로그램은 객체, 클래스, 상속 등의 객체지향 장치로만 구성되어 있어, 프로그램 수정이나 보완 등이 용이해 진다. 또한, 객체지향 프로그래밍 을 배우기 위한 목적이라면 더욱 이런 순수 객체지향 언어이어야 한다.

    그림21에서 60년대의 LISP언어를 중심으로 발전되어 온 Flavors, LOOPS, CLOS는 주로 인공지능 분야에 사용되는 객체 지향 언어들이다. 순수 객체지향 언어의 시작은 SIMULA라는 언어에서 시작하여, Smalltalk, Eiffel, Actor등으로 연결이 되 는데, 그림에 나타난 데로 Smalltalk언어가 대부분의 중요한 객체지향 언어들에 많은 영향을 주었음을 알 수 있다. 널리 사용되는 C++언어도 기존의 C언어와 Smalltalk 언어에서 발전된 것이다.

      이외에도 많은 객체지향 언어들이 개발이 되어 왔으며 새로운 언어들 도 등장할 것으로 예상하고 있다. 한 예로서 객체지향 COBOL을 들 수가 있는데, 이미 X3J4.1한 표준 그룹에서 1997년에 ANSI COBOL을 내 놓을 예정이다. 이 그룹의 원래 개 발 방향은 기존의 COBOL에다 객체지향 장치를 추가하는 것이었는데, 1993년에 새로운 객체지향 언어로 개발하면 지존의 COBOL장치를 지원하는 것으로 방향이 선회 되었다.

     3) 객체지향 언어의 선택
      프로그램 개발에 앞서 언어의 선정은 여러 가지 이유로 매우 중요한 다. 특정한 언어가 여러 종류의 시스템 개발에 모두 최적일 수 는 없으며, 목표 시스템의 특성과 영역에 따라서 적절한 언어를 선택하여야 한다. 언어 선택의 일반적인 지침은 다음과 같다.
    1.
    목표 시스템에 대한 알려져 있는 정보를 나열한다.
    2.
    목표 시스템에서 요구되는 기능, 성능 사항, 특성 및 상황을 분석한다.
    3.
    각 대상 언어가 가지는 있는 기능과 특성을 나열한다.
    4.
    목표 시스템의 요구 사항들을 가장 많이 지원하는 언어를 선택한다.

    예를 들어 목표 시스템이 C언어로 개발된 라이브러리를 활용해야 한다면 C 프로그램도 지원하는 C++가 될 것이며, 순수한 객체지향 프로그램 개발이 목표라면 Smalltalk이나 Eiffel등이 될 것이다



  • 눈팅만으로는 전체글을 볼 수 없습니다. 로그인하셔야 합니다.

    He can do, She can do, why not me?

    [한국리눅스유저그룹]의 글을 퍼가실때에는 반드시 [출처]를 표시해 주시는 센스가 필요합니다!
    지금 이시간, 공부하고 있는 당신은 머지않아 최고가 될 것입니다. 즐겁게 공부하시고, 힘내십시오!
    포스팅 글이 유용하셨다면 RSS를 구독하시면 됩니다.
    유용하고, 좋은글 포스팅 바랍니다. 포스팅된 글은 (전세계)? 대부분의 소셜 사이트에 포스팅됩니다.



  • 우성창   08-05-01 19:48
    엇..음..그림이 안나오네요..-_-;;
    [게시판 맨위로]
    [본문 프린트하기]

    [포인트 정책] :: 글읽기 : -2점(글쓴이는 포인트 받음), 글쓰기 : +20점, 코멘트 : +10점, 다운로드 : -200점
    총조회수 : 282,055회 | 전체글 : 44건 | 게시글 : 38건 | 코멘트 : 6건
    [ 날짜순 / 조회순 ]
    번호 제목
    8
    우성창 작성일 : 05-10 / 조회 : 7396

    No Image
    [스크랩]시스템의 각종 정보 알아내기

    CPU정보 : cat /proc/cpuinfo디바이스정보 : cat /proc/devices사용중인 파일 시스템 : cat /proc/filesystems인터럽트(IRQ) : cat /proc/interrupts메모리 : cat /proc/meminfo작동…
    7
    우성창 작성일 : 05-01 / 조회 : 5373

    No Image
    문득 생각이나서 다시한번 찾아본 단어... (1)

    문득 생각이나서 다시한번 찾아본 단어... 그이름 객체지향.나는 과연 이 객체지향이라는것을 이론으로 알고 있는 것이 아닌실제로 느끼며 정확히 파악을 하며 사용하는지 의심이 들어 인터넷을 뒤적이며이론적…
    6
    우성창 작성일 : 04-18 / 조회 : 5536

    No Image
    [TIP]윈도우즈와 달리 리눅스의 X 서버는 여러개를 띄울 수 있다.

    윈도우즈와 달리 리눅스의 X 서버는 여러개를 띄울 수 있다.우선 X 윈도우를 벗어나 가상 콘솔로 나가보도록 한다.Ctrl+Alt+F1~F6F1에서 F6중 하나를 선택하면 가상 콘솔로 이동된다.자 이제 다음과 같이 명령을 내려 …
    5
    우성창 작성일 : 04-16 / 조회 : 46026

    No Image
    아주 예전에 스크랩 해뒀던 리눅스 FAQ

    1. 질문 : 리눅스는 어디에서 구할 수 있나요?답변 : 각 기업의 배포판을 인터넷에서 다운로드 받을 수 있고, 리눅스관련 잡지의 부록으로도 많이 배포되고 있습니다. 2. 질문 : 도움이 될만한 리눅스 사이트는 어디…
    4
    우성창 작성일 : 04-16 / 조회 : 7024

    No Image
    쓰다만... 운영체제의 종류

    도스종류MS-DOSCS-DOSPC-DOSDR-DOSK-DOS <---- 우리나라에서 만듬DOS/V윈도우 전 시대를 풍미했던 텍스트 모드의 운영체제. 안정되고 다양한 응용 프로그램으로 인해 아직도 많은 사용자들이 이용하고 있다. 윈도우 3.1과 …
    3
    우성창 작성일 : 04-05 / 조회 : 176

    No Image
    안녕하세요 다뜻한 봄이 확실히 느껴지는 토요일 이네요~^^

    안녕하세요 노드입니다.^^날씨가 살살 더워지는데 다들 여름 맏이 준비는 잘 하고 계신가요?죄송스러운 이야기지만 제가 개인 게시판을 운영 못할듯 합니다.프로젝트로 집에들어가기도 바쁜상황에서 게…
    2
    NodPlayer 작성일 : 03-12 / 조회 : 4720

    No Image
    [푸념]주말까지 출근을 하느라.. (1)

    안녕하세요 노드입니다.제가 월화수목금금금인지라.글쓰는게 늦어지네요^^;매일매일 러그 들어와 글들을 보고 가지만 쓰려니 시간이 ㅠㅠ집에오면 11시고.. 에휴 컴퓨터 쟁이가 다 그렇지만..컴퓨터 쟁이라 그런…
    1
    NodPlayer 작성일 : 03-05 / 조회 : 5396

    No Image
    안녕하세요 Nod 입니다.

    안녕하세요 Nod 입니다. 개인게시판이 생겼네요.생성해주신 멀티님 다시한번 감사드립니다.이 게시판 용도를 정해야 하는데본 홈페이지가 리눅스 유저 그룹인 만큼 리눅스에 대하여글을 쓸 예정입니다.제가 파워…
     1  2  3  4
    [게시판 맨위로]
    한국LUG는 대한민국의 리눅스 지식인[사용자/개발자]들의 커뮤니티입니다. [매년 1~2회의 공개세미나 개최]
    한국LUG : 울산 - 광주 - 전북 - 인천 - 대전 - LUG 위키

    [Linux Distribution] : CentOS | Ubuntu | Fedora | WhiteBox | Debian | Slackware | Gentoo | openSuSE

    "Linux" is a registered trademark of Linus Torvalds. "Linux is Kernel"
    - 리눅스는 공짜가 아니라 자유[Free & Effort]입니다 -
    [인터넷 서점/출판사 링크] : 강컴 | 알라딘 | 인터파크 | 예스24 | 교보문고 | 수퍼유저코리아 | 제이펍
    한국LUG 사이트는 1024 x 768 해상도(운영자 노트북:14")에 최적화 되어 있습니다. : LINUX FANSITE
    WWW.LUG.OR.KR Server is made by CentOS Linux, P4 1.8G, Memory 512MB, Main HDD 160GB, Backup HDD 40GB and LAMP, qmail MTA.
    CentOS Linux & Mozilla Firefox UTF-8 Base Created.
    visitor stats
    1998-2024 www.lug.or.kr   Directed By Great Dragon, Kim.   Top
    LUG 포인트 정책 : [회원가입 : +100점] [로그인(하루한번) : +100점] [글쓰기 : +20점] [코멘트 : +10점] [다운로드 : -200점] [질문 포인트 : 최소 200점]
    데스크탑 프로그래밍(gcc, g++, wxGTK[wxWidgets] 등)은 "Fedora"를 사용하고, 서버 운영(WEB, FTP 등)은 "CentOS"를 사용하시길 권장합니다.
    도전하는자, 자신을 투자하는자만이 뜻하는바를 이룰 수 있다.
    Information should be Exchanged with Interactive, not One Way Direction.
    준회원, 정회원, 우수회원, VIP회원, 기업회원, 관리자
    Be Maker!
    인생에서, 100% 순이익을 보장하는건 없다. 1%의 지식을 나눔으로써, 가끔씩 손해볼 필요도 있다.
    그대가 가진 1%의 지식만이라도 공공을 위해 포스팅하라. 손해본다는 생각이 앞선다면 그대의 인생은 힘들어질것이다.
    자신이 가진 지식의 1%도 투자하지 않고, 오로지 자신의 이익만 탐하는자와는 동지가 되지마라.
    만나서 대화하면 모두 좋은 사람들이지만, 유독 인터넷에서만 자신을 밝히지 않고, 좀비로 서식하는 사람들이 많다.
    부지불식간[不知不識間], 좀비(하류) 인생이 될지도 모르니, 항상 자신을 경계하도록 하라.
    홈으로~
    [도서 안내]
    1. CentOS Linux
    2. gcc로 공부하는 C++
    베스트셀러 입성^^

    3. 쉘 스크립트 입문
    4. JSP 입문

    아래 배너들은 LUG 세미나 모임에 도움을 주신(실) 멋진 기업들입니다. ^^