U E D R , A S I H C RSS

Holub On Patterns/밑줄긋기

Contents

1. 소프트웨어 설계� 고고학
1.1. 설계 �칙
1.2. �존관계
2. OO와 디��패턴 기초 다지기
2.1. 패턴 vs �디엄
2.2. 디��패턴�란 무엇�가?
2.3. 패턴, 무엇� 좋�가?
2.4. 디���서 패턴� 역할
2.4.1. 패턴과 단순함 사�� 긴장
2.5. 패턴 분류하기
2.5.1. 디�� �반
2.5.2. �바를 C언어 스타�로 프로그래�하기
2.5.3. 열린 눈으로 프로그래�하기
2.6. �체란 무엇�가?
2.6.1. 허튼소리!
2.6.2. �체는 기능� 집합�다
2.6.3. 어떻게 잘못하고 있는가?
2.6.4. 어떻게 '올바르게' 할 수 있는가?
2.7. 셀룰러 오토마타
2.8. 접근 메소드와 수정 메소드는 나�다
2.8.1. 스스로를 표현하�
2.8.2. �바빈즈와 스트럿츠
2.8.3. 리팩토�
2.8.4. get/set 없는 삶
2.8.5. 언제 getter와 setter를 사용해� 괜찮�가?
2.8.6. getter/setter �슈 정리
3. �터페�스로 프로그래�하기 그리고 몇 개� �성 패턴
3.1. 왜 Extends가 나�가?
3.2. �터페�스 vs. �래스
3.2.1. 유연성� �실
3.2.2. 결합�
3.2.3. 깨지기 쉬운 기반 �래스 문제
3.2.4. 다중 ��
3.2.5. 프레임워�
3.2.6. Template method와 Factory Method 패턴
3.2.7. 깨지기 쉬운 기반 �래스 문제 정리
3.3. 언제 extends를 사용해� 좋�가?
3.4. extends 제거하기
3.4.1. 팩토리와 싱글톤
3.4.2. Singleton�서� 스레딩 �슈
3.4.3. Double-Checked Locking(사용하지 ��)
3.4.4. Singleton 죽�기
3.4.5. Abstract Factory 패턴
3.4.6. 패턴 비빔밥
3.4.7. 팩토리를 �용한 �� �성
3.4.8. Command 패턴과 Strategy 패턴
3.5. 요약
4. ��프 게임
4.1. ��프 얻기
4.2. ��프 구조를 차트로 표현하기
4.3. Clock 서브시스템 : Observer 디�� 패턴
4.3.1. Observer 구현하기 : Publisher �래스
4.4. Clock 서브시스템 : Visitor 패턴
5. 소형 ��터베�스 구현하기

1. 소프트웨어 설계� 고고학

1.1. 설계 �칙

  • p.1
    • 복싱ì—�서는 스트레ì�´íЏ, ìž½, í›…, ì�´ 세가지 펀치를 기반으로 다른 모든 종류ì�˜ 펀치가 나온다고한다. ~~~ ì�´ëŸ¬í•œ 기본 ìž�세가 튼튼하다면 그만í�¼ 다른 펀치를 배우는 ë�°ë�„ ì§„ìž… 장벽ì�´ 낮아지기 때문ì�´ë‹¤.
      • 스í�¬ì¸ ë¥¼ 사용해서 비유를 하는건 쉽게 ì�´í•´ëŠ” ë�˜ëŠ”ë�°, í•­ìƒ� 별로 재미없어. - 김준ì„�
      • 다른 종류지만 ê²€ë�„는 내려치기 ìž�세만 천번ì�¸ê°€ 연습한다고 합니다. 하루ì—�(만화책ì�´ì—ˆì�Œã…‹ã…‹) 그만í�¼ 기본기가 중요하다는 ë§�ì�´ê² ì£  - 서지혜

1.2. �존관계

  • p.3
    • 슬프게ë�„ 개발ìž� 입장ì—�서는 ì�˜ì‚¬ ê²°ì •ì—� 참여하여 변경ì—� 대한 요구를 막지 못하는 것ì�´ 대부분ì�´ë‹¤.
      • 요구사항ì�˜ 변경같ì�€ê²½ìš° 어쩔수 없지만 기술ì �ì�¸ 부분ì�´ë�¼ë©´ 개발ìž�ê°€ 가장 힘있지 않나? - 김준ì„�
        • 그건 ì�¸ë�„개발ìž�ë§Œ.. ì›�래는 ì�˜ì‚¬ê²°ì •ì�€ 가장 ë§Žì�€ 정보를 가진 사람ì�´ 내려야하는ë�°, 기술ì—� 대한 ê²°ì •ê¶Œì�„ 기술과 거리가 먼 관리ìž�등ì�´ 내리는 경우가 있다고 합니다(까ë�¼ë©´ 까 ì‹�으로). ì�´ë•Œì�˜ ì�˜ì‚¬ê²°ì •ê¶Œìž�는 모순ì � ìƒ�황ì—� 처해있ì�„ 거란 글ì�„ 봤는ë�°ã…‹ã…‹ 1. 기술ì—� 대한 ì§€ì‹�ì�´ ì �거나 ê±°ì�˜ì—†ë‹¤. 2. ì§€ì‹�ì�€ 없지만 기술ì—� 대한 확고한 입장ì�„ 가지고 있다. - 서지혜
        • 힘ì�´ë�¼ëŠ” ê±´ ê³ ê°�ê³¼ ê²½ì˜�ì§„ì—�게 있ì�„걸요ㅠㅠㅠㅠ ì�¼ê°œ 개발ìž�는 수드ë�¼... - 김수경

2. OO와 디��패턴 기초 다지기

2.1. 패턴 vs �디엄

  • p.22
    • ì�´ë””ì—„ì�€ ì�¼ìƒ�ì �으로 사용하게 ë�œ 패턴ì�´ë‹¤.
      • 지난주엔 ì�´ ë§� 때문ì—� 혼란스러웠는ë�° ì±…ì—�서 다시 보니 왜 혼란스러웠는지 모르겠어요. - 김수경
        • 난 ì±…ë³´ê³ ë�„ ì�´ìƒ�한 ë§�ì�´ë�¼ëŠ” ìƒ�ê°�ë°–ì—� 안드는군. - 김준ì„�
    • 1980년대 ì´ˆ C언어가 왕ì�´ì—ˆì�„ 무렵 ìƒ�ì†�ì�€ 하나ì�˜ ë””ìž�ì�¸ 패턴ì�´ì—ˆë‹¤.
      • 지금ì�€ ì�´ë””ì—„ì�´ ë�˜ì–´ 누구나 아무 ìƒ�ê°� ì—†ì�´ 사용하는 ìƒ�ì†�ì�´ 패턴ì�´ì—ˆë‹¤ëŠ” 사실ë�„ 재미있고 C언어가 왕ì�´ì—ˆë‹¤ëŠ” 표현ë�„ 재미있네요. - 김수경
    • 요즘ì�€ ìƒ�ì†�ê³¼ ì�¸í„°íŽ˜ì�´ìФ ê°™ì�€ 기능ì�´ ë§Žì�€ 언어ì—� 내장ë�˜ì–´ 있다. ì�´ë“¤ì�€ ì�´ë””ì—„ì�´ ë�œ 것ì�´ë‹¤.
      • ì—� 달린 ì—­ìž�주ì„�ì�„ 보니 노스 í™”ì�´íŠ¸í—¤ë“œê°€ "문명ì�´ 진보한다는 것ì�€ ì�¸ê°„ì�´ ì�˜ì‹�ì �ì�¸ 노력 ì—†ì�´ ìž�ë�™ì �으로 수행하는 활ë�™ì�´ ì¦�가하고 있ì�Œì�„ ì�˜ë¯¸"한다는 ì§€ì �ì�„ 했다고 한다. ì�´ë””ì—„ì�€ 과연 좋ì�€ê²ƒì�¸ê°€? ì�´ë””ì—„ì�´ì•¼ë§�로 ìƒ�ê°�ì—†ì�´ ì �용하는 패턴ì�´ 아닌가? - 서지혜
        • 다양한 사례ì—� ì �용해서 ì �ìš©ë�˜ê¸° 전보다 높ì�€ 효율ì�„ ë³´ì�¼ 수 있다는 것ì�´ 충분히 ê²€ì¦�ë�˜ì—ˆê¸° 때문ì—� ì�´ë””ì—„ì�´ ë�˜ëŠ” 것 ì•„ë‹�까요? 물론 모든 것ì—� 100% ì �ìš©ë�˜ëŠ” ì�´ë””ì—„ì�´ëž€ 존재하지 않겠지만요. - 박성현
          • 무책임한 ìƒ�ì†�ì�€ 오히려 변화ì�˜ í�¬ê¸°ë¥¼ ì¦�가시키기ë�„ 합니다. ì�´ë””ì—„ì�´ë�¼ê³  반드시 옳ì�€ê²ƒì�€ 아닌듯ㅋㅋ - 서지혜
        • ì�´ë””ì—„ì�€ 가치 중립ì �ì�´ì§€. ì�´ë””ì—„ì�„ ìƒ�ê°�ì—†ì�´ ì �용하는 것ì�´ 나ì�œê²ƒì�´ê³ . - 김수경
          • 오늘 얘기하면서 깨달았다. ì�´ë””ì—„ì�´ 패턴보다 ë�” 습관ì �으로 ì �용하기가 쉬울테니(패턴ì�„ 몰ë�¼ë�„ ì�´ë””ì—„ì�€ 쓸수있ì�Œ) ì—­ìž�ê°€ 저런ë§�ì�„ ì“´ê±´ê°€ë´� - 서지혜

