캡�화 (encapsulation)
ì�¼ë°˜ì �으로 우리 ìƒ�활ì—�서 ì–´ë–¤ ì •ë³´ì™€ ì–´ë–¤ 종류ì�˜ 작업ì�€ ê°œë…�ì �으로 서로 ì—°ê´€ë�˜ì–´ 있ì�Œì�„ ë§Žì�´ ì ‘í•œë‹¤. ì�´ëŸ¬í•œ ì—°ê´€ë�œ ì •ë³´ì™€ 작업 ë˜�는 기능ì�„ 하나로 묶는 것ì�€ ìž�연스런 ê³¼ì •ì�´ë‹¤. 예를 들어 대학êµ�ì�˜ ì�¸ì‚¬ê´€ë¦¬ì—�서는 í•™ìƒ�들ì�˜ ì�´ë¦„, 주소, 학번, ì „ê³µ 들ì�˜ ì •ë³´ë¥¼ ìœ ì§€í•˜ë©° í•™ìƒ�들ì—� 관해 가능한 작업ì�¸ í�‰ì � 계산, 주소변경, ê³¼ëª©ì‹ ì² ë“¤ì�˜ 기능들ì�„ ìƒ�ê°�í• ìˆ˜ 있다. ì�´ëŸ¬í•œ ì •ë³´ì™€ ì •ë³´ 처리ì—� 필요한 작업, 즉 기능들ì�€ 모ë‘� í•™ìƒ�ì—� 관한 것ì�´ë¯€ë¡œ í•™ìƒ�ì�´ë�¼ëŠ” í…Œë‘�리로 묶어ë‘�는 것ì�´ ìž�연스러운 것ì�´ë‹¤. ì�´ë ‡ê²Œ ì—°ê´€ë�œ 사í•들ì�„ 하나로 묶는 것ì�„ 캡ìŠ�í™”(encapsulation)ë�¼ê³ 한다.
프로그램ìƒ�ì—�서ì�˜ 캡ìŠ�í™”ì�˜ ì�˜ë¯¸ëŠ” 프로그램 ë¶„ì„�ìž�나 설계ìž�ê°€ 주어진 ë¬¸ì œë¥¼ ë�°ì�´íƒ€ì™€ 함수들ì�˜ 세부사í•들ì�€ 개발ì�˜ 차후단계ì—�서 ì •ì�˜í•˜ê³ , ê°�ì²´ë�¼ëŠ” ë�©ì–´ë¦¬ 단위로 ë¬¸ì œì—� 대해 ìƒ�ê°�하게 하는 ì¶”ìƒ�í™”ì�˜ 수단ì�„ ì œê³µí•˜ëŠ” ë�° 있다.
프로그램ìƒ�ì—�서ì�˜ 캡ìŠ�í™”ì�˜ ì�˜ë¯¸ëŠ” 프로그램 ë¶„ì„�ìž�나 설계ìž�ê°€ 주어진 ë¬¸ì œë¥¼ ë�°ì�´íƒ€ì™€ 함수들ì�˜ 세부사í•들ì�€ 개발ì�˜ 차후단계ì—�서 ì •ì�˜í•˜ê³ , ê°�ì²´ë�¼ëŠ” ë�©ì–´ë¦¬ 단위로 ë¬¸ì œì—� 대해 ìƒ�ê°�하게 하는 ì¶”ìƒ�í™”ì�˜ 수단ì�„ ì œê³µí•˜ëŠ” ë�° 있다.
�성 ��(inheritance)
ì†�성 ìƒ�ì†�ì�´ë�¼ëŠ” ê°œë…� ì—시 우리ì�˜ ì�¼ìƒ� ìƒ�활ì—�서 í�”히 사용하는 ê°œë…�ì�„ 프로그램으로 표현하기 위한 편리한 수단ì�´ë‹¤. ì–´ë–¤ ê°�ì²´ì�˜ 종류, 즉 í�´ëž˜ìŠ¤ëŠ” 좀 ë�” 세분화하여 ë¶„ë¥˜í• ìˆ˜ê°€ 있는ë�° ì�´ë ‡ê²Œ 세분화ë�œ 종류나 ìœ í˜•ì�„ subtype 혹ì�€ subclassë�¼ê³ 한다.
ê°�체지향 프로그래ë°�ì—�서 "ì†�성 ìƒ�ì†�"ì�€ 새로운 í�´ëž˜ìŠ¤ë¥¼ ì •ì�˜í• 때 ëª¨ë“ ê²ƒì�€ 처ì�Œë¶€í„° 다 ì •ì�˜í•˜ëŠ” 것ì�´ 아니ë�¼ ì�´ë¯¸ 존재하는 ìœ ì‚¬í•œ í�´ëž˜ìŠ¤ë¥¼ 바탕으로 하여 필요한 ì†�성만 추가하여 ì •ì�˜í•˜ëŠ” ê²½ì œì �ì�¸ 방법ì�„ ì�˜ë¯¸í•œë‹¤. ì�´ 때 새로ì�´ ìƒ�기는 í�´ëž˜ìŠ¤ë¥¼ subclassë�¼ í•˜ê³ ê·¸ 바탕ì�´ ë�˜ëŠ” í�´ëž˜ìŠ¤ë¥¼ superclassë�¼ 한다. ì�´ë ‡ê²Œ 하면 í�´ëž˜ìŠ¤ë“¤ 사ì�´ì—�서 공통으로 가지는 특성, 즉 ë�°ì�´íƒ€ 구조나 함수들ì�€ 중복하여 ì •ì�˜í•˜ëŠ” ì�¼ì�„ 줄ì�¼ 수 있ì�„ ë¿� 아니ë�¼, 특성ì�„ ìˆ˜ì •í•˜ê±°ë‚˜ 추가시ì—� superclassì�˜ ì •ì�˜ë§Œ ê³ ì¹˜ë©´ ê·¸ subclass들ë�„ 변경ë�œ ì†�성ì�„ ìž�ë�™ì �으로 ìƒ�ì†�받게 ë�˜ë¯€ë¡œ 매우 편리하다.
ê°�체지향 프로그래ë°�ì—�서 "ì†�성 ìƒ�ì†�"ì�€ 새로운 í�´ëž˜ìŠ¤ë¥¼ ì •ì�˜í• 때 ëª¨ë“ ê²ƒì�€ 처ì�Œë¶€í„° 다 ì •ì�˜í•˜ëŠ” 것ì�´ 아니ë�¼ ì�´ë¯¸ 존재하는 ìœ ì‚¬í•œ í�´ëž˜ìŠ¤ë¥¼ 바탕으로 하여 필요한 ì†�성만 추가하여 ì •ì�˜í•˜ëŠ” ê²½ì œì �ì�¸ 방법ì�„ ì�˜ë¯¸í•œë‹¤. ì�´ 때 새로ì�´ ìƒ�기는 í�´ëž˜ìŠ¤ë¥¼ subclassë�¼ í•˜ê³ ê·¸ 바탕ì�´ ë�˜ëŠ” í�´ëž˜ìŠ¤ë¥¼ superclassë�¼ 한다. ì�´ë ‡ê²Œ 하면 í�´ëž˜ìŠ¤ë“¤ 사ì�´ì—�서 공통으로 가지는 특성, 즉 ë�°ì�´íƒ€ 구조나 함수들ì�€ 중복하여 ì •ì�˜í•˜ëŠ” ì�¼ì�„ 줄ì�¼ 수 있ì�„ ë¿� 아니ë�¼, 특성ì�„ ìˆ˜ì •í•˜ê±°ë‚˜ 추가시ì—� superclassì�˜ ì •ì�˜ë§Œ ê³ ì¹˜ë©´ ê·¸ subclass들ë�„ 변경ë�œ ì†�성ì�„ ìž�ë�™ì �으로 ìƒ�ì†�받게 ë�˜ë¯€ë¡œ 매우 편리하다.
다형성(Polymorphism)
ê°�ì²´ 지향 프로그램ì�˜ 중요한 특징으로 하나ì�˜ 함수 ì�´ë¦„ì�´ë‚˜ 심볼ì�´ 여러 목ì �으로 사용ë� 수 있는 다형성(Polymorphism)ì�„ 들 수 있다. ê°�ì²´ 지향ì—�서ì�˜ 다형성ì�´ëž€, 복수ì�˜ í�´ëž˜ìŠ¤ê°€ 하나ì�˜ 메세지ì—� 대해 ê°� í�´ëž˜ìŠ¤ê°€ ê°€ì§€ê³ ìžˆëŠ” ê³ ìœ í•œ 방법으로 ì�‘ë‹µí• ìˆ˜ 있는 ëŠ¥ë ¥ì�„ ë§�한다. 즉, 별개로 ì •ì�˜ë�œ í�´ëž˜ìŠ¤ë“¤ì�´ ã…Œì�€ ì�´ë¦„ì�˜ 함수를 별ë�„로 ê°€ì§€ê³ ìžˆì–´ 하나ì�˜ 메세지ì—� 대해 ê°�기 다른 방법으로 ê·¸ 메세지를 ìˆ˜í–‰í• ìˆ˜ 있는 것ì�„ ì�˜ë¯¸í•œë‹¤. 예를 들어, 여러 가지 í™”ì�¼(file)들ì�„ 프린트 하는 함수를 ìƒ�ê°�í•´ ë³´ìž�. í™”ì�¼ì—�는 간단한 í…�스트 í™”ì�¼(text file), 문서 편집기로 ë§Œë“ í�¬ë©§ í™”ì�¼(format file), 그래픽ì�„ í�¬í•¨í•˜ëŠ” í™”ì�¼(file with graphics) 등 여러 가지가 있다. ì�´ë“¤ ê°�ê°�ì�˜ í™”ì�¼ë“¤ì�€ 프린트 하는 방법ì�´ 모ë‘� 다르다, ê°�ì²´ 지향ì—�서는 아래처럼 ê°� 종류ì�˜ í™”ì�¼ì�„ 별ë�„ì�˜ í�´ëž˜ìŠ¤ë¡œ ì •ì�˜í•˜ê³ , ê°�ê°�ì�˜ í™”ì�¼ 종류별로 Printë�¼ëŠ” 함수를 í™”ì�¼ì�˜ 형태ì—� 맞게 구현한다.
~cpp Text file -> Print(); Formatted file -> Print(); File with graphics -> Print();
ì�´ë ‡ê²Œ ìƒ�성ë�œ í™”ì�¼ ê°�체들ì�€ 모ë‘� Printë�¼ëŠ” 메세지를 ì�´í•´í•˜ë©°, ê°� í™”ì�¼ì�˜ 종류ì—� 알맞게 프린트 í• ìˆ˜ 있다. ì�´ë ‡ë“¯ 다형성ì�€ ê°™ì�€ ì�´ë¦„ì�˜ 함수를 여러 í�´ëž˜ìŠ¤ê°€ ê°� í�´ëž˜ìФì—� 알맞게 달리 ì •ì�˜í•˜ê³ ê°™ì�€ ì�´ë¦„ì�˜ 메세지ì—� ì�‘ë‹µí• ìˆ˜ 있게 해준다.
ì •ë³´ ì�€í�� (infomation hiding)
ì •ë³´ ì�€í��란 캡ìŠ�ì†�ì—� 쌓여진 í•목ì—� 대한 ì •ë³´ë¥¼ 외부ì—� ê°�추는 것ì�„ ì�˜ë¯¸í•œë‹¤. 즉, ì²˜ë¦¬í•˜ë ¤ëŠ” ë�°ì�´íƒ€ 구조와 함수ì—� 사용ë�œ ì•Œê³ ë¦¬ì¦˜ 들ì�„ 외부ì—�서 ì§�ì ‘ ì ‘ê·¼í•˜ì§€ 못하ë�„ë¡� í•˜ê³ ìº¡ìŠ� ë‚´ë¶€ì�˜ 함수들만ì�´ ì ‘ê·¼í•˜ê²Œ ë�œë‹¤. ê°�체지향ì—� 관한 서ì �ì�´ë‚˜ 논문ì—�서 ì�´ ë‘�가지 ê°œë…�ì�´ 중요시 소개ë�˜ëŠ” 것ì�€ 바로 ê°�ì²´ë�¼ëŠ” 것ì�´ 캡ìŠ�화와 ì •ë³´ ì�€í��ì�˜ ì›�리를 ì‹¤ì œì�˜ 프로그래ë°� 언어ì—�서 실현한 것ì�´ê¸°ë•Œë¬¸ì�´ë‹¤.
ê°�체와 ê°�ì²´ 사ì�´ì�˜ ì •ë³´ êµ�환ì�€ 외부ì—� ê³µê°œí•˜ê³ ìž� 하는 ì�¼ë ¨ì�˜ ì •ë³´ë¥¼ public interface로 ì •ì�˜í•´ 외부ì—� ê°�체들ì�´ ì�´ Interface를 통해서 ê·¸ ê°�체와 ì •ë³´ë¥¼ êµ�환하ë�„ë¡� 한다. 즉, 한 ê°�ì²´ì�˜ Public Interface를 ê·¸ ê°�ì²´ê°€ "무슨 ì�¼ì�„ í• ìˆ˜ 있다. 혹ì�€ ì�´ ì •ë³´ëŠ” ê³µê°œí• ìˆ˜ 있다."ë�¼ê³ 외부ì—� ì„ ì–¸í•˜ëŠ” 것ì�´ë‹¤.
ì�´ Public Interface는 언어ì—� ë”°ë�¼ 표현 ì–‘ì‹�ì�´ 다른ë�°, C++ì—�서는 "public"ì�´ëž€ 특별 구문ì�„ ë‘�ì–´ "public"란ì—� 들어간 í•목들만 외부ì—� 공개ë�œë‹¤. Effelì�´ëž€ 언어ì—�서는 "export"ë�¼ëŠ” 란ì—� ì§€ì •ë�œ í•목들만 외부ì—� 공개ë�œë‹¤. 앞ì—�서 ì •ì�˜í•œ POINTë�¼ëŠ” ê°�ì²´ ì •ì�˜ë¥¼ ë³´ë©´ move와 setcolorì�˜ 함수들ì�´ 외부ì—�서 관찰ë� 수 있는 public interfaceìž„ì�„ 알 수 있다. 여기서 한가지 ìœ ì�˜í• ì �ì�€ move와 setcolorë�¼ëŠ” 함수들ì�´ 외부ì—� ë³´ì—¬ì ¸ 불리워질 수 있는 함수들ì�´ë�¼ëŠ” 것ì�´ë©° ê°� 함수가 ê°€ì§€ê³ ìžˆëŠ” 코드나 ì•Œê³ ë¦¬ì¦˜ê¹Œì§€ 보여지는 것ì�€ 아니ë�¼ëŠ” 것ì�´ë‹¤. 한 함수가 외부ì—� 보여지는 부분ì�„ signatureë�¼ê³ 하며 하나ì�˜ signature는 함수ì�˜ ì�´ë¦„, ìž…ë ¥ 매개변수(input parameter)와 ì¶œë ¥ 매개변수(output parameter)로 구성ë�˜ì–´ 있다.
위ì—�서 살펴볼 캡ìŠ�화와 ì •ë³´ ì�€í��ì�˜ ì�´ì �ì�€ ìš°ì„ ê°�ì²´ ë‚´ë¶€ì�˜ ì�€í��ë�œ ë�°ì�´íƒ€ 구조가 변하ë�”ë�¼ë�„ 주변 ê°�체들ì—�게 ì˜�í–¥ì�„ 주지 않는다는 것ì�´ë‹¤. 예로서, ì–´ë–¤ 변수ì�˜ 구조를 ë°°ì—´(array)구조ì—�서 리스트(list) 구조로 바꾸ë�”ë�¼ë�„ 프로그램ì�˜ 다른 부분ì—� ì „í˜€ ì˜�í–¥ì�„ 미치지 않는다. ë˜�한 ì–´ë–¤ 함수ì—� 사용ë�œ ì•Œê³ ë¦¬ì¦˜ì�„ 바꾸ë�”ë�¼ë�„ signatureë§Œ 바꾸지 않으면 외부 ê°�체들ì—�게 ì˜�í–¥ì�„ 주지 않는다. 예를 들어, sorting 함수ì�˜ 경우 처ì�Œ 사용ë�œ sequence sorting ì•Œê³ ë¦¬ì¦˜ì—�서 quick sorting ì•Œê³ ë¦¬ì¦˜ìœ¼ë¡œ 바뀔때 외부ì—� ì–´ë–¤ ì˜�í–¥ë�„ 주지 않는다. ì�´ëŸ¬í•œ 장ì �ì�„ ìœ ì§€ë³´ìˆ˜ ìš©ì�´ì„±(maintainability) 혹ì�€ 확장성(extendability)ì�´ë�¼ 한다.
ê°�체와 ê°�ì²´ 사ì�´ì�˜ ì •ë³´ êµ�환ì�€ 외부ì—� ê³µê°œí•˜ê³ ìž� 하는 ì�¼ë ¨ì�˜ ì •ë³´ë¥¼ public interface로 ì •ì�˜í•´ 외부ì—� ê°�체들ì�´ ì�´ Interface를 통해서 ê·¸ ê°�체와 ì •ë³´ë¥¼ êµ�환하ë�„ë¡� 한다. 즉, 한 ê°�ì²´ì�˜ Public Interface를 ê·¸ ê°�ì²´ê°€ "무슨 ì�¼ì�„ í• ìˆ˜ 있다. 혹ì�€ ì�´ ì •ë³´ëŠ” ê³µê°œí• ìˆ˜ 있다."ë�¼ê³ 외부ì—� ì„ ì–¸í•˜ëŠ” 것ì�´ë‹¤.
ì�´ Public Interface는 언어ì—� ë”°ë�¼ 표현 ì–‘ì‹�ì�´ 다른ë�°, C++ì—�서는 "public"ì�´ëž€ 특별 구문ì�„ ë‘�ì–´ "public"란ì—� 들어간 í•목들만 외부ì—� 공개ë�œë‹¤. Effelì�´ëž€ 언어ì—�서는 "export"ë�¼ëŠ” 란ì—� ì§€ì •ë�œ í•목들만 외부ì—� 공개ë�œë‹¤. 앞ì—�서 ì •ì�˜í•œ POINTë�¼ëŠ” ê°�ì²´ ì •ì�˜ë¥¼ ë³´ë©´ move와 setcolorì�˜ 함수들ì�´ 외부ì—�서 관찰ë� 수 있는 public interfaceìž„ì�„ 알 수 있다. 여기서 한가지 ìœ ì�˜í• ì �ì�€ move와 setcolorë�¼ëŠ” 함수들ì�´ 외부ì—� ë³´ì—¬ì ¸ 불리워질 수 있는 함수들ì�´ë�¼ëŠ” 것ì�´ë©° ê°� 함수가 ê°€ì§€ê³ ìžˆëŠ” 코드나 ì•Œê³ ë¦¬ì¦˜ê¹Œì§€ 보여지는 것ì�€ 아니ë�¼ëŠ” 것ì�´ë‹¤. 한 함수가 외부ì—� 보여지는 부분ì�„ signatureë�¼ê³ 하며 하나ì�˜ signature는 함수ì�˜ ì�´ë¦„, ìž…ë ¥ 매개변수(input parameter)와 ì¶œë ¥ 매개변수(output parameter)로 구성ë�˜ì–´ 있다.
위ì—�서 살펴볼 캡ìŠ�화와 ì •ë³´ ì�€í��ì�˜ ì�´ì �ì�€ ìš°ì„ ê°�ì²´ ë‚´ë¶€ì�˜ ì�€í��ë�œ ë�°ì�´íƒ€ 구조가 변하ë�”ë�¼ë�„ 주변 ê°�체들ì—�게 ì˜�í–¥ì�„ 주지 않는다는 것ì�´ë‹¤. 예로서, ì–´ë–¤ 변수ì�˜ 구조를 ë°°ì—´(array)구조ì—�서 리스트(list) 구조로 바꾸ë�”ë�¼ë�„ 프로그램ì�˜ 다른 부분ì—� ì „í˜€ ì˜�í–¥ì�„ 미치지 않는다. ë˜�한 ì–´ë–¤ 함수ì—� 사용ë�œ ì•Œê³ ë¦¬ì¦˜ì�„ 바꾸ë�”ë�¼ë�„ signatureë§Œ 바꾸지 않으면 외부 ê°�체들ì—�게 ì˜�í–¥ì�„ 주지 않는다. 예를 들어, sorting 함수ì�˜ 경우 처ì�Œ 사용ë�œ sequence sorting ì•Œê³ ë¦¬ì¦˜ì—�서 quick sorting ì•Œê³ ë¦¬ì¦˜ìœ¼ë¡œ 바뀔때 외부ì—� ì–´ë–¤ ì˜�í–¥ë�„ 주지 않는다. ì�´ëŸ¬í•œ 장ì �ì�„ ìœ ì§€ë³´ìˆ˜ ìš©ì�´ì„±(maintainability) 혹ì�€ 확장성(extendability)ì�´ë�¼ 한다.
추� �래스(Abstract Class)
í�´ëž˜ìФ 중ì—�는 ì�¸ìŠ¤í„´ìŠ¤(instance)를 만들어 낼 목ì �ì�´ 아니ë�¼ subclass들ì�˜ 공통ë�œ 특성ì�„ 추출하여 묘사하기 위한 í�´ëž˜ìŠ¤ê°€ 있는ë�°, ì�´ë¥¼ ì¶”ìƒ� í�´ëž˜ìФ(Abstract class, Virtual class)ë�¼ 한다. 변수들ì�„ ì •ì�˜í•˜ê³ 함수중 ì�¼ë¶€ëŠ” ì™„ì „ížˆ 구현하지 ì•Šê³ , Signatureë§Œì�„ ì •ì�˜í•œ 것들ì�´ 있다. ì�´ë“¤ì�„ ì¶”ìƒ� 함수(Abstract function)ë�¼ 부르며, ì�´ë“¤ì�€ 후ì—� subclass를 ì •ì�˜í• 때ì—� ê·¸ í�´ëž˜ìФì�˜ 목ì �ì—� 맞게 ì™„ì „ížˆ 구현ë�œë‹¤. ì�´ 때 ì¶”ìƒ� í�´ëž˜ìФì�˜ 한 subclassê°€ ìƒ�ì†�ë°›ì�€ ëª¨ë“ ì¶”ìƒ� 함수들ì�„ ì™„ì „ížˆ 구현했ì�„ 때, ì�´ë¥¼ ì™„ì „ í�´ëž˜ìФ(Concrete class)ë�¼ê³ 부른다. ì�´ ì™„ì „ í�´ëž˜ìŠ¤ëŠ” ì�¸ìŠ¤í„´ìŠ¤ë¥¼ 만들어 낼 수 있다.
ì¶”ìƒ� í�´ëž˜ìФì�˜ 예로서 프린터 소프트웨어를 ìƒ�ê°�í•´ ë³´ìž�. ìš°ì„ ëª¨ë“ ì¢…ë¥˜ì�˜ 프린터들ì�´ 공통으로 가지는 특성ì�„ ì •ì�˜í•œ ì¶”ìƒ� í�´ëž˜ìФ "Printer"ê°€ ìžˆë‹¤ê³ í•œë‹¤ë©´, 여기ì—�는 프린터ì�˜ ìƒ�태를 나타내는 변수, 프린터ì�˜ ì†�ë�„ 등ì�˜ 변수가 있으며 함수로는 프린팅ì�„ 수행하는 Print 등ì�„ ìƒ�ê°�í• ìˆ˜ 있다. 그러나 프린터마다(Dot matrix printer, Laser printer, Ink jet printer) 프린팅 하는 방법ì�´ 다르므로 ì�´ ì¶”ìƒ� í�´ëž˜ìФ 안ì—�서는 Printë�¼ëŠ” 함수를 ì™„ì „ížˆ êµ¬í˜„í• ìˆ˜ 없다. 다만, 여기ì—�는 Print ì¶”ìƒ� 함수ì�˜ Signatureë§Œ ê°€ì§€ê³ ìžˆìœ¼ë©°, ì‹¤ì œì�˜ 구현ì�€ 여러 subclassì—�서 ê°� 프린터 종류ì—� 알맞게 하면 ë�œë‹¤.
"Printer"ë�¼ëŠ” í�´ëž˜ìŠ¤ëŠ” ì¶”ìƒ� í�´ëž˜ìŠ¤ë¡œì„œ 실존ì�˜ ì–´ë–¤ 프린터 기능ì�„ ê°€ì§€ê³ ìžˆì§€ ì•Šê³ , dot matrix printer나 laser printer 등ì�˜ ì™„ì „ í�´ëž˜ìŠ¤ë“¤ ê°„ì�˜ 공통ë�œ 특성만 ì§€ì •í•˜ê³ ìžˆìœ¼ë¯€ë¡œ, ê·¸ ì�¸ìŠ¤í„´ìŠ¤ë¥¼ 만드는 것ì�€ 무ì�˜ë¯¸í•˜ë‹¤. ì¶”ìƒ� í�´ëž˜ìŠ¤ëŠ” ì �ì§„ì � 개발 방법(Incremental Development)ì—� ìœ ìš©í•˜ê²Œ 사용ë� 수 있으며, 공통 ì†�성(attribute)ì�˜ 추출 ë°� ì •ì�˜ì—� ìœ ìš©í•˜ë¯€ë¡œ ë¬¸ì œë¥¼ 모ë�¸ë§�하는ë�° 편리함ì�„ ë�”해준다.
ì¶”ìƒ� í�´ëž˜ìФì�˜ 예로서 프린터 소프트웨어를 ìƒ�ê°�í•´ ë³´ìž�. ìš°ì„ ëª¨ë“ ì¢…ë¥˜ì�˜ 프린터들ì�´ 공통으로 가지는 특성ì�„ ì •ì�˜í•œ ì¶”ìƒ� í�´ëž˜ìФ "Printer"ê°€ ìžˆë‹¤ê³ í•œë‹¤ë©´, 여기ì—�는 프린터ì�˜ ìƒ�태를 나타내는 변수, 프린터ì�˜ ì†�ë�„ 등ì�˜ 변수가 있으며 함수로는 프린팅ì�„ 수행하는 Print 등ì�„ ìƒ�ê°�í• ìˆ˜ 있다. 그러나 프린터마다(Dot matrix printer, Laser printer, Ink jet printer) 프린팅 하는 방법ì�´ 다르므로 ì�´ ì¶”ìƒ� í�´ëž˜ìФ 안ì—�서는 Printë�¼ëŠ” 함수를 ì™„ì „ížˆ êµ¬í˜„í• ìˆ˜ 없다. 다만, 여기ì—�는 Print ì¶”ìƒ� 함수ì�˜ Signatureë§Œ ê°€ì§€ê³ ìžˆìœ¼ë©°, ì‹¤ì œì�˜ 구현ì�€ 여러 subclassì—�서 ê°� 프린터 종류ì—� 알맞게 하면 ë�œë‹¤.
"Printer"ë�¼ëŠ” í�´ëž˜ìŠ¤ëŠ” ì¶”ìƒ� í�´ëž˜ìŠ¤ë¡œì„œ 실존ì�˜ ì–´ë–¤ 프린터 기능ì�„ ê°€ì§€ê³ ìžˆì§€ ì•Šê³ , dot matrix printer나 laser printer 등ì�˜ ì™„ì „ í�´ëž˜ìŠ¤ë“¤ ê°„ì�˜ 공통ë�œ 특성만 ì§€ì •í•˜ê³ ìžˆìœ¼ë¯€ë¡œ, ê·¸ ì�¸ìŠ¤í„´ìŠ¤ë¥¼ 만드는 것ì�€ 무ì�˜ë¯¸í•˜ë‹¤. ì¶”ìƒ� í�´ëž˜ìŠ¤ëŠ” ì �ì§„ì � 개발 방법(Incremental Development)ì—� ìœ ìš©í•˜ê²Œ 사용ë� 수 있으며, 공통 ì†�성(attribute)ì�˜ 추출 ë°� ì •ì�˜ì—� ìœ ìš©í•˜ë¯€ë¡œ ë¬¸ì œë¥¼ 모ë�¸ë§�하는ë�° 편리함ì�„ ë�”해준다.