2.2. 디��패턴�란 무엇�가?

  • p.22
    • 먼저 패턴ì�€ 발명ë�˜ëŠ” 것ì�´ 아니ë�¼ 발견ë�˜ëŠ” 것ì�´ë�¼ëŠ” 사실ì�„ ì�´í•´í•´ì•¼ë§Œ 한다.
      • 패턴ì�´ 목ì �ì�´ 아니ë�¼ ì–´ë–¤ ì�˜ë�„를 구현하기 위해 만든 코드들ì—�서 비슷한 패턴ì�´ 발견ë�œë‹¤ê³  한다. - 서지혜
  • p.23
    • 그러므로 패턴ì�€ í•´ê²° 방법 ê·¸ ìž�ì²´ë�¼ê¸°ë³´ë‹¤ëŠ” í•´ê²° 방법ì�˜ ì�¼ë°˜ 구조ë�¼ í•  수 있다.
    • 패턴ì�€ ì–´ë–¤ 류ì�˜ 문제를 해결하기 위해 사용ë�˜ëŠ” ì�¼ë°˜ì �ì�¸ 기술ì�´ë‹¤.
    • 패턴ì�€ ì�´ì™€ ê°™ì�´ ì�¼ë°˜ì �ì�¸ í•´ê²° 방법ì�´ê¸° 때문ì—� 한 프로그램ì—�서 다른 프로그램으로 ë””ìž�ì�¸íŒ¨í„´ì�„ 복사해 붙여넣는 것ì�€ ê±°ì�˜ 불가능하다.
    • 그들ì�€ 패턴 ìž�체를 패턴ì�„ 설명하기 위해 사용한 코드와 혼ë�™í•˜ê³  있는 것ì�´ë‹¤.
      • ì�´ ì±…ì�„ 안ì�½ì—ˆë‹¤ë©´ 나ë�„ 패턴과 코드를 혼ë�™í•˜ëŠ” 실수를 í–ˆì�„것같다.. 사람들ì�€ 처ì�Œ 배운것ì�„ 진리ë�¼ 여기는 경향ì�´ 있고 비íŒ�하기ë�„ 사랑하니까. "패턴ì�€ 그게아ëƒ�!! ì�´ê±°ë�¼ê³ !!" - 서지혜
  • p.24
    • 현실ì—�서는 한 패턴ì—� 참여하고 있는 ê°�체와 í�´ëž˜ìŠ¤ê°€ ë�™ì‹œì—� 다른 패턴ì—�서ë�„ 사용ë�˜ëŠ” 경우가 매우 많다.
    • 패턴ì—� 입문한 ì§€ 얼마 안 ë�˜ëŠ” 초보ìž�ì�¼ìˆ˜ë¡� 무언가 ë©‹ì ¸ ë³´ì�´ëŠ” í�´ëž˜ìФ 다ì�´ì–´ê·¸ëž¨ì—� 관심ì�„ ì�ŸëŠ”ë�°, ë�”ìš± 중요한 것ì�€ '패턴ì�˜ ì�˜ë�„'(혹ì�€ 목ì �)와 'ë�™ì �ì�¸ í–‰ë�™ì–‘ì‹�'ì�´ë‹¤.
      • 'ë�™ì �ì�¸ í–‰ë�™ì–‘ì‹�'ì�´ 무엇ì�¸ì§€ 잘 ê°�ì�´ 오지 않네요. - 김수경
        • 'ë�™ì �ì�¸ í–‰ë�™ì–‘ì‹�'ì�€ 패턴ì�„ 통한 목ì � 달성ì—� ì�´ë£¨ê¸°ê¹Œì§€ í��름ì�´ 어떻게 ì�´ë£¨ì–´ì§€ëŠ”ì§€ì—� 대한것 같아 -김준ì„�
        • ì €ìž�ê°€ ì •ì �구조가 아닌 ë�™ì � í–‰ë�™ì–‘ì‹�ì—� ì‹ ê²½ì�„ ì�¨ë�¼ë�¼ê³  ë§�하는거 보니 실행시간ì—� ì�¼ì–´ë‚˜ëŠ” ì–´ë–¤ 변화같ì�€ë�°.. - 서지혜
        • ê°�체들ì�˜ ìƒ�호작용ì�„ ë�™ì � í–‰ë�™ ì–‘ì‹�ì�´ë�¼ 하는듯 - 서지혜
    • 시ì›�하면서ë�„ 안ë�½í•œ ëŠ�낌ì�„ 주는 방들ì�„ 살펴보면 앞으로 'êµ�ì°¨ 통í’�'ì�´ë�¼ 부를 패턴ì�´ 창발한다.
      • ê°•ì�˜ì‹¤ì—�서 공대 냄새가 나는 ì�´ìœ ë¥¼ 알았습니다. ê°•ì�˜ì‹¤ì�€ 'êµ�ì°¨ 통í’�' 패턴ì—� ì†�하지 않아요. - 김수경
        • 하긴 시ì›�하면서ë�„ 안ë�½í•˜ì§€ 않ì�€ê²Œ 공대 ê°•ì�˜ì‹¤ì�´ì§€ - 김준ì„�
          • 시ì›�하지ë�„ 않ì�€ë�°.. ê·¼ë�° ì–´ì œ 핸드í�° 찾으러 êµ�양학관같는ë�° 거기는 ë�” 심하ë�”ë�¼..ìš°ì—‘ 냄새나는 찜질방ì�´ì—ˆì�Œ - 서지혜
    • ì�´ ì�˜ë�„를 만족시킨다면 ì–´ë–¤ 구조든 ì�´ 패턴ì�˜ 합당한 실체화가 ë�œë‹¤.
  • p.25
    • 패턴ì�˜ 실체화는 ë””ìž�ì�¸ì�´ì§€ 코드가 아니며, 하나ì�˜ ë””ìž�ì�¸ì�€ 여러 가지 합당한 방법으로 구현할 수 있다.
    • 패턴ì�˜ 실체화 ë°©ì‹�ì�€ 다양하지만 여러분ì�´ 좋아하는 요소만 ì�™ 뽑아 사용할 수는 없다.
  • p.26
    • 남서쪽 ì°½ì�€ ë‘� ê°œì�˜ 패턴 모ë‘�ì—� 참여하고 있다는 ì �ì—�서 í�¥ë¯¸ë¡­ë‹¤.
  • p.27
    • 중요한 것ì�€ 구조를 통해서만 패턴ì�„ 파악하는 것ì�´ 불가능하다는 사실ì�„ ì�´í•´í•˜ëŠ” 것ì�´ë‹¤.
    • 패턴ì�„ 찾아내려면 아키í…�처ì�˜ ì�˜ë�„를 í�¬í•¨í•œ 문맥 ì •ë³´ê°€ 필요하다.
    • ìƒ�ê°� ì—†ì�´ 패턴ì�„ 복사하고 붙여넣는 것ì�€ 마ì�ŒëŒ€ë¡œ 낙서를 한 ë’¤ ë©‹ì§„ 그림ì�„ 주장하는 것과 ê°™ì�€ 우매한 것ì�´ë‹¤.
      • 나ë�„ ì�´ëŸ°ì �ì�´ 있었지 패턴ì�„ 쓴다고 다 좋아지는게 아니니까 - 김준ì„�
      • 피카소가 ìƒ�ê°�난다 - 서지혜
    • 패턴ì�€ ë””ìž�ì�¸ìœ¼ë¡œ 실체화 ë�˜ê³  ë””ìž�ì�¸ì�€ 구현으로 실체화 ë�œë‹¤.
      • 구현ì�€ ì¶”ìƒ�í™” 시켜 ë””ìž�ì�¸ì�´ë�˜ê³  그것ì�„ ì¶”ìƒ�화시켜서 패턴ì�´ë�œë‹¤ - 김준ì„�

2.3. 패턴, 무엇� 좋�가?

  • p.28
    • 즉 패턴ì�„ 사용하지 않고 설명하는 것보다 훨씬 ì§§ê³  훨씬 명확했다.
  • p.29
    • 패턴ì�€ 커뮤니케ì�´ì…˜ì�„ ê·¹ì �으로 í–¥ìƒ�시켜주는 유기ì � 프레임워í�¬ë¥¼ 제공하며 ê²°êµ­ ì�´ê²ƒì�´ ë””ìž�ì�¸ì�˜ 모든 것ì�´ë‹¤.
      • 하지만 커뮤니케ì�´ì…˜ì�˜ 당사ìž�들ì�´ 모ë‘� 패턴ì�„ 알고있다는 ì „ì œ 하ì—� 가능한 ì�¼. - 김수경

2.4. 디���서 패턴� 역할

  • p.29
    • 패턴ì�€ 구현ì—� 대해 ìƒ�ê°�하기 시작할 때 등장하게 ë�œë‹¤.
    • ê±´ì• ê³„íš�ì�€ 모든 ì•ì¡° 새부 사항ì�„ 설명하지는 않는다. 즉 ì–´ë””ì—� ë²½ì�´ 있어야 할지를 보여줄 ë¿� ë²½ì�„ 어떨게 만들어야 하는지ì—� 대해 설명하지는 않는 것ì�´ë‹¤.
  • p.30
    • ë””ìž�ì�¸ 패턴ì�€ 보통 ë””ìž�ì�¸ 문서ì—� ìƒ�세히 나타나지는 않으며 구현하는 사람ì�´ 내리는 ê²°ì •ì�„ 나타내 준다.
    • 구현ì�€ 스스로 ë§�í•  ë¿�ì�´ë‹¤.

2.4.1. 패턴과 단순함 사�� 긴장

  • p.30
    • '우둔한 프로그래머와 아키í…�처'는 패턴ì�´ í•­ìƒ� 좋ì�€ 것ì�´ë©° 가능한 모든 ê³³ì—�서 사용해야 한다고 ì�¼ê´€ë�˜ê²Œ 믿는다.
  • p.31
    • 프로그래머들ì�€ 미래ì—� 등장할지ë�„ 모를 요구 사항까지ë�„ 추가하는 경향ì�´ 있다.
    • 미래ì—� 변화ë�  것ì�´ë�¼ ìƒ�ê°�하기 때문ì—� 코드를 복잡하게 하는 것ì�€ 좋ì�€ ìƒ�ê°�ì�´ 아니다.(ì �ì–´ë�„ ë‚´ 경우는 미래를 예측하려 할때마다 ë‚´ 예ìƒ�ì�´ 빗나갔다.)
    • 요구ë�˜ëŠ” 기능ì�„ 삭제하는 것ì�€ 불필요한 기능ì�„ 추가하는 것만í�¼ 나ì�˜ë‹¤.
      • 요구ë�˜ëŠ” 기능ì�„ 왜 삭제하는가? 요구ë�˜ëŠ” 기능ì�„ 구현하는게 우리 ì�¼ 아닌가? -ìž„ìƒ�현
        • 요구 기능ì�„ 구현하는게 어렵다며 맘대로 다른거 ë¶™ì�´ëŠ” 사람ë�„있ì�Œ.. 예를들면 파ì�¼ì�„ 삭제할때 복구기능ì�„ 만들기 싫어서 확ì�¸ 다ì�´ì–¼ë¡œê·¸ë¥¼ ë�„ìš°ì§€.. - 서지혜
          • 그리고는 구현하고 나서는 스스로 ë‚©ë“�ì�„ 하게 ë�©ë‹ˆë‹¤. 'ì�´ëŸ¬ì�´ëŸ¬í•˜ê²Œ 하는게 ë�” 좋ì�€ 사용ìž� 경험ì�„ 제공할 수 있ì�„거야.' 는 무슨 -_-; - 박성현
        • 구현ì�€ 복잡한ë�° ë�ˆì�„ 조금 준다면 삭제해버리겠지. - 김수경
    • 프로그래머는 지금 앞으로 어떻게 ë� ì§€ 모를 기능ì�„ 추가하는 것ì�´ 아니ë�¼ 새로운 기능ì�„ 추가하거나 기존ì�˜ 것ì�„ 수정하기 쉽ë�„ë¡� 프로그램ì�„ 작성해야 하는 것ì�´ë‹¤.
    • 우리는 필요로 하는 바로 그것ì�„ 해야한다.
    • 사용ìž�ê°€ 무언가를 ì •ë§�로 하고 ì‹ì–´í•œë‹¤ë©´ ì�´ì—� 대해 질문하지 ë§�아야 한다고 주장한다.
      • 확실히 근근히 나오는 확ì�¸ íŒ�ì—…ì°½ ê²�나 귀찮습니다. -ìž„ìƒ�현
      • 실수했다 ìƒ�ê°�ë�˜ë©´ ë�˜ë�Œë¦´ 수 있ë�„ë¡� 만들어 줘ë�¼. 그래서 휴지통ì�€ 편하지. 절대 ì˜�구삭제 하면 안ë�¼ - 서지혜
  • p.32
    • 단순함 , 완전성 그리고 수정ì�˜ ìš©ì�´ì„±ì�´ëž€ 세가지 요구 사항ì�€ ìƒ�ì¶©ë�˜ê¸°ë�„ 한다.
    • ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” 패턴 전체를 ë�„입하는 것과는 달리 그다지 복잡성ì�„ ì¦�가시키지 않는다. 반면 기능 변경ì�´ë‚˜ 추가 시 리팩토ë§�ì�´ 쉬워진다.

2.5. 패턴 분류하기

  • p.32
    • 패턴ì�„ 분류하는 것ì�€ 필요한 ìƒ�황ì—�서 ì �절한 패턴ì�„ ì„ íƒ�하는 것ì�„ ìš©ì�´í•˜ê²Œ 해준다는 ì �ì—�서 유용하다.
  • p.34
    • 패턴들ì�´ 서로 ì�˜ì¡´í•˜ê³  있다는 사실ì�„ ì�´í•´í•˜ëŠ” 것ë�„ 중요하다.
    • 여러 패턴들ì�´ 서로 관련ì�´ 있으며 실제 프로그래ë°�í•  때는 ì�´ë“¤ì�„ 엮어 함께 사용하는 경우가 많다는 사실만 명심하면 ë�œë‹¤.
  • p.34
    • 패턴 ê°„ì�˜ 연관성 ì�˜ì¡´ì„± 때문ì—� 한 패턴ì�„ 다른 패턴과 구분하기 어려울 수ë�„ 있다. ì�´ëŸ´ 경우ì—�는 ì •ì � 구조 대신 패턴ì�˜ ì�˜ë�„ì—� ì´ˆì �ì�„ 맞추기 바란다.

2.5.1. 디�� �반

  • p.35
    • ê°�ì²´ 지향 ë””ìž�ì�¸(OOD)ê³¼ ê°�ì²´ 지향 프로그래ë°�(OOP)ì�€ 매우 다른것ì�´ë‹¤.
    • ë””ìž�ì�¸ 프로세스는 유스케ì�´ìФ ë¶„ì„�등ì�„ 통한 요수사항 수집ì—�서 시작해 코딩ì�´ 시작ë�˜ëŠ” ë””ìž�ì�¸ìœ¼ë¡œ ë��나게 ë�œë‹¤.
    • 프로그래ë°� 프로세스는 ë””ìž�ì�¸ì—�서 시작하며 ìƒ�ì†�, 캡ìŠ�í™”, ë””ìž�ì�¸ 패턴 등ì�„ ì�´ìš©í•˜ê³  ë””ìž�ì�€ì�˜ 실체ì�¸ 컴퓨터 프로그램ì�„ 내놓는다.
    • ì�´ì™€ê°™ì�€ 기술ì�˜ 융합ì�€ ì• ìž�ì�¼(Agile) 방법론ì—�서 특히 중요한ë�° ë””ìž�ì�¸ê³¼ 코딩ì�´ 병렬ì �으로 ì§„í–‰ë�˜ê¸° 때문ì�´ë‹¤.
      • ì• ìž�ì�¼ì�„ 하려면 ë””ìž�ì�¸, 코딩ì�„ 둘다 할줄 알아야 하나.. - 서지혜
    • ì–´ë–¤ ì• ìž�ì�¼ 방법론ë�„ 춤추는 ê¼­ë‘�ê°�시 프로그래머와 ì�´ë¥¼ 조종하는 아키í…�트란 ë�„ì‹�ì�„ 지지하지 않는다.
      • YES맨ì�´ ë�˜ì§€ ë§�ì•„ë�¼ëŠ” ê±´ê°€? - 서지혜
        • 프로그래머ë�„ 아키í…�ì³�를 ì�´í•´í•´ì•¼í•œë‹¤ëŠ” 것 ì•„ë‹�까? - 김수경
          • 아하, ìž�기가 ì–´ë””ì�˜ ë­�를 하는지는 알아야 한다는 뜻? - 서지혜

2.5.2. �바를 C언어 스타�로 프로그래�하기

  • p.37
    • 절차 지향 프로그래ë°�ì�€ ë�°ì�´í„°ë¥¼ ì¡°ìž‘ 혹ì�€ 검토하는 서브루틴 ê°„ì�˜ ë�°ì�´í„° í��름ì�„ 구조화 한다.
    • 사실 ë§Žì�€ 절차 지향ì � 프로그램ì�€ 사용ìž� ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 통해 ë�°ì�´í„°ë² ì�´ìФ í…Œì�´ë¸”ì�„ 보여주는 ì—­í• ì�„ í•  ë¿�ì�´ë‹¤.
    • ê°�ì²´ 지향 시스템ì�€ ìƒ�호 협ë�™í•˜ëŠ” ì—�ì�´ì „트들ì�˜ 네트워í�¬ì�´ë©°, ì—�ì�´ì „트는 메시지를 통해 통신한다.
    • ê°�ì²´ 지향 시스템과 절차 지향 시스템ì�„ 구분하는 한가지 좋ì�€ 방법ì�€ 무언가를 변화시킬 때 ì–´ë–¤ì�¼ì�´ ë°œìƒ�하는가를 보는 것ì�´ë‹¤.
      • 설계할 때 ì�´ê²ƒì�„ 미리 ìƒ�ìƒ�í•´ë³´ë©´ ë�„움ì�´ ë�˜ëŠ” 것 같아요. 과연 ë‚´ê°€ ì�´ë ‡ê²Œ 짜면 ì�´ëŸ° 변경ì�´ ìƒ�길 때 어떻게 ë� ê¹Œ? - 김수경
    • 절차 지향 시스템ì—�서는 변화가 프로그램ì�˜ 나머지ì—� 'í�¼ì ¸ë‚˜ê°€ëŠ”'경향ì�´ 있다.
    • ê°�ì²´ 지향 시스템ì—�서는 변화가 한곳ì—� 집중ë�˜ëŠ” 경향ì�´ 있다.
  • p.39
    • ë‚´ê°€ MFCê°€ ìƒ�당 부분 ê°�ì²´ ìž�í–¥ì �ì�´ì§€ 않다는 ì�´ì•¼ê¸°ë¥¼ 하ìž� ê·¸ì�˜ 대답ì�€ ìž�ì‹ ë�„ 알고 있다는 것 ì�´ì—ˆë‹¤.
      • ë‚´ê°€ MFCê°€ ê°�ì²´ 지향ì �ì�´ì§€ 않다고 ë§�í–ˆì�„때 ìƒ�대는 MFC야ë§�로 ê°�체지향ì �ì�´ë‹¤ ë�¼ê³  í–ˆë�˜ 것 같다. - 서지혜
  • p.40
    • 절차 지향ì � í•´ê²° 방법ì�´ 본질ì �으로 나ì�œ 것ì�€ 아니다. 하지만 ì„ íƒ�ì�„ í•  때는 ì�´ ì„ íƒ�ì—� 따르는 위험까지 고려해 보기 바란다.

2.5.3. 열린 눈으로 프로그래�하기

  • p.40
    • ë””ìž�ì�¸ì�€ ì„ íƒ�ê³¼ 트레ì�´ë“œ 오프, 리스í�¬ 관리ì�˜ ì—°ì†�ì�´ë‹¤.
      • ì–´ë–¤ ë””ìž�ì�€ì�„ ì„ íƒ�í•  때는 ì„ íƒ�으로 ì�¸í•œ 장단ì �ì�„ ê³ ë ¤(트레ì�´ë“œ 오프)해야 한다. 그리고 그것ì�„ 취한뒤ì—�는 그로ì�¸í•´ 잃ì�€ 것ì�„ ê°�내해야한다(리스í�¬ 관리) ì�´ê²Œ 맞나? - 서지혜
    • ìž�ì‹ ì�´ 하고 있는 ì�¼ì�´ ì–´ë–¤ 결과를 초래할지를 알지 못한다면 ì�´ëŠ” ë””ìž�ì�¸ì�„ 하고 있는 것ì�´ 아니ë�¼ ì–´ë‘  ì†�ì—�서 비틀거리리고 있ì�„ ë¿�ì�´ë‹¤.
      • ë””ìž�ì�¸ì�´ 아닌 구현단계ì—�서ë�„ ì�´ëŸ¬í•œ ìƒ�황ì�„ "ìš°ì—°ì—� ì�˜í•œ 프로그래ë°�"ì�´ë�¼ê³  설명ì�„ 하ë�”ë�¼ê³ ìš”. 그리고 대부분ì�˜ 개발ìž�는 "ìš°ì—°ì—� ì�˜í•œ 프로그래ë°�"ì�„ 하고 있다고... 실용주ì�˜ 프로그래머ì—�서 본 기억ì�´ 있네요..? - 박성현
        • faith codingê³¼ë�„ ìƒ�통하는 ë§�ì�¸ê°€ã…‹ã…‹ - 서지혜
  • p.41
    • ì–´ë–¤ 언어ì�˜ 기능 혹ì�€ ì�´ë””ì—„ì�´ 초래할 수 있는 í��해를 ì�´í•´í•˜ë©´ 해당 기능과 ì�´ë””ì—„ì�„ 사용하는 것ì�´ ì �절한지 아닌지 좀 ë�” 현명하게 ê²°ì •í•  수 있다.

2.6. �체란 무엇�가?

2.6.1. 허튼소리!

  • p.42
  • ìš°ì„  OO 시스템ì�„ 지능 있는 ë�™ë¬¼(ê°�ì²´)ì�˜ 모임ì�´ë�¼ ìƒ�ê°�하ìž�.
  • OO ë””ìž�ì�¸ì—�서 가장 중요한 ì›�리는 ë�°ì�´í„° ì¶”ìƒ�í™”ì�´ë‹¤.
  • "ê°�체는 메소드ë�¼ 불리는 함수가 있는 ìž�료 구조ì�´ë©° 메소드가 ìž�료 구조를 조작한다."ë�¼ëŠ” 설명ì�„ 보았ì�„ì§€ë�„ 모르겠다. 허튼소리! 당치 않다.
    • 봉봉 ìƒ�ê°�나! 봉봉ë�„ 그책ì�„ ì�½ì�€ê²Œ ì•„ë‹�까?- 김준ì„�
    • 나ë�„ ê°�체지향ì�€ ì–´ë–¤ 작업ì—� 대한 ë�°ì�´í„°ì™€ 메소드를 ê°�ì²´ê°€ 가지고 있는 것ì�´ë�¼ê³  ìƒ�ê°�í–ˆì�Œ!! - 서지혜
    • ì�´ëŸ¬í•œ ì°©ê°�ì�€ í�”히 C를 ë°°ìš°ê³  C++ì�„ 배울 때, 'ê°�ì²´'ê°€ 아닌 문법 í�´ëž˜ìФ'를 쉽게 설명하려고 "í�´ëž˜ìŠ¤ëŠ” structure(data) + method(to do) ì�´ë‹¤." ë�¼ëŠ” ìš”ìƒ�한 설명ì�„ 접하게 ë�˜ë©´ 하게 ë�˜ëŠ” 것 같습니다. 처ì�Œì—� ì�´ëŸ° 설명ì�„ 접하게 ë�˜ë©´ 나중ì—�는 ìƒ�ê°�ì�„ 바꾸기 어려워지죠 (아니 귀찮아지는 ê±´ê°€...) -_-;; - 박성현
      • 정답. í�´ëž˜ìŠ¤ëŠ” 구조체+메소드ì—�ìš” ë�¼ëŠ” 설명ì�„ 열혈강ì�˜ c++ì—�서 본듯..? - 서지혜
    • 2학년ë•� 나ë�„ 저렇게 ìƒ�ê°�했다ㅜㅜㅜ Spring/íƒ�험스터디ì—�서ë�„ 얘기했지만 그래서 ê°�체지향설계ë�¼ë©´ 메소드만 있는 í�´ëž˜ìŠ¤ëŠ” 존재해선 안ë�œë‹¤ê³  ë§�한 ì �ë�„ 있ì�Œã…œã…œã…œã…œ ë¶€ë�„럽다... - 김수경

2.6.2. �체는 기능� 집합�다

  • p.43
    • OOì�˜ ì œ 1 지령.
      �체� 어떤 작업� 하는 � 필요한 정보를 요청하지 ��. 대신 작업� 하는 � 필요한 ��터를 갖고 있는 �체� �� 해달�고 요청하�.
    • 켄 아놀드는 다ì�Œê³¼ ê°™ì�´ ë§�한다. "ì •ë³´ê°€ 아닌 ë�„움ì�„ 요청하ë�¼(Ask for help, not for information)."
      • ì�´ê±´ 굉장한 ê°œë…�ì�´ì•¼!!! 너! ì�¼í•´! -김준ì„�
      • ë�„움ì�„ 요청하ë�¼ëŠ” ë§�ì�„ 보니 ë§Œê°�ì²´(-_-;;)는 í�‰ë“±í•˜ë‹¤ëŠ” ë§�ì�´ ìƒ�ê°�나는군 - 서지혜
    • 중요한 것ì�€ ì›�리ì�´ì§€ 사용하고 있는 언어가 아니다.
      • ìž�바가 ê°�체지향 프로그램ì�„ 줄거ë�¼ ìƒ�ê°�하지마!! - 서지혜
      • ì�´ê±´ 6피ì�˜ 중심ì—�서 외치고 ì‹ì�€ ë§�. ë§Žì�€ 후배들ì�´ ì�´ëŸ° 질문ì�„ 한다. C로는 ê°�체지향 못하는거 아니ì—�ì—¬? ;;;;;;; 혹ì�€ OOP로 짜고있어요 ㅋ해서 ë³´ë©´ ìž�바로 짠다는 것 외엔 ë�„대체 ê°�체지향ì�˜ ì›�리가 ì–´ë””ì—� 녹아있는지 알 수 없는 코드ë�¼ê±°ë‚˜... í�´ëž˜ìФ ì“°ë©´ 다 OOëƒ�ㅜㅜ 그렇게 간단하면 í•™êµ�ì—�서 왜 한학기나 할애해서 ë°°ìš°ê² ì–´. - 김수경
        • 한학기를 í• ì• í•´ë�„ 못 가르치고 못배우니 저렇게 ì“°ê² ì§€ - 서지혜

2.6.3. 어떻게 잘못하고 있는가?

  • p.45
    • OO는 컴퓨터 프로그램ì—� 내재하는 피할 수 없는 복잡성ì�„ ì¡°ì§�í™” 하는 것ì�´ì§€, 복잡성 ìž�체를 제거하는 것ì�´ 아니다.
    • ì�´ëŸ¬í•œ 룰ì�„ 따르면 문제ì �ì�„ 고치거나 새로운 기능ì�„ 추가함으로ì�¨ ë°œìƒ�하는 변화가 한곳ì—� 집중ë�œë‹¤. ì�´ë•Œ 유지 보수가 ìš©ì�´í•˜ë‹¤ëŠ” 것과 복잡하지 않다는 것ì�„ 혼ë�™í•˜ì§€ ë§�기 바란다.
  • p.48
    • 잘못ë�œ 마ì�¸ë“œë¥¼ 가진 프로그래머는 모든 언어를 ì�´ìš©í•´ì„œ 쓰레기 코드를 작성해 내는 마법ì�„ 부릴 수 있다.

2.6.4. 어떻게 '올바르게' 할 수 있는가?

  • p.48
    • 리ë�¼(lira)를 통화로 사용하ë�˜ ì�´íƒˆë¦¬ì•„ê°€ 유럽ì�˜ 단ì�¼ 통화ì�¸ 유로(euro)를 사용하게 ë�˜ë©´ì„œ 겪었ë�˜ 고통ì�„ ìƒ�ìƒ�í•´ ë³´ìž�
      • 무슨ì�¼ì�´ 있었지?? ê¶�금하다 - 서지혜
    • 만약 빌 게ì�´ì¸ ê°€ ì�€í–‰ì—� 걸어들어와 계좌를 개설한 ë’¤ ê·¸ì�˜ 모든 재산ì�„ 예금하겠다고 하면 어떻게 ë� ê¹Œ? 여러분ì�´ ì�€í–‰ ì§€ì �장ì�´ë�¼ë©´ 절대 빌ì�´ëž€ ê³ ê°�ì�„ 놓치고 ì‹ì§€ 않ì�„ 것ì�´ë‹¤.

2.7. 셀룰러 오토마타


  • p.52
    • 셀룰러 오토마타(Cellular automata)ì�˜ 프로그램 구현ì�€ OO 시스템ì�˜ 훌륭한 예가 ë�œë‹¤. 셀룰러 오토마타 프로그램ì�€ 복잡한 문제를 정확히 ê°�ì²´ 지향ì �ì�¸ ë°©ì‹�으로 해결한다.
      • ì�´ëŸ° í��름ì�„ 만들수 있어야하는ë�°.. - 김준ì„�
    • êµ�통 í��름ì�„ 예측하는 것ì�€ 카오스 ì�´ë¡ ì�´ 해결하려는 유명한 문제ì�´ë©°,, ê·¸ í•´ê²°ì�€ 매우 어렵다. ì�´ë•Œ 시뮬레ì�´ì…˜ 모ë�¸ì�˜ 행위ì—� 기반하여 예측할 수 있다는 가정ì�„ 한다면 êµ�통 í��름ì�„ 모ë�¸ë§�, 시뮬레ì�´ì…˜í•˜ëŠ”ê²ƒì�´ 유용할 것ì�´ë‹¤.
  • p.54
    • 모든 OO 시스템과 마찬가지로 ì�´ëŸ¬í•œ 종류ì�˜ 룰ì�€ 주변 코드ì—� ì˜�í–¥ì�„ 미치지 않으면서ë�„ 바뀔수 있다.

  • p.55
    • ì–´ë–¤ ê°�체는 ìž�ì‹ ì�´ í�¬í•¨í•˜ê³  있는 ê°�ì²´ì—� 해당 ê°�ì²´ê°€ 필요로 하는 외부 정보를 넘겨줌으로ì�¨ 문제를 해결한다. 즉 위임ì�„ 통해 문제를 해결한다. 메시지가 위임하는 ê°�체로 전달ë�˜ì–´ 갈수ë¡� 추가ì �ì�¸ ì�¸ìž�를 í�¬í•¨í•˜ëŠ” 경향ì�´ 있다.
    • 좋ì�€ í�´ëž˜ìŠ¤ëŠ” getter와 setter메소드를 ê°–ì§€ 않는ë�°, ì�´ëŸ° 메소드는 구현 ìƒ�세를 ë…¸ìœì‹œí‚¤ê¸° 때문ì—� ê²°ê³¼ì �으로 유지 보수를 어렵게 만들기 때문ì�´ë‹¤. 예를 들어 getter 메소드ì�˜ 리턴 타입ì�´ 바뀌게 ë�˜ë©´ getter를 ì •ì�˜í•˜ëŠ” ê°�ì²´ë¿� 아니ë�¼ 'getter'를 호ìœí•˜ëŠ” 모든 코드 ë˜�한 바꾸어 주어야 한다. 잠시 후ì—� getter와 setter 메소드 ì—†ì�´ 시스템ì�„ ë””ìž�ì�¸í•˜ëŠ” 방법ì—� 대해 설명할 것ì�´ë‹¤. 기대해ë�„ 좋다.

  • p.56
    • ë³´ë�¼ê³ ! 차들ì�´ ë�„시 안ì�„ ë�Œì•„다니잖아!!

2.8. 접근 메소드와 수정 메소드는 나�다


  • p.57
    • ì�´ ë§�ì�´ 메소드가 ê°’ì�„ 반화하면 안 ë�œë‹¤ê±°ë‚˜ 'get'혹ì�€ 'set'기능ì�´ 언제나 ë¶€ì �절하다는 것ì�€ 아니다. ê°�체는 때때로 시스템 ì „ë°˜ì�„ í�˜ëŸ¬ë‹¤ë‹ˆë©° 작업ì�„ 수행하ë�„ë¡� ë�„와주어야 한다. 하지만 ë§Žì�€ 경우 get/set 메소드는 private 필드를 접근하는 ìš©ë�„로만 ë¶€ì �절하게 사용ë�˜ë©°, ì�´ëŸ° 사용ì�´ ë§Žì�€ 문제를 ë°œìƒ�시킨다.
  • p.58
    • 유지 보수성ì�˜ 최대 ì � 중 하나ì�¸ 중복 코드를 작성해야 한다.

  • p.60
    • ì�´ë¯¸ ë�°ì�´í„°ë¥¼ ê°–ê³  있는 ê°�ì²´ê°€ ì�¼ì�„ 하게 하는것ì�€ 어떨까? 다시 ë§�í•´ ì‹ ì�˜ í�´ëž˜ìФì—�서 ì ‘ê·¼ 메소드를 통해 가져온 ë�°ì�´í„°ë¥¼ ê°–ê³  ì–´ë–¤ 작업ì�„ 하는 코드를 ì�´ ë�°ì�´í„°ë¥¼ 저장하고 있는 ê°�체로 옮기면 어떨까? ì ‘ê·¼ 메소드는 사ë�¼ì§€ê³  코드는 단순해진다.
    • 아무 ìƒ�ê°� ì—†ì�´ ì ‘ê·¼ 메소드와 수정 메소드를 사용하는 것ì�€ public 필드를 사용하는 것ì�´ 위험한 것과 ê°™ì�€ ì�´ìœ ë¡œ 똑같ì�´ 위험하다.
      • ìƒ�ê°�해보니 get, setì�´ëž‘ publicì�´ëž‘ 다를게없다.. - 서지혜
  • 구현ì�€ë‹‰ì�´ë�¼ëŠ” ì›�리는 ê°�ì²´ 지향 시스템ì�˜ 품질ì�„ í�‰ê°€í•˜ëŠ” 좋ì�€ 지표가 ë�œë‹¤. í�´ëž˜ìФì�˜ 구현ì�„ 마ì�ŒëŒ€ë¡œ 바꾸어ë�„, 심지어 기존 í�´ëž˜ìŠ¤ë¥¼ 버리고 새로운 í�´ëž˜ìŠ¤ë¥¼ 작성하ë�”ë�¼ë�„ ì�´ë¥¼ 사용하는 ê°�ì²´ì�˜ 코드ì—�는 ì˜�í–¥ì�„ 미치지 않ì�„ 수 있는가?
  • 만약 구현 ì�€ë‹‰ì�„ 하지 않는다면 다른 OO기능ì�„ 사용하는 것ì�´ í�° ì�˜ë¯¸ê°€ 없게ë�œë‹¤.

  • p 62
    • ì�´ëŸ¬í•œ '추측ì—� ì�˜í•œ ë””ìž�ì�¸í•˜ê¸°'ì „ëžµì�€ 사용하지ë�„ 않는 메소드를 작성하는ë�°, 즉 필요치 않ì�€ 기능ì�„ í�´ëž˜ìФì—� 추가하는 ë�° 불필요한 시간ì�„ 낭비하게 한다.
      • ì�Œ? ë””ìž�ì�´ë„ˆë“¤ì�˜ ìƒ�ìƒ� ë””ìž�ì�¸ì�¸ê°€? - 서지혜

2.8.1. 스스로를 표현하�


  • p.62
    • ë‚´ê°€ 실제로는 비지니스 로ì§�ì—� ì–´ë–¤ UI 코드로 삽입하지 않았다는 사실ì�„ 기억하기 바란다.

2.8.2. �바빈즈와 스트럿츠


  • p63
    • 불행히ë�„ 아무ë�„ ì�´ëŸ¬í•œ getter/setter를 ì�´ëŸ° ì�˜ë�„대로 사용하지 않았다.

2.8.3. 리팩토�


  • p65
    • ì�´í�´ë¦½ìŠ¤ëŠ” 현재 프로ì �트ì�˜ 범위ì—�서만 리팩토ë§�í•´ 준다.
    • ë‘�번째로, ìž�ë�™í™”ë�œ 리팩토ë§�ì�€ 단순한 작업ì—�는 매우 휼륭하게 ë�™ìž‘하지만 í�° 변화ì—�는 그렇지 못하다.
    • 코드가 올바른 ë°©ì‹�으로 구조화ë�˜ì§€ 않았기 때문ì—� 유지 보수가 í•„ìš” ì�´ìƒ�으로 어렵다는 것ì�´ë‹¤. ì�´ëŸ° 경우 리팩토ë§�ì�´ 아닌 프로그램ì�˜ 재디ìž�ì�¸ì�´ 필요하다.

2.8.4. get/set 없는 삶

  • p 67
    • CRC카드를 통한 첫 번째 시ë�„는 '어림 잡기'ì�¼ ë¿�ì�´ë‹¤.
  • p68
    • ì–´ë–¤ 사람들ì�€ ì�´ëŸ¬í•œ ë°©ì‹�으로 CRC카드를 ì�´ìš©í•´ 실제 프로그램까지ë�„ ë””ìž�ì�¸í•˜ì§€ë§Œ ì�´ ë°©ì‹�ì�€ 복잡한 대규모 프로그램까지 수용할 ì •ë�„로 효율ì �ì�´ì§€ëŠ” 않다. 대부분ì�˜ 프로그래머는 ì •ì‹� 프로세스를 사용하여 UML로 ë�™ì � 모ë�¸ê³¼ ì •ì � 모ë�¸ì�„ 개발한다.
    • 모ë�¸ë§�ì�€ ë‚´ê°€ 마지막 경험 법칙ì—�서 언급했듯ì�´ 가능한 '문제 ë�„ë©”ì�¸'안ì—� 머물러 있어야 한다. 하지만 ë§Žì�€ 개발ìž�들ì�´ ìž�ì‹ ì�€ 문제 ë�„ë©”ì�¸ì�„ 모ë�¸ë§�하고 있다고 ìƒ�ê°�하지만 실제로는 구현 레벨ì—�서 모ë�¸ë§�ì�„ 한다.

2.8.5. 언제 getter와 setter를 사용해� 괜찮�가?


  • p69
    • ë�°ì�´í„°ë¥¼ '꺼내는(pull)'것보다는 '넣는(push)'것ì�´ 보다 좋다.
    • 'ì–´ë–¤ ìš©ë�„로 사용ë� ì§€ë¥¼ 모ë‘� 예측할 수 없어'와 ê°™ì�€ 문제는 ìž�ë°” 패키지 ì „ë°˜ì—� í�¼ì ¸ 있다. ì�´ëŸ° 경우 ì�´ë¯¸ ë§�했듯ì�´ ê°�ì²´ì—�서 모든 getter와 setter를 제거할 수 없다.

2.8.6. getter/setter �슈 정리


3. �터페�스로 프로그래�하기 그리고 몇 개� �성 패턴

  • 75p
    • ì�¸í„°íŽ˜ì�´ìФ ê´€ì �ì—�서 프로그래ë°� 하는 것ì�€ OO 시스템ì�˜ 기본 ê°œë…�ì�´ë©° GoF와 ë””ìž�ì�¸ 패턴ì�€ ì�´ì�˜ 구체ì �ì�´ 예가 ë�œë‹¤.
    • 하지만 ë§Žì�€ ìž�ë°” 프로그래머들ì�€ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ê±°ì�˜ 사용하지 않고 extends 관계를 남용하고 있다.

3.1. 왜 Extends가 나�가?

  • 75p
    • extends 키워드는 나ì�˜ë‹¤.
    • ... 명성 있는 ë””ìž�ì�´ë„ˆë�¼ë©´ 가능한 사용ì�„ ìž�제할 ì •ë�„로는 충분히 나ì�˜ë‹¤.
    • ... 혹시ë�¼ë�„ ë‚´ê°€ extends를 절대 사용하면 안 ë�œë‹¤ê³  주장하고 있다고 ìƒ�ê°�하지는 ë§�기 바란다.

    • ë””ìž�ì�¸ 패턴ì�€ í�¬ê²Œ ë³´ë©´ 구현 ìƒ�ì†�(extends)ì�„ ì�¸í„°íŽ˜ì�´ìФ ìƒ�ì†�(implements)으로 바꾸는 방법ì�„ 설명하고 있다.

  • 76p
    • "ë§Žì�€ 사람들ì�´ '우리 회사ì�˜ 제품ì�€ C++ì�„ ì�´ìš©í•´ 만들었기 때문ì—� ê°�ì²´ 지향ì �입니다' ë�¼ê³  설명했다는 CEOì—� 대한 ì�´ì•¼ê¸°ë¥¼ 한다. 그런ë�° ì�´ 중 ì–´ë–¤ ì�´ë“¤ì�€ ì�´ ì�´ì•¼ê¸°ê°€ ë†�ë‹´ì�´ëž€ 사실ì�„ 모르고 있다.
      • 재미있네요. 나는 mfc는 ê°�ì²´ 지향ì �ì�´ë‹¤ ë�¼ëŠ” ë§�ê³¼ 알수없는 í�´ëž˜ìŠ¤ë“¤ì�„ 만들어 놓고 ê°�체지향ì�´ë�¼ê³  한 ë§�ì�„ 들ì�€ì �ì�´ 있습니다. - 서지혜
    • ìž�ë°” 프로그래머들ì�€ 종종 extends와 ê°™ì�€ 언어ì�˜ 기능ì�„ ê°�ì²´ 지향 ìž�체와 혼ë�™í•˜ê³¤ 한다.
    • 다형성ì�´ëž€ ê°œë…�ì�€ OOì�˜ 고유한 특성ì�´ë©°, 다형성ì�„ 사용하지 않는 프로그램ì�€ ê°�ì²´ 지향ì �ì�´ì§€ 않다는 주장ì�€ 설ë“�력있다.
    • OO 시스템ì—�서는 ë�°ì�´í„° 캡ìŠ�화가 ì„ íƒ�ì�´ 아닌 필수ì�´ë‹¤.

  • 77p
    • extends와 implements ê°„ì�˜ 유사성ì�€ C++ 언어ì—�서는 명확하다. C++는 ì�´ 둘ì�„ 구분하지 않기 때문ì�´ë‹¤.
      • C++ì�„ ë°°ìš°ê³  ìž�바를 ë°°ìš°ë©´ ì�µìˆ™í•œ 구현 ìƒ�ì†�ì�„ ë§Žì�´ 사용하게 ë�˜ì§€. C++ì—�ë�„ ì�¸í„°íŽ˜ì�´ìФì�˜ ê°œë…�ì�´ 있지만 시작부터 구체 í�´ëž˜ìŠ¤ë¥¼ 만드는 습관때문ì—� ê±°ì�˜ ì“°ì§€ 않았었다. - 서지혜

3.2. �터페�스 vs. �래스

3.2.1. 유연성� �실

  • 77p
    • 구현 ìƒ�ì†�ì�´ ë�„대체 왜 나ì� ê¹Œ? 명시ì �으로 구체 í�´ëž˜ìФì�˜ ì�´ë¦„ì�„ 사용하면 특정 구현ì—� 종ì†�ë�˜ëŠ”ë�° ì�´ëŠ” ê²°ê³¼ì �으로 수정ì�„ í•„ìš” ì�´ìƒ�으로 어렵게 만든다.

  • 78p
    • ì• ìž�ì�¼ 방법론ì�´ 모든 프로ì �트ì—� 들어맞는 것ì�€ 아니지만, 개발 기간 ë�™ì•ˆ 요구 사항ì�˜ 변화가 있는 중소 규모 프로ì �트ì—�는 매우 효과ì �ì�´ë‹¤.
      • 중소규모 ë§�ê³  대규모 프로ì �트는 어떨까...? - 김준ì„�

    • ì• ìž�ì�¼ 병행 개발ì�˜ 중심ì—�는 유연성ì�´ëž€ ê°œë…�ì�´ 있다. 새로 추가ë�œ 요구 사항ì�„ 쉽게 ë°˜ì˜�í•  수 있는 코드를 만든다는 것ì�´ë‹¤. ë˜�한 아마ë�„ 필요할지ë�„ 모르는 기능ì�„ 구현하기보다는 ê¼­ 필요한 기능ì�„ 구현하ë�˜, 프로그램ì�€ 변화를 수용할 수 있어야 한다.
      • ì• ìž�ì�¼ì�´ëž€ 민첩하게 대ì�‘한다는 뜻ì�´ë‹¤. ì�´ëŸ° ì�˜ë¯¸ì—�서 ì• ìž�ì�¼ì�´ 변화를 수용할 수 있는 ê°�ì²´ 지향ì�„ 사용하는 것ì�´ 당연한듯하다. - 서지혜
    • ... 변화는 ì�´ëŸ° ì‹�으로 파급ë�œë‹¤.

3.2.2. 결합�

  • 80p
    • 예를 들면 ìƒ�수가 아닌 모든 필드는 í•­ìƒ� privateì�´ì–´ì•¼ 한다. ì •ë§�? 예외는 없다. 절대로!
    • protected ì�¸ìŠ¤í„´ìŠ¤ 변수는 ì •ë§� 역겹다. protected 변수는 publicì�„ ì�˜ë¯¸í•˜ëŠ” 다른 방법ì�¼ ë¿�ì�´ë‹¤.
      • 나는 구현 ìƒ�ì†�ì�„ 사용할 때 get/setì�„ 만드는 것ë�„ 귀찮아 protected를 ì�¼ì—ˆëŠ”ë�°, 마치 나ì—�게 하는 ë§� 같군. 기분ì�´ 안좋아진다... - 서지혜
  • p81
    • 나는 개발ì�„ 하면서 OO ì›�ì¹™ ì �ìš©ì�˜ '엄격성(strictness)'ê³¼ 코드를 빨리 작성하고 유지 보수하기 좋ì�€ 코드를 작성하는 것 사ì�´ì—� 높ì�€ ìƒ�관관계가 있다는 사실ì�„ 깨달았다.
      • ì–´ëŠ�ì •ë�„ ì�˜ì‹¬ê°€ëŠ” 부분ì�´ 있는경우는 ê¼­ ê³ ì³�야ë�˜ê²Œë�˜ë�”êµ° - 김준ì„�
      • 코딩하다가 ì–´ëŠ� 순간, ì�´ê±° 좀 잘못하고 있는거같ì�€ë�°.. 하는 순간ì�´ìžˆë‹¤. 그걸 ì• ì�¨ 무시하고 넘어갔는ë�° 토ì�´ 수준ì�´ 아니ë�¼ë©´ í�° 문제였겠지.. - 서지혜

3.2.3. 깨지기 쉬운 기반 �래스 문제

  • p81
    • 기반 í�´ëž˜ìŠ¤ëŠ” 기반 í�´ëž˜ìŠ¤ë§Œì�„ 따로 떨어뜨려 놓고 안전하게 수정할 수 없으며, 모든 파ìƒ� í�´ëž˜ìŠ¤ë¥¼ 함께 살펴보고 테스트해 보아야 한다.
      • 슈í�¼ í�´ëž˜ìŠ¤ë¥¼ 수정하면 알수없는 새ë�¼ ì—�러들ì�´ 창발한다ㅋㅋㅋ - 서지혜
  • p86
    • 구현 ìƒ�ì†�ì�„ 사용하면 기반 í�´ëž˜ìŠ¤ë¥¼ 수정할 때마다 파ìƒ� í�´ëž˜ìŠ¤ë“¤ì�´ 제대로 ìž‘ë�™í•˜ëŠ”ì§€ë¥¼ 테스트해야 한다.
  • p87
    • 기반 í�´ëž˜ìŠ¤ë¥¼ 수정할 때마다 파ìƒ� í�´ëž˜ìŠ¤ë¥¼ 검토해 보아야 한다면 ì�´ëŠ” 기반 í�´ëž˜ìŠ¤ë¥¼ 확장하고 있는 것ì�´ 아니ë�¼ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 구현하고 있는 것ì�´ë‹¤.
      • 그러고보니 ì�¼ì�¼ì�´ 오버ë�¼ì�´ë”©í•  ë°”ì—�는 ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ implements하는게 ë�” 나ì�„거같네? - 서지혜

3.2.4. 다중 ��

  • p90
    • 구현 ìƒ�ì†�ì�´ '나ì�˜ë‹¤ë©´' 분명 다중 구현 ìƒ�ì†�ì�€ ë�” 나ì�˜ë‹¤.


3.2.5. 프레임워�

  • p91
    • 깨지기 쉬운 기반 í�´ëž˜ìФ 문제를 프레임워í�¬ 기반 프로그래ë°�ì—� 대한 언급 ì—†ì�´ 마칠 수는 없다. MFC(Microsoft's Foundation Class) ë�¼ì�´ë¸ŒëŸ¬ë¦¬ì™€ ê°™ì�€ 프레임워í�¬ëŠ” í�´ëž˜ìФ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ 만드는 ì�¸ê¸°ìžˆëŠ” 방법ì�´ ë�˜ì—ˆë‹¤.
      • 나는 처ì�Œë¶€í„° MFCê°€ 별로 마ì�Œì—� 안들었다. 기능ì�„ 하나 구현하려면 ì�´ê³³ì €ê³³ì�„ ì†�대야 해서.. - 서지혜
    • 마ì�´í�¬ë¡œì†Œí”„트ì�˜ 문제 í•´ê²° ë°©ì‹�ì�´ í•­ìƒ� 올바른 것ì�€ 아니다.
      • 수경ì�´ê°€ ì�½ì–´ì£¼ì—ˆë�˜ MS사ì�˜ ì§�ì›�들ì�´ ë§�하는건 ë�„움ì�´ 안ë�œë‹¤ëŠ”ê²Œ 기억나는군. - 김준ì„�
        • 개떡같ì�€ UIëž‘ì�€ 다른 문제ì�¸ê±°ê°™ì�€ë�°ìš”ã…‹ã…‹ã…‹ 마소가 ìž�주 까ì�´ëŠ”ê±´ 그만í�¼ ì˜�향력ì�´ í�¬ë‹¤ëŠ” ë§�ì�¼ë“¯ - 서지혜
          • ê·¸ ì±…ì�€ UIì—� 대해서 ë§�해주는거였나? 난ë˜� ì „ì²´ì �ì�¸ ê±°ë�¼ê³ . 마소가 ì˜�향력ì�´ í�¬ê¸´í•˜ì§€ - 김준ì„�
  • p92
    • 구현 ìƒ�ì†� 기반 아키í…�처는 깨지기 쉬운 기반 í�´ëž˜ìФ 문제 외ì—�ë�„ 너무 ë§Žì�€ í�´ëž˜ìŠ¤ë¥¼ 구현해 주어야 하는 문제를 갖고있다.

3.2.6. Template method와 Factory Method 패턴

  • p99
    • Factory Method 패턴ì�€ 좋ì�€ ì„ íƒ�ì�´ 아니었다. ì�´ë²ˆ 장ì�˜ ë’¤ì—�서 살펴볼 Strategy 패턴 등ì�€ Factory Method 패턴ì�˜ ë©‹ì§„ 대안ì�´ ë�œë‹¤.
    • 즉 아무ë�„ 필요하다고 요구하지 않ì�€ 부분까지 유연하다. ì�´ì™€ ê°™ì�€ 복잡ë�„를 필요로 하는 시스템ì�´ 실제로 있ì�„지는 모르겠지만, 스윙ì�„ 사용하다 ë³´ë©´ "왜 ì�´ì •ë�„ì�˜ 유연성ì�´ 필요할까?" ë�¼ëŠ” ìƒ�ê°�ì�„ ìž�주하게 ë�˜ë©°, ë˜�한 ê³¼ë�„한 유연성으로 ì�¸í•œ 복잡함ì�´ 별 ì�´ì � ì—†ì�´ 개발 기간ì�„ 길게 만든다.

3.2.7. 깨지기 쉬운 기반 �래스 문제 정리

  • p101
    • 여러분ì�€ '꼼수'ì—� 대한 ìƒ�ê°�í•  필요가 없는 코드를 작성해야 하기 때문ì�´ë‹¤.
    • 프로그램ì�„ ì •ìƒ�ì �으로 ë�™ìž‘하게 í•  수 있는 꼼수를 발견했다면 ë­� 그런대로 괜찮다. 하지만 ë‚´ 주장ì�˜ 핵심ì�€ ì• ì´ˆì—� ìƒ�ì†�으로 ì�¸í•œ 문제가 ë°œìƒ�하지 않ë�„ë¡� 했어야 한다는 것ì�´ë‹¤.
  • p103
    • 모든 ì„ íƒ�ì—�는 트레ì�´ë“œ 오프가 있으며 해당 방법과 ì�´ë¥¼ 대체할 수 있는 방법ì�˜ 장ì �ê³¼ 단ì �ì�„ 잘 헤아려 조율해야 할것ì�´ë‹¤.

3.3. 언제 extends를 사용해� 좋�가?


  • p103
    • ì�´ì œ 언제 extends 관계를 사용해ë�„ 좋ì�„ì§€ ë…¼ì�˜í•´ ë³´ë�„ë¡� 하ìž�.
    • ìš°ì„  í�´ëž˜ìФ 정규화(ë�°ì�´í„°ë² ì�´ìФ ë””ìž�ì�¸ì—�서 빌려온 용어ì�´ë‹¤)를 í•  때 유용하게 사용할 수 있다.
      • 그렇군. 정규화 계층구조는 위ì—� 있는 코드를 아래ì—�서 ì�¨ì„œ 만드는거니까 ìƒ�ì†�ì�„ ì�´ìš©í•˜ëŠ”ê²Œ 편하다는거군? 예제 없나 ê·¼ë�°? - 김준ì„�

    • ë””ìž�ì�¸ì�„ 하는 ë�° ì–´ë–¤ 방법ì�„ 따르ëŠ�ëƒ�는 ê²°ê³¼ì—� í�° ì˜�í–¥ì�„ 미친다.

  • p104
    • 올바른 OOë””ìž�ì�¸ì�€ 다ì�Œê³¼ ê°™ì�€ 과정ì�„ 밟는다.
      • 여기 5개가 있는ë�° ì�´ê²ƒì�„ 외워야 하는가!? - 김준ì„�

    • ë�™ì � 모ë�¸ë§�으로부터 í�´ëž˜ìФ 다ì�´ì–´ê·¸ëž¨ì�„ ë�„ìœí•˜ë�¼. ì�´ë ‡ê²Œ 하면 실제 필요한 ì—°ì‚°ê³¼ 관계만ì�´ í�¬í•¨ë�˜ê¸° 때문ì—� ì •ì � 모ë�¸ì�´ 현실ì �ì�´ ë�˜ê³  가벼워진다.
      • 형진ì�´ê°€ ì§€ë�„해준 ë�™ì � 모ë�¸ë§�으로 우리가 하고있ë�˜ DB와 ìž„ìƒ�ì�´ 하는 SE를 모ë�¸ë§�í–ˆì�„때는 ì°¸ 재밌었지. 확실히. ë‚´ê°€ ì§  프로그램보단 복잡ë�„ê°€ 낮아보였어. 부럽. - 김준ì„�

    • p105
      • 'is-a'는 그리 훌륭한 ë””ìž�ì�¸ ë�„구가 아니다. 우리가 늘 사용하는 ìž�ì—°ì–´ì—� 휘둘리지 ë§�ìž�.
        • í�´ëž˜ìФ ìƒ�ì†� 기반 계층구조ì�¼ë•ŒëŠ” 유용할듯 하지만. 우리가 ì›�하는 extends를 제거하는 ë�™ì � ë””ìž�ì�¸ 시ì—�는 그리 유용한 ë�„구가 아닌것 같다. 'is-a'ê°€ 얼마나 ë‚  잘못ë�œ 길로 ì�´ë�Œì—ˆë�˜ê°€! - 김준ì„�

      • 단순한 í�´ëž˜ìФ 계층 구조는 복잡한 계층 구조보다 만들고 유지 보수하기 쉽다. ë˜�한 ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì�´ìš©í•˜ì—¬ 구현 ìƒ�ì†�ì�´ 하는 것과 ê°™ì�€ 작업ì�„ 수행할 수ë�„ 있다.
        • ì�Œ.. 확실히 ì�´ ì±…ì�€ 구현ìƒ�ì†�ì�˜ 장ì �ì—�대해 충분히 알아들어야지 extendsì�˜ 장ì �ì—� 대해 ì�´í•´í• ìˆ˜ 있ì�„것 같다. ì�´ëŸ°ê²½ìš°ê°€ 어떤때ì�¸ì§€ 모르니까 - 김준ì„�

      • ìƒ�ì†�한 메소드ì—�서 예외를 ë�˜ì§€ì§€ ë§�ë�¼. 즉 리스코프 대체 ì›�ì¹™(LSP)를 지키ë�¼. LSP를 어기면 다형성ì�„ ì�´ìš©í•œ 코딩ì�„ í•  수 없고, ê²°ê³¼ì �으로 개방 í��쇄ì�˜ ì›�ì¹™(OCP)ë�„ 지킬 수 없게 ë�œë‹¤.

3.4. extends 제거하기


  • p107
    • 여러분ì�´ 시스템ì�„ 리팩토ë§�하고 있다 가정해 ë³´ìž�. 차근차근 시작해보ìž�.
      • 천리길ë�„ 한걸ì�Œë¶€í„°. ì�´ 부분ì�´ 2장ì�˜ 알짜배기 ê°™ì�€ë�°. ì •ë§� 길다. 그리고 재밌다. - 김준ì„�


~~java
interface Employee
{   void youAreFired();
}
  • ì§�ì›�ì�€ í•­ìƒ� í•´ê³ ë�  준비를 해야한다. - 김준ì„�

3.4.1. 팩토리와 싱글톤


  • p108
    • ë§Žì�€ 패턴들ì�´ 구현 시 Abstract Factoryì—� ì�˜ì¡´ 하는 경우가 많기 때문ì—� Abstract Factory는 ì�¼ì¢…ì�˜ 빌딩 블ë¡�ì�´ ë�˜ëŠ” 패턴ì�´ë�¼ í•  수 있다.
      • Abstract Factory는 다른ì�´ë“¤ì—�게 ë„�리 잘 알려져(?) ì“°ì�´ëŠ” 유용한 패턴ì�¸ê°€ë³´ë‹¤ - 김준ì„�

    • Abstract Factoryì�˜ 모든 실체화ì—�서 공통ë�˜ëŠ” 주제는 팩토리를 사용하여 정확한 타입ì�„ 모르는 ê°�체를 ìƒ�성한다는 것ì�´ë‹¤.

  • p110

~~java
public static class EmployeeFactory
{   private Factory(){/*비어있다/}

    public static Employee create()
    {   return new Employee()
        {   public void youAreFired(){/*많�코드*/}
        }
    }
}
  • peon ì�´ëŸ°ê±° ì—†ì�´ 그냥 ë‚´ë¶€ í�´ëž˜ìŠ¤ë¥¼ Employee()를 implement시킨걸로 반환시켜버리는군. ì�´ë¦„ì¡°ì°¨ 없으니 private Peon으로 만든것보다 심한ë�°? ì •ë§� ìƒ�ìƒ�ë�„ 못할 í�´ëž˜ìŠ¤ìž„ - 김준ì„�


  • p111
    • 유ì�¼ì„±'ê³¼ ì „ì—­ ì ‘ê·¼'ì�´ëž€ ì¡°ê±´ì�„ 만족시키면 Singleton 패턴ì�˜ 실체화ë�¼ í•  수 있다. Employee factory는 ë‘� ì¡°ê±´ì�„ 모ë‘� 만족시키므로 합당한 Singleton 패턴 실체화ì�´ë‹¤.
      • ì „ì—­ì ‘ê·¼ ì�´ëŸ°ê²Œ 많으면 관리하기 힘들다는거 ì•„ë…€? - 김준ì„�

3.4.2. Singleton�서� 스레딩 �슈


  • p113
    • 모든 것ì�„ static으로 하는 ì „ëžµì�€ 단순하고 멋지지만 ë§Žì�€ 경우 사용할 수 없다.
  • p114

~~java
class Singleton
{  private static Singleton instance = null;
   public static instance()
   {  if( instance == null)
      { instance = new Singleton();
      }
      return instance;
   }
   //...
}
  • Javaì—�서 GUI등 í�´ëž˜ìФ ìž�ë�™ ìƒ�성 툴ì�„ 사용하면 대부분 ì € 모양ì�„ ì�´ìš©í•´ì„œ 나온다. ê·¼ë�° ì •ë§� 많으면 보기 ì§œì¦�난다. -김준ì„�

3.4.3. Double-Checked Locking(사용하지 ��)


  • p116
    • DCLì�„ 없애는 ì�¼ì�€ 바퀴벌레를 박멸하는 ì�¼ì—� 비유ë�˜ê³¤ 한다. 10마리를 죽ì�´ë©´ 하수구ì—�서 1000마리가 기어 나온다.
      • .... 바퀴벌레ë�¼ë‹ˆ. ì�´ê±° 사람한테 비유한거임? - 김준ì„�

    • ì�´ 주제ì—� 대해 글ì�„ 쓸 때마다 DCL 문제를 해결했다고 ìƒ�ê°�하는 '매우 똑똑한'프로그래머들로 부터 수십 통ì�˜ ë©”ì�¼ì�„ 받았다. 그들ì�€ 모ë‘� 틀렸으며 어떠한 꼼수ë�„ 제대로 ë�™ìž‘하지 않는다. ë�” ì�´ìƒ� 내게 ë©”ì�¼ì�„ ë³´ë‚´ì§€ ë§�기를 바란다.
      • 단골주제. 얼마나 ë§Žì�´ 싸운거야? - 김준ì„�

3.4.4. Singleton 죽�기


  • p117
    • 멋지게 커넥션ì�„ 닫는 방법ì�€ ì—†ì�„까?
      • 탭댄스를 추고 물구나무서서 왼ì†�ì�„ 들어 ì½”ë�¼ë¦¬ë¥¼ 들어올린뒤 닫으면 멋질듯 - 김준ì„�

  • p118
    • 종료ìž�ì—� 대한 나ì�˜ ì�¼ë°˜ì �ì�¸ ì¡°ì–¸ì�€ '사용하지 ë§�ë�¼' ì�´ë‹¤.
      • 그리고 멋지게 ë‹«ì�€ê²Œ 하지 ë§�ë�¼ëŠ” 것임 - 김준ì„�

  • p119
    • ë˜�한 셧다운 í›… 안ì—�서 Singletonì�„ 사용한다면 죽었다 ë�˜ì‚´ì•„나는 좀비 Singletonì�„ 만들 위험ë�„ 있다.
      • 그리고 좀비가 너ì�˜ 뇌를 먹겠지(Zombie ate your brain) - 김준ì„�

3.4.5. Abstract Factory 패턴

  • p120
    • 앞ì—�서 ê°�체를 ìƒ�성할 때 Singleton 패턴과 Abstract Factory 패턴ì�´ ìž�주 함께 사용ë�œë‹¤ê³  설명했다. 그러므로 Abstract Factoryì—� 대해 좀 ë�” 알아보기로 하ìž�.

    • ê²°ê³¼ì �으로 프로그래머는 외부 코드ì—� ì˜�í–¥ì�„ 미치지 않으면서 구체 Peon í�´ëž˜ìŠ¤ë¥¼ 마ì�ŒëŒ€ë¡œ, 심지어 ê·¸ ì�´ë¦„ì¡°ì°¨ë�„ 바꿀 수 있다.
      • ê·¼ë�° ì�´ë¦„ì�´ 없으면 어떻게 죽ì�´ë‚˜? youAreFired()ê°™ì�€ ìž�ì‚´ì�„ 만들어놔야하나? garbage Collector를 ì�´ìš©í•´ì•¼í•˜ë‚˜? -김준ì„�

  • p121
    • Abstract Factory 패턴ì�€ 관련ë�œ ì�¼ë ¨ì�˜ í�´ëž˜ìФ 'êµ°(family)'중 하나를 ìƒ�성한다.

  • p122
    • Abstract Factory 패턴ì�˜ 주요 장ì �ì�€ 격리(isolation)ì�´ë©°, ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 통해 ê°�ì²´ ìƒ�성ì�„ 가능 하ë�„ë¡� 해준다.

  • p123
    • ì�´ë¦„ì�´ 있는 í�´ëž˜ìФ 대신 ì�µëª…ì�˜ ë‚´ë¶€ í�´ëž˜ìŠ¤ë¥¼ 사용하여 코드를 단순화시켰다(단순함ì�€ 언제나 좋다)
      • 난 ì •ë§� ì§„ì§œ 단순한거 좋아해. ê·¼ë�° ì�´ê±° 여러개를 만들면..? ì�´ë¦„ 안줘ë�„ ë�˜ëŠ”ê±° 맞는겨? - 김준ì„�

  • p124
    • ìž�바가 ì�¸í„°íŽ˜ì�´ìФì—�서 static 메소드를 ì§€ì›�했다면 좋았겟지만 현재는 그렇지 않다.
      • 과거ì—�ë�„ 그랬고 현재까지 그렇지 않다는거지? 미래ì—�는 ì €ìž�ê°€ ë§�하는 ì�´ë””ì—„ì�´ ë�˜ì—ˆìœ¼ë©´ 좋겠군 - 김준ì„�

  • 패턴ì�€ 여러 ë°©ì‹�으로 실체화할 수 있다. 중요한 것ì�€ 문맥과 ì�˜ë�„ì�´ì§€ ì •ì � 구조가 아니다.

3.4.6. 패턴 비빔밥


  • p124
    • 'ê´€ì �ì�„ 바꾸면 ë³´ì�´ëŠ” 것ì�´ 다르다'는 것ì�„ 보여주는 ìž�ë°”ì�˜ í�¥ë¯¸ë¡œìš´ 예를 하나 ë�” 살펴보ìž�.

  • p125
    • ê´€ì �ì�„ 바꾸어 ë³´ë©´ URLConnectionì�€ InputStream 구현체들ì�„ ìƒ�성하는 Abstract Factroyì�´ê¸°ë�„ 하다.

  • p126
    • ì�´ 예제ì�˜ 핵심ì�€ ê´€ì �ì�˜ 전환ì—� ì�µìˆ™í•´ì§€ìž�는 것ì�´ë‹¤.

3.4.7. 팩토리를 �용한 �� �성


  • p128
    • 하드 코딩ì�„ 통해 ì–´ë–¤ ê°�체를 ìƒ�성할지를 결정하게 ë�˜ë©´ 프로그램ì�´ 실행ë�˜ê³  잇는 ë�„중ì—�는 행위를 바꾸지 못한다.
      • 첨ì—� 하드 코딩ì�„ ë´¤ì�„때. Hardì§€ì—� 쓰는 ì†�코딩ì�„ ìƒ�ê°�했었다. 나만그런가? - 김준ì„�

  • p128
    • 그리고 Class.forName()ì�„ ì�´ìš©í•˜ì—¬ 앞ì—�서 만든 ì�´ë¦„ì—� 해당하는 Class ê°�체를 ìƒ�성하게 ë�œë‹¤.
      • ì§„ì§œ.. ìž�ë°”ì—� 대해 나는 ì•„ì§� ë°˜ë�„ 모르는듯 하다. - 김준ì„�

3.4.8. Command 패턴과 Strategy 패턴


  • p131
    • ê°�체를 ì¶”ìƒ�ì �ì�¸ 방법으로 ìƒ�성하는 ë�° 유용한 다른 패턴ì�€ Strategy 패턴ì�´ë‹¤. 그리고 Strategy 패턴ì�€ 좀 ë�” ì�¼ë°˜ì �ì�¸ 패턴ì�¸ Command 패턴ì�˜ 특별한 경우ë�¼ í•  수 있다.
    • C혹ì�€ C++ì—�서는 알고리즘ì�„ 구현하는 함수를 작성한 후 함수 í�¬ì�¸í„°ë¥¼ 넘겨주는 ë°©ì‹�으로 알고리즘ì�„ 전달할 수 있다.
      • ì•„.. 함수 í�¬ì�¸í„°. 좀 신기했었ì�Œ. Javaì—�ì„  Cì—�서보다는 ë§Žì�´ ì�´ 패턴들ì�´ ì�´ë””ì—„ì—� 가까워진듯. - 김준ì„�

    • ìž�ë°” 스레드는 전형ì �ì�¸ Command패턴ì�˜ 구현체ì�´ë‹¤.

  • p132
    • Strategy 패턴ì�€ 특정 ì—°ì‚°ì�„ '어떻게' 수행할 것ì�¸ì§€ì—� 대한 ì „ëžµì�„ 캡ìŠ�화한 Strategy ê°�체를 전달한다.

  • p135
    • 사실 ê±°ì�˜ 대부분ì�˜ ìƒ�황ì—�서 Strategy는 Factory Methodì�˜ 좋ì�€ 대안ì�´ ë�œë‹¤.

3.5. 요약



4. ��프 게임


  • p139
    • 아마ë�„ ë�¼ì�´í”„ 게임ì�€ 지구ìƒ�ì—�서 가장 ë§Žì�´ 구현ë�œ 애플리케ì�´ì…˜ 중 하나ì�¼ 것ì�´ë‹¤.
      • ì�´ Life Gameë§�ê³  Life Game 류를 뜻하는거겟지? - 김준ì„�

    • 10ê°œì�˜ ë””ìž�ì�¸ 패턴ì�„ 실제 프로ì �트ì—�서 사용하는 것처럼 함께 사용해 볼것ì�´ë‹¤. 다행히 프로그램ì�´ ì�´í•´í•˜ì§€ 못할 ì •ë�„로 거대하지는 않다. í�´ëž˜ìŠ¤ì™€ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 모ë‘� í•©ì³� 20ê°œ ë°–ì—� ë�˜ì§€ 않는다.
      • ... ì�Œ.. 20ê°œ. GUIì“°ë©´ 그정ë�„ 나오긴 할것같아. - 김준ì„�

    • 나ì�˜ ë�¼ì�´í”„ 구현ì�€ ìž�ë°” í�´ë�¼ì�´ì–¸íЏ 측 GUI ë�¼ì�´ë¸ŒëŸ¬ë¦¬(스윙)ì�„ 사용하며, 여러분ì�´ 스윙ì�˜ 기본ì �ì�¸ 기능ì�€ 알고 있다고 가정한다.
      • '레벨ì�´ 낮아 해당 지역ì—� 진입할수 없습니다.','퀘스트를 수행하는ë�° 필요한 ì•„ì�´í…œì�„ 가지고 있지 않습니다'를 머리ì—� ë�„ìš°ì§€ 않ì�„수 있어서 좋군. - 김준ì„�

    • ì�´ë²ˆìž¥ì—�는 ë§Žì�€ 코드가 나온다.

    • 나는 종종 ì „ì²´ 코드를 보여주지 않는 책들 때문ì—� 좌절하곤 했다.

    • 마지막으로 ì�´ë²ˆ ìž�ì�˜ 코드는 최선ì�˜ ë�¼ì�´í”„ 게임 구현ì�€ 아니다.

4.1. ��프 얻기

  • p140
    • ë�¼ì�´í”„는 1장ì—�서 ë…¼ì�˜í•œ 것과 ê°™ì�€ 간단한 셀룰러 오토마타ì�´ë‹¤.

    • ì�¸ë¥˜í•™ìž�ì�¸ ë‚´ 친구는 ë�¼ì�´í”„ 게임ì—�서 발견ë�˜ëŠ” 패턴ì�´ ì�¸ê°„ 사회ì—�서 발견ë�˜ëŠ” í–‰ë�™ 패턴ì�„ ì—°ìƒ�시킨다는 ì�´ì•¼ê¸°ë¥¼ 했다.
    • ì „ì²´ì�˜ í–‰ë�™ì�€ ì •ë§�ì�´ì§€ í�¥ë¯¸ë¡­ë‹¤.

  • p141
  • p143
    • 서울대 컴퓨터 공학부ì�˜ 문병로 êµ�수는 ì–´ë–¤ 사람ì�˜ 창조성ì�€ 어려서부터 ê·¸ 사람ì�´ 쌓아 놓ì�€ 사고 빌딩 블ë¡�ì�˜ 질ì—� ì�˜í•´ ê²°ì •ë�œë‹¤ê³  했다.
      • 난 무슨ìƒ�ê°�ì�„ í–ˆì�„까? ì�¼ê¸°ë¥¼ 보고싶다. - 김준ì„�

4.2. ��프 구조를 차트로 표현하기

  • p143
    • ì�´í•´í•˜ë ¤ í•  때엔 ì •ì �ì�¸ 구조부터 살펴보는 것ì�´ í�° 그림ì�„ 잡기ì—� 좋다.

    • ì�´ 그림ì�€ 잡다한 세부 사항ì�„ ìƒ�략하고 핵심 ë””ìž�ì�¸ 패턴만ì�„ 보여준다.

    • 실세계ì—�서 패턴ì�„ 사용하는 법ì�„ 그대로 보여준다.

  • p146
    • ì�´ë“¤ 다ì�´ì–´ê·¸ëž¨ì�„ 프로그래머ì�¸ ë‚´ ì•„ë‚´ ë�°ì–´ë“œë¦¬ì—�게 처ì�Œ 보여주었ì�„ 때 그녀ì�˜ ë°˜ì�‘ì�€ "너무 복잡해요. ì�´ëŸ° 다ì�´ì–´ê·¸ëž¨ì�€ ë³´ê³ ì‹ì§€ 않ì�€ê±¸ìš”?" 였다. 하지만 앞으로 여러분과 함께 í•  것과 ê°™ì�€ ë°©ì‹�으로 시스템ì—� 대해 살펴보고 난 ë’¤ì—� 그녀ì�˜ ë°˜ì�‘ì�€ "ì�´ 다ì�´ì–´ê·¸ëž¨ì�˜ 표현력ì�€ ì •ë§� 대단하군요! í’�부하다(rich)는 ë§�ì�´ ì �í•©í•  것 같아요"로 바뀌었다.
      • ì•„ë‚´ë�„ 프로그래머다. 진정한 화개장터시다. 마치 엄마 코딩봇처럼.. - 김준ì„�

    • '복잡한'ì—�서 'í’�부한'으로ì�˜ ì „ì�´ëŠ” 중요한 것ì�´ë©°, 여러분ì�´ 별 어려움 ì—†ì�´ 패턴ì�„ ì�‘용할 수 있ì�„ 때 ì�¼ì–´ë‚˜ëŠ” 현ìƒ� 중 하나ì�´ë‹¤.

    • 패턴 '잘ë�¼ ë¶™ì�´ê¸°(cut-and-paste)'란 ê°œë…�ì�€ 넌센스ì�´ë‹¤. 패턴ì�€ 멋지게 분리하여 ê°ˆë�”하게 잘ë�¼ ë¶™ì�¼ 수 있는 ë°©ì‹�으로는 ê±°ì�˜ 사용ë�˜ì§€ 않는다.

4.3. Clock 서브시스템 : Observer 디�� 패턴


  • p147
    • ê°�체들(Observer)ì—� 주기ì �으로 í�´ë¡� 틱(clock tick)ì�´ë²¤íŠ¸ë¥¼ 통지한다. ì�´ 경우는 Universeê°€ ActionListener ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 구현한 ì�µëª…ì�˜ ë‚´ë¶€ í�´ëž˜ìŠ¤ë¥¼ 통해 ì�´ë²¤íŠ¸ë¥¼ 받는다.
  • p148
    • class BadJmenuItem
    • ìƒ�ì†�ì�„ ì�´ìš©í•˜ì—¬ ì�´ë²¤íЏ 통지를 하면 ì�´ë²¤íŠ¸ë¥¼ ë°œìƒ�시키는 ê°�체와 ì�´ë²¤íŠ¸ë¥¼ 처리하는 ê°�ì²´ 사ì�´ì—� ê²°í•©ë�„ê°€ 매우 높아진다.

    • 패턴ì�˜ ì�˜ë�„를 잘 나타내주는 훌륭한 ì�´ë¦„ì�´ë‹¤.
      • Namingì�€ í•­ìƒ� 중요하지. ê·¼ë�° ì•„ì§�ë�„ 난 잘 모르겠단 ë§�야 - 김준ì„�

  • p149
    • ì�´ë²¤íЏ 통지는 ìœíŒ�ìž�ì—�서 구ë�…ìž�ì—�게로 ì§�ì ‘ 배달ë�œë‹¤. '중개ìž�' ê°�체를 ìƒ�성하고 유지 보수할 필요가 없게 ë�œë‹¤.
      • 중간 마진ì�„ 빼면 소비ìž�와 íŒ�매ìž�ê°€ 만족합니다. - 김준ì„�

    • Clockì�€ Subject/Publisher ì—­í• ì�„ 맡는다.

  • p151
    • Clockì�´ 전형ì �ì�¸ GoF Singleton ìž„ì�„ 주ì�˜ 깊게 보기 바란다.

    • 좀 ë�” 단순한 구현ì�„ 사용하려 시ë�„í•´ 보았늗네 Clock Singletonì�´ 너무 ì�¼ì°� ìƒ�성ë�˜ì–´ 메뉴가 올바로 설정ë�˜ì§€ 않는 문제가 ë°œìƒ�했다. 'ê³ ì „ì �'ì�¸ Singletonì�´ ì�´ëŸ° 문제를 í•´ê²°í•´ 준다.
      • Java는 플렛í�¼ 기반ì�´ê¸° 때문ì—� 나오는 문제로 'ê³ ì „ì �'ì�¸ Singletonì�€ 컴파ì�¼ë�™ì•ˆ 해당 Singleton í�´ëž˜ìŠ¤ë¥¼ 구성할 충분한 정보를 가지는 기회를 주기때문ì—� ì�´ëŸ°ë¬¸ì œë¥¼ í•´ê²°í•´ 주는것ì�´ë‹¤. 역시 ì±…ì�„ ì�½ì�€ 보람ì�´ 있군! - 김준ì„�

4.3.1. Observer 구현하기 : Publisher �래스


  • p154
    • 지금까지 ë§Žì�€ 개발ìž�들ì�˜ 경험ì�„ 통해 Observer는 구현하기 매우 어렵다고 ë°�혀졌고, 특히 스윙과 ê°™ì�´ 여러 스레드가 ìƒ�호 작용하는 환경ì—�서는 ë�”ìš± 그러하다.

    • 모든 실제 처리는 스윙 ì�´ë²¤íЏ 스레드ì—�서 ì�¼ì–´ë‚˜ë©°, ì�´ ì�´ë²¤íЏ 스레드가 사용ìž� ìž…ë ¥ ì•¡ì…˜ì—� ë°˜ì�‘한다. 하지만 나는 여러 스레드 중 ë©”ì�¸ 스레드ì—�서 ë©”ì�¸ ê°�ì²´ 모ë�¸ì�´ ë�™ìž‘해지는 스윙 ì�´ë²¤íЏ 스레드로부터 ë°œìƒ�하고, 스윙ì�€ ë§Žì�€ 비ë�™ê¸° 메시지를 ë©”ì�¸ ê°�ì²´ 모ë�¸ì—� 보내게 ë�˜ëŠ”ë�°, ë©”ì�¸ 스레드는 스윙 ì�´ë²¤íЏ 스레드가 언제 ì�´ë²¤íŠ¸ë¥¼ 보낼지 예측할 수 없다.
      • 스윙ì�€ ì •ë§� ë§Žì�€ 문제를 í�¬í•¨í•˜ê³ ìžˆë‹¤ëŠ”ê±¸ 다시, 다시 ëŠ�낀다. 사실 스윙ë¿�ë§Œì�´ 아니지만 - 김준ì„�
        • 위 글ì�€ ì�´ë²¤íЏì�˜ 예측 불가성ì�„ ì�´ì•¼ê¸° 하는거 아닌가요?; 스윙ì�˜ 문제가 아닌듯 - 서지혜

  • p155
    • 스레드를'굶겨 죽ì�¼ 수ë�„'있게 ë�œë‹¤.
    • 만약 ì�´ì™€ ê°™ì�€ '기아'를 없애기 위해 fireEvent()ì—�서 Synchronized를 제거한다 하ë�”ë�¼ë�„ 역시 고약한 문제가 ë°œìƒ�한다. ì–´ë–¤ 스레드ì—�서 subscribe()혹ì�€ cancle()메소드를 수행하는 ë�™ì•ˆ, 다른 스레드ì—�서 fireEvent()를 수행시킬 수 있기 대문ì�´ë‹¤. ë�™ê¸°í™”를 하지 않는다면 구ë�… ê°�ì²´ 리스트를 수정하는 ë�„중ì—� 다른 스레드ì—�서 접근할 수 있게 ë�˜ê¸° 때문ì—� ê²°ê³¼ì �으로 subscribers 리스트가 ë§�가질 위험ì�´ 있다.
  • p156
    • 예외를 사용하는 방법ì�€ Observerì—� 너무 ë§Žì�€ ì§�ì�„ 떠넘기는 것ì�´ë‹¤.

  • p157
    • ì�´ë²¤íЏ 통지가 복사본으로부터 ì�´ë£¨ì–´ì§€ë¯€ë¡œ 구ë�… ê°�ì²´ê°€ 구ë�…ì�„ 취소한 후ì—�ë�„ ì�´ë²¤íЏ 통지를 í•  가능성ì�´ 있다.

    • 코드를 ë°©ì–´ì �으로 작성하기 바란다.

    • ë’¤ì—�서 살펴볼 코드3-3ì—� 있는 Publisher í�´ëž˜ìŠ¤ëŠ” 복사를 너무 ë§Žì�´ 하는 문제를 멋지게 해결한다.
      • 스토리텔ë§� 하나는 멋지게 하시는것 같다. -김준ì„�

    • Command ê°�ì²´ê°€ Observerì—� 어떻게 통지할 것ì�¸ê°€ì—� 대한 정보를 캡ìŠ�화하기 때문ì—�, Publisher는 통지 매커니즘ì�„ Commandê°�ì²´ì—� 위임할 수 있다.
  • p159
    • Nodeì�˜ 모든 필드는 finalì�´ë¯€ë¡œ Node는 '불변(immutable)'ê°�ì²´ì�´ë©° 한 번 ìƒ�성하면 수정할 수 없다. ê²°ê³¼ì �으로 여러 스레드가 Node ê°�ì²´ì—� 접근하ë�”ë�¼ë�„ 안전하며 ë�™ê¸°í™”를 하지 않아ë�„ ë�œë‹¤.
  • p160
    • 만약 외부 í�´ëž˜ìФì�˜ 메소드가 ë‚´ë¶€ í�´ëž˜ìФì—�서 ì„ ì–¸ë�œ ì ‘ê·¼ 권한ì�„ 어기면서 접근하고 있다면 약간ì�˜ 유지 보수성과 약간ì�˜ 코드 단순화를 ë§žêµ�환 하고 있는것ì�´ë‹¤.
      • 어투는 좀 잘못ë�œ Trade-Offë�¼ê³  하는듯 하다. - 김준ì„�

  • p161
    • ë§Žì�€ 프로그래머들ì�´ 재귀 알고리즘ì�´ 불분명하고 비효율ì �ì�´ê¸° 때문ì—� 언제나 '나ì�˜ë‹¤'ê³  ìƒ�ê°�하고 있는 것같다.
      • ê·¸ ì–‘ì�´ 얼마나 ë� ì§€ 불분명하기 때문ì—� '복불복'ëŠ�낌ì�´ 들어 비효율ì �ì�´ì§€ - 김준ì„�

    • 재귀를 ì�´ìš©í•œ 구현ì—�서는 노드ì—� 대한 ë ˆí�¼ëŸ°ìŠ¤ê°€ ê°� 재귀 호ìœì�˜ 로컬 변수ì�´ê¸° 때문ì—� ì�´ë¥¼ 유지하기 매우 쉽다.


4.4. Clock 서브시스템 : Visitor 패턴

5. 소형 ��터베�스 구현하기


  • 오랜만ì—� ì�´ 페ì�´ì§€ 다시 보고있는ë�° 준ì„�선배께서 꾸준히 밑줄ì�„ 열심히 긋고계셨다는 사실ì—� 새삼 ê°�탄하고 갑니다...! - 김수경

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:25
Processing time 0.0396 sec