Contents
- 1. 소개
- 2. 규칙
- 3. ì§„í–‰
- 3.1. 2012년 5월 5�
- 3.2. 2012년 5월 12�
- 3.3. 2012년 5월 19�
- 3.4. 2012년 5월 26�
- 3.5. 2012년 6월 2�
- 3.6. 2012년 7월 20�
- 3.7. 2012년 7월 27�
- 3.8. 2012년 8월 3�
- 3.9. 2012년 8월 17�
- 3.10. 2012년 9월 22�
- 3.11. 2012년 10월 6�
- 3.12. 2012년 10월 20�
- 3.13. 2012년 11월 3�
- 3.14. 2012년 11월 10�
- 3.15. 2012년 12월 23�
- 3.16. 2013년 1월 6�
1.1. 누가? ¶
- 튜터: 변형진
- 튜티: 김태진, 김준�, 권순�, 서민관, 서�주, 권�기
- 누구나 참여 가능합니다. �� �름� �주세요.
- 최소 Java 기초 문법 ì�´í•´ ë°� 학부 2학년 1학기 커리í�˜ëŸ¼ 수준ì�˜ ì „ì‚°ì§€ì‹� í•„ìš”
- ì�´ë¡ ê³¼ 실무 ì§€ì‹�ì�„ 모ë‘� 다룰 ì˜ˆì •ì�´ë¯€ë¡œ Java 경험ì�´ ë§Žì�„ 수ë¡� 좋습니다.
- ì�´ë¡ ê³¼ 실무 ì§€ì‹�ì�„ 모ë‘� 다룰 ì˜ˆì •ì�´ë¯€ë¡œ Java 경험ì�´ ë§Žì�„ 수ë¡� 좋습니다.
- ìš°ì•™ ìž¬ë°Œê² ë‹¤ - 서지혜
- í�¥ë¯¸ë¡œì›Œì„œ ì°¸ì—¬í•˜ê³ ì‹¶ì§€ë§Œ ì•„ì§� 서울ì—� 갈만한 형편ì�´ 안ë�˜ë„¤ìš”.. í�¥ë¯¸ë¡œìš´ ì£¼ì œë¥¼ 다루시는것 ê°™ë�˜ë�°. - 안í˜�준
- 누구나 참여 가능합니다. �� �름� �주세요.
1.4. 무엇ì�„? ¶
- í•™êµ�ì—�서 배울 수 없는 Javaì—� 대한 좀ë�” ê¹Šê³ ë‹¤ì–‘í•œ ì�´ì•¼ê¸°
- 다룰 법한 ì£¼ì œ
- Java Technology와 �태계
- Java 개발 환경 � 빌드 프로세스
- Java 프로그래� 언어
- Java API와 주요 기ìˆ
- Java 개발 방법ë¡
- �체지향 프로그래�
- 리팩터�
- 디�� 패턴
- 리팩터�
- 테스트 주� 개발
- ìœ ë‹› 테스트
- Mock í”„ë ˆìž„ì›Œí�¬
- ìœ ë‹› 테스트
- �체지향 프로그래�
- Android 플랫�
- 등등…
- Java Technology와 �태계
1.6.1. 변형진 ¶
- 현업 Java 개발ìž�ë�„ 놓치기 쉬운 ë¬¸ì œë“¤ì�„ ì§šì–´ë³´ê³ , 올바른 Java 프로그램ì�„ ë¹ ë¥´ê³ ê¹”ë�”하게 구현하는ë�° 필요한 중급 수준ì�˜ ì§€ì‹�ì�„ ì „ë‹¬í•˜ê¸° 위해
- Java를 중ì �ì �으로 다루지만, Javaì—� í•œì •ë�˜ì§€ 않ì�€ í�ë„“ì�€ 컴퓨터공학ì � ì�´í•´ë¥¼ 바탕으로 ì‚¬ê³ í•˜ë�„ë¡� 하기 위해
- ê·¸ë�™ì•ˆ 설계와 구현ì—� 관한 ì�¼ë°˜ë¡ ì�„ 위주로 세미나를 진행해왔기ì—�, ì�´ë²ˆì—�는 좀ë�” practicalí•˜ê³ pragmatic한 ì§€ì‹�ì�„ ì „ë‹¬í•˜ëŠ”ë�° 비중ì�„ ë‘�ê³ ìž� 함.
- 나 스스로ë�„ 알지만 불충분했ë�˜ ì§€ì‹�ì�´ë‚˜ ì•„ì§� ì–´ë ´í’‹í•œ ì§€ì‹�ì�„ 설명하면서 함께 ê³µë¶€í•˜ê³ ë°°ìš°ê¸° 위해
1.6.2. 김태진 ¶
- í•™êµ�ì—�서 배우기 íž˜ë“ ë‹¤ì–‘í•œ ì§€ì‹�(ìž�ë°”ë¿�ë§Œ ì•„ë‹ˆê³ )들ì�„ ì ‘í•´ë³´ê³ , í™œìš©í• ìˆ˜ 있기위해
- ì•„ì§� ë‚´ê°€ 구현하는게 불가능한 것ì�„ 가능하게 하는 것부터, 좀 ë�” '잘' 구현하는게 가능한 ì˜�ì—까지 ê·¸ í�ì�„ 넓히기 위해
- 어디가서 ìž�바로 개발 좀 ì œëŒ€ë¡œ í•´ë´¤ëƒ�ë�¼ê³ 물어볼때, 확실히 '네'ë�¼ê³ ëŒ€ë‹µí• ìˆ˜ 있기 위해
- 병특ì�„ 위한 중장기 프로ì �트(?)
- "ë‚´ê°€ 아무것ë�„ 모른 ìƒ�태ì—�서 1학년 1ë…„ê°„ 배울때처럼 그때 ê·¸ 마ì�Œìœ¼ë¡œ ë§Žì�€ 것ì�„ 배우기 위해" - 배움ì—� ì�´ìœ ê°€ 있는가.
1.6.3. 서ì˜�주 ¶
- ìž�바를 좀 대충 ë°°ìš´ ê°�ì�´ 있어서 ìž�ë°”ì—� 대해서 조금 ë�” 확실히 ì•Œê³ í•™êµ�ì—�서 가르ì³�주는 것 외ì�˜ ìž�ë°”ì—� 관한 ì§€ì‹�ì�„ 조금 ë�” ë°°ìš°ê³ ì‹¶ì–´ì„œ.
- 언어ì—� 관한 것 ë¿�ë§Œ 아니ë�¼ ìœ ìš©í•œ ë�¼ì�´ë¸ŒëŸ¬ë¦¬, ìž�ë°” 개발 환경 등 개발ì�„ ë�” ë¹ ë¥´ê³ íŽ¸ë¦¬í•˜ê²Œ í• ìˆ˜ 있는 방법ì�„ 배우기 위해서.
- ìœ ë‹›í…ŒìŠ¤íŠ¸, mock í”„ë ˆìž„ì›Œí�¬ 사용 등ì�˜ 부분ì—� 대한 ì‹¤ì œ 사용 예를 잘 알기 위해
1.6.4. 권순ì�˜ ¶
- í•™êµ�ì—�서 ë°°ìš´ ìž�바보다 ë�” 심ë�„있는 걸 í•˜ê³ ì‹¶ì—ˆëŠ”ë�° ëŠ¥ë ¥ì�´ 안 ë�˜ì„œ 못했기 때문ì—�
- 보다 ë�” ì‚¬ê³ ë¥¼ 넓히기 위해
- 공부란 것ì�€ 하면 í• ìˆ˜ë¡� í• ê²Œ 많기 때문..
1.6.5. 서민관 ¶
- 단순히 ìž�ë°” 언어ì—� 대해서가 아니ë�¼ ë�” 다양한 ì£¼ì œë¥¼ 다루는 스터디ì�´ê¸° 때문ì—� í�¥ë¯¸ê°€ 있어서.
- í† ìš”ì�¼ì—� í• ìˆ˜ 있는 활ë�™ë“¤ 중ì—�서 시간 대 성능 비가 월등하니까 듣지 않ì�„ ì�´ìœ ê°€ 없다.
- TDD로 코드를 ì§œ ë³´ë ¤ë‹¤ 실패해서 -_-;;; 어떻게 TDD로 코딩ì�„ 해야 하는지, 어떻게 ë¦¬íŒ©í† ë§�ì�„ 해야 하는지 ë“£ê³ ì‹¶ì–´ì„œ.
1.6.6. ê¶Œì˜�기 ¶
- ìž�ë°” 언어ì—� 대해서 심ë�„있게 ê³µë¶€í•´ë³´ê³ ì‹¶ì–´ì„œ.
- 나ì�˜ 시야를 ë„“ížˆê³ ì‹¶ì–´ì„œ.
- í† ìš”ì�¼ì�„ 알차게 보내기 위해서.
좋ì�€ ì„ í–‰í•™ìŠµì�´ë‹¤..
3.1. 2012ë…„ 5ì›” 5ì�¼ ¶
- 오리엔테�션
- 튜터가 ìƒ�ê°�한 ì�´ 스터디ì�˜ "무엇ì�„?", "어떻게?", "왜?"를 ìž�세히 ì†Œê°œí•˜ê³ , 튜티들ì�´ ì›�하는 "무엇ì�„?", "어떻게?"ì—� 대한 ì�´ì•¼ê¸°ë¥¼ 나눴습니다.
- 스터디 시간ì�´ 참여ìž�들 ê°�ê°�ì—�게 ì›�하지 않는 시간 ë‚비가 ë�˜ì§€ 않ë�„ë¡�, ì–¸ì œë�¼ë�„ ë˜�다른 ì�˜ê²¬ê³¼ 질문ì�„ 환ì˜�합니다.
- 튜터가 ìƒ�ê°�한 ì�´ 스터디ì�˜ "무엇ì�„?", "어떻게?", "왜?"를 ìž�세히 ì†Œê°œí•˜ê³ , 튜티들ì�´ ì›�하는 "무엇ì�„?", "어떻게?"ì—� 대한 ì�´ì•¼ê¸°ë¥¼ 나눴습니다.
- "왜?"ì—� ê°�ìž� 서브섹션ì�„ 나누어 ìž�ì‹ ì�´ ì�´ 스터디를 통해 ì›�하는 것ì�„ ì �ê³ , 스스로ì—�게 ë�™ê¸°ë¶€ì—¬ë¥¼ 해봅시다.
3.2. 2012ë…„ 5ì›” 12ì�¼ ¶
- SpringSource Tool Suite(Eclipse IDE)ì�˜ 기본 ì„¤ì •ê³¼ 프로ì �트 ì„¤ì •ì—� 필요한 기본ì �ì�¸ ì •ë³´ë¥¼ 설명했습니다.
- Eclipse JDTì�˜ 빌드 ê³¼ì •ì�„ ì•Œì•„ë³´ê³ Mavenì—�서 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ ì�˜ì¡´ì„±ì�„ 추가해보았습니다.
- http://search.maven.com/
- http://mvnrepository.com/
- 오픈소스 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ì�˜ ë�¼ì�´ì„ 스 확ì�¸ì�€ 중요합니다.
- http://search.maven.com/
- í�´ëž˜ìŠ¤ì™€ ê·¸ 멤버ì—� ì �용하는 기본 modifier들ì�˜ ê°œë…� ë°� 용법ì�„ 다뤘습니다.
- public, protected, private, (none)
- abstract, final, static
- public, protected, private, (none)
3.2.1. 후기 ¶
- static modifierì—� 대해 ì• ë§¤í•˜ê²Œ ì•Œê³ ìžˆì—ˆëŠ”ë�° ìž�세하게 설명해주셔서 좋았습니다. staticì�€ 타입ì�„ 통해서 부르는거ë�¼ê±°ë‚˜ ì›�래 ëª¨ë“ í•¨ìˆ˜ê°€ staticì�¸ë�° ê°�체지향ì�˜ 다형성ì�„ 위해 staticì�´ 아닌 함수가 ìƒ�긴거ë�¼ëŠ” 설명ì�€ ì‹ ê¸°í–ˆì—ˆìŠµë‹ˆë‹¤. object.method(message) -> MyType::method(object, method) 부분ì�´ oop ì‹¤ì œ 구현ì�˜ 기본ì�´ë�¼ëŠ” 부분ì�€ 잊어버리지 ì•Šê³ ìž˜ ê¸°ì–µí•´ë‘¬ì•¼ê² ìŠµë‹ˆë‹¤. ê·¼ë�° 파ì�´ì�¬ì—�서 메소드 작성시 (self)ê°€ 들어가는 것ë�„ ì�´ê²ƒê³¼ ê´€ë ¨ì�´ 있는건가요? -서ì˜�주
- Python ì�€ PEPì—� ì ˆëŒ€ 권한ì�„ 가진 ê·€ë�„ê°€ 그냥 ì�˜ê²¬ì�„ 모아서 ì •í•œê²�니다. ì›�숙한 언어ì�¼ìˆ˜ë¡� 스펙 ìž�ì²´ê°€ 'ì›�래 그런 것'ì�€ ì—†ê³ , '사람간ì�˜ 약ì†�'입니다. ì�´í•˜ ì°¸ê³ ìž�료. --NeoCoin
- ì œê°€ "ì›�래 ëª¨ë“ í•¨ìˆ˜ê°€ static"ì�´ë�¼ëŠ” ì�˜ë¯¸ë¡œ ë§�한건 아닌ë�° 오해ì�˜ 소지가 있었나보군요. 사실 ì œê°€ 설명한 가장 중요한 사실ì�€ ë§�ì”€í•˜ì‹ ì˜ˆì—�서 objectì�˜ 컴파ì�¼ 타입ì�˜ method() 메서드가 ê°€ìƒ� 메서드ë�¼ë©´(staticì�´ 아닌 ëª¨ë“ Java 메서드), ì‹¤ì œ ì–´ë–¤ method() 메서드를 ì„ íƒ�í• ê²ƒì�´ëƒ�ì—� 관한 부분ì�„ objectì�˜ 런타임 타입ì—� ì�˜í•œë‹¤ëŠ” 부분ì�´ì—ˆì§€ìš”. 그러니까 object는 컴파ì�¼ 타입과 ë�™ì�¼í•˜ì§€ 않ì�€ 런타임 타입ì�„ 가질 수 있으며, 다형성ì�˜ 구현ì�„ 위해 implicit argumentì�¸ object(=this)ì�˜ 런타임 타입ì—� ë”°ë�¼ overrideë�œ 메서드를 ì„ íƒ�한다는 사실ì�„ 기억하세요. (Pythonì—�ì„ ì‹¤ì œ 메서드 ë‚´ì—�서 ì‚¬ìš©í• formal parameterì�¸ self를 explicit하게 ì„ ì–¸í• ìˆ˜ ìžˆë‹¤ê³ ë³´ë©´ ë�˜ê² 지요.) - 변형진
- Python ì�€ PEPì—� ì ˆëŒ€ 권한ì�„ 가진 ê·€ë�„ê°€ 그냥 ì�˜ê²¬ì�„ 모아서 ì •í•œê²�니다. ì›�숙한 언어ì�¼ìˆ˜ë¡� 스펙 ìž�ì²´ê°€ 'ì›�래 그런 것'ì�€ ì—†ê³ , '사람간ì�˜ 약ì†�'입니다. ì�´í•˜ ì°¸ê³ ìž�료. --NeoCoin
- static�는 �런 용법� 있습니다. StaticInitializer - 안�준
3.3. 2012ë…„ 5ì›” 19ì�¼ ¶
- Singleton 패턴과 lazy initialization� 필요성� 대해 �야기했습니다.
- ë©€í‹°ìŠ¤ë ˆë“œ 환경ì—�서 synchronized modifier를 사용한 ë�™ê¸°í™”ì—� 대해 공부했습니다.
- ë�™ê¸°í™” 부하를 피하기 위한 DCL 패턴ì�˜ ë¬¸ì œì �ì�„ ì‚´íŽ´ë³´ê³ Java 5 ì�´í›„ì—�서 volatile modifier로 í•´ê²°í• ìˆ˜ 있ì�Œì�„ ë°°ì› ìŠµë‹ˆë‹¤.
- ë©€í‹°ìŠ¤ë ˆë“œ 환경ì—�서 synchronized modifier를 사용한 ë�™ê¸°í™”ì—� 대해 공부했습니다.
- Serializable ì�¸í„°íŽ˜ì�´ìŠ¤ì™€ ObjectOutput, ObjectInputì�„ 사용한 ì§�ë ¬í™”, ì—ì§�ë ¬í™”ì—� 대해 공부했습니다.
- transient modifier는 VMì�˜ ìž�ë�™ ì§�ë ¬í™” ê³¼ì •ì—�서 íŠ¹ì • ì†�성ì�„ ì œì™¸í• ìˆ˜ ìžˆê³ , Externalizable ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 구현하면 ì§�ë ¬í™”, ì—ì§�ë ¬í™” ë°©ì‹�ì�„ ì§�ì ‘ ì •ì�˜í• 수 있ì�Œì�„ 보았습니다.
- transient modifier는 VMì�˜ ìž�ë�™ ì§�ë ¬í™” ê³¼ì •ì—�서 íŠ¹ì • ì†�성ì�„ ì œì™¸í• ìˆ˜ ìžˆê³ , Externalizable ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 구현하면 ì§�ë ¬í™”, ì—ì§�ë ¬í™” ë°©ì‹�ì�„ ì§�ì ‘ ì •ì�˜í• 수 있ì�Œì�„ 보았습니다.
- JNIë�¼ëŠ” 기법ì�„ 사용해 네ì�´í‹°ë¸Œ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ 연결하여 함수를 í˜¸ì¶œí• ìˆ˜ 있ì�Œì�„ ë°°ì› ìŠµë‹ˆë‹¤.
- native modifier로 함수ì�˜ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì„ ì–¸í• ìˆ˜ ìžˆê³ , 마샬ë§�, 언마샬ë§� ê³¼ì •ì—�서 성능 ì†�실ì�´ 있ì�„ 수 있ì�Œì�„ ì�´ì•¼ê¸°í–ˆìŠµë‹ˆë‹¤.
- native modifier로 함수ì�˜ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì„ ì–¸í• ìˆ˜ ìžˆê³ , 마샬ë§�, 언마샬ë§� ê³¼ì •ì—�서 성능 ì†�실ì�´ 있ì�„ 수 있ì�Œì�„ ì�´ì•¼ê¸°í–ˆìŠµë‹ˆë‹¤.
- 불변�체� 필요성과 조건� 대해 알아보았습니다.
- 대표ì �ì�¸ 불변ê°�ì²´ì�¸ String í�´ëž˜ìŠ¤ê°€ ë‚´ë¶€ì �으로 어떻게 구현ë�˜ê³ , 어떻게 불변성ì�„ ìœ ì§€í•˜ëŠ” 지를 살펴보았습니다.
- 다양한 String ê°�ì²´ì�˜ 활용 ê³¼ì •ì—�서 ê°�체들ì�˜ ë�™ì�¼ì„±ê³¼ ë�™ë“±ì„±ì�„ 알아보았습니다.
- 다양한 String ê°�ì²´ì�˜ 활용 ê³¼ì •ì—�서 ê°�체들ì�˜ ë�™ì�¼ì„±ê³¼ ë�™ë“±ì„±ì�„ 알아보았습니다.
- 대표ì �ì�¸ 불변ê°�ì²´ì�¸ String í�´ëž˜ìŠ¤ê°€ ë‚´ë¶€ì �으로 어떻게 구현ë�˜ê³ , 어떻게 불변성ì�„ ìœ ì§€í•˜ëŠ” 지를 살펴보았습니다.
3.3.1. 후기 ¶
- Stringê°�ì²´ë�¼ë‹ˆ..! ìž�ë°” 스트ë§�ì�€ 편하면서ë�„ 불편했는ë�° ë”ê°€ ê·¸ ì�´ìœ 를 들ì�„ 수 있었ì�„ 법한 ì£¼ì œë„¤ìš”..-김태진
- c++ì—�서 ìƒ�í˜¸ë°°ì œ ê´€ë ¨ìœ¼ë¡œ mutex나 critical sectionê°™ì�€ê±° ì—„ì² ë°°ì› ì—ˆëŠ”ë�° ìž�ë°”ì—�서는 synchronized를 ì�´ìš©í•´ì„œ 쉽게 ì²˜ë¦¬í• ìˆ˜ 있다는게 ì‹ ê¸°í–ˆìŠµë‹ˆë‹¤. os 수업 들ì�€ì§€ 오래 ë��는ë�° 멀티프로세스와 ë©€í‹°ìŠ¤ë ˆë“œ 수업ì�„ 다시 들으니까 설명ì�„ ì°¸ 잘 해주셔서 좋았습니다. 함수ì—�ë§Œ ë¶™ì�¼ 수 있는게 ì•„ë‹ˆê³ ë³´í˜¸ìž�ì›�ì�„ 가진 ê°�체를 ì�´ìš©í•œ synchronized(this){ ... } ê°™ì�€ 부분ì�€ 나중ì—� ìŠ¤ë ˆë“œë¥¼ 쓸 경우ì—� ì°¸ê³ ê°€ ë� 것 같습니다. ê·¸ë¦¬ê³ ì�¸í„°íŽ˜ì�´ìŠ¤ì™€ ë¦¬í”Œë ‰ì…˜ì�„ ì�´ìš©í•œ 초기화를 보니 ìƒ�ê°�ì�„ 잘 하면 구체í�´ëž˜ìŠ¤ê°€ 코드ì—� 안드러나게 í• ìˆ˜ 있다는 ì �ë�„ 볼만했습니다. -서ì˜�주
- ê°œì�¸ì �으로 synchronized는 잘 몰ë�¼ì„œ 그냥 ë¶™ì�´ë©´ ì�¼ë‹¨ ë�œë‹¤ëŠ” ì�´ë¯¸ì§€ë§Œ 막연하게 ê°€ì§€ê³ ìžˆì—ˆëŠ”ë�° 그런 부분까지 세밀하게 다뤄 주셔서 듣기ì—� ìƒ�당히 좋았습니다. 그래서 깊ì�´ê°€ ìƒ�당히 깊어졌다는 ì �ì�€ 장ì �ë�„ ìžˆê³ ë‹¨ì �ë�„ 있었지만 ì œ 입장ì—�서는 그래ë�„ ì–´ëŠ� ì •ë�„ 들ì�„ 수 있었ë�˜ ë§Œí�¼ 다룰 범위를 괜찮게 ì„¤ì •í•˜ì‹œì§€ 않았나 싶습니다. - 서민관
3.4. 2012ë…„ 5ì›” 26ì�¼ ¶
- interface
- nested class
- static nested class
- inner class
- annonymous inner class
- static nested class
- �집�up와 결합�dw (cohesion&coupling)
- SOLID SOLID Wiki
- SRP (Single responsibility principle)
- OCP (Open/closed principle)
- LSP (Liskov substitution principle)
- ISP (Interface segregation principle)
- DIP (Dependency inversion principle)
- SRP (Single responsibility principle)
- DRY DRY Wiki
- dont repeat yourself ì�´ê±¸ ê±¸ë ¤ê³ í–ˆë‚˜? - 서지혜
- dont repeat yourself ì�´ê±¸ ê±¸ë ¤ê³ í–ˆë‚˜? - 서지혜
3.4.1. 후기 ¶
- ë”± 6시간 ì§€ë‚˜ê³ ìƒ�ê°�해보니 오늘 ë� ë°°ì› ë�”ë�¼.. 하는 ëŠ�낌ì�´ 왔네요--; 중간ì—� ìž ê¹� 졸아서ì�¸ì§€ ì €ë²ˆì‹œê°„ì—� 반밖ì—� 못들어서였ì�„ì§€.. ì €ìž‘ê¶Œ ì�´ì•¼ê¸°ëŠ” 좀 ìƒ�ê°�나지만 나머지는 ë”ê°€ í�‰ì†Œë³´ë‹¤ ë�” 여기갔다 ì €ê¸°ê°”ë‹¤ 하는 바람ì—� 머리가 í˜¼ëž€ìŠ¤ëŸ¬ì› ë‚˜ë´�ìš”;; -김태진
- ì „ì²´ì �으로 다른 언어ì—�서는 ë³¼ 수 없는 ìž�ë°”ì�˜ 문법 + ê°�체지향 ì›�ì¹™ì�„ 중ì �ì �으로 다룬 시간ì�´ì—ˆìŠµë‹ˆë‹¤. 중간중간 다른 ì�´ì•¼ê¸°ë“¤(builder 패턴, ì €ìž‘ê¶Œ)ì�´ 들어갔지만 그래ë�„ 다룬 ì£¼ì œëŠ” ëª…í™•í•˜ë‹¤ê³ ìƒ�ê°�합니다. 다만 그걸 어떻게 ì“°ëŠ�ëƒ�는 í��릿한 ëŠ�낌입니다. 그건 아마ë�„ ê°� ì›�칙들ì�´ë‚˜ interface, ê°�ì²´ 등ì—� 대한 ëŠ�낌ì�„ 잡기 위해서는 경험ì�´ 좀 필요하기 때문ì�´ 아닌가 싶습니다 ;;; 수경ì�´ê°€ ë§�한 대로 한 번ì�´ë�¼ë�„ í•´ 본 사람ì�€ 알기 쉽다는 ë§�ì�´ ë§žì§€ 않ì�„까 싶네요. ê·¸ë¦¬ê³ ì „ì²´ì �으로 ì�´ì•¼ê¸°ë¥¼ 들으면서 현재 프로ì �트 중ì�¸ 코드가 ìž�꾸 ìƒ�ê°�나서 ì˜� ëŠ�낌ì�´ ì°�ì°�했습니다. 세미나를 들으면서 코드를 ìƒ�ê°�하니까 ê³ ì³�야 ë� 부분ì�´ 계ì†� ë³´ì�´ëŠ”êµ°ìš”. 그래ë�„ 나름대로 코드를 ê¹”ë�”하게 í•´ ë³´ë ¤ê³ í�´ëž˜ìФ 구조ë�„ ì •ë¦¬ë¥¼ 좀 í•˜ê³ í–ˆëŠ”ë�° ë�” 해야 í• ê²Œ ë§Žì�€ ëŠ�낌입니다. ã… ã… ê·¸ 외ì—�ë�„ ì�´ë²ˆ 시간ì—� 들었ë�˜ 메소드ì�˜ ì±…ìž„ì�´ ì–´ë””ì—� 나타나야 하는가(ê°�ì²´ or 메소드) ë�¼ê±°ë‚˜ ìƒ�ì†�ì�„ 너무 ê²�ë‚´ì§€ ë§�ë�¼ëŠ” ì�´ì•¼ê¸°ëŠ” ìƒ�당히 ëšœë ·í•˜ê²Œ 와 닿아서 좋았습니다. ì•„. DIPì—�서 Logicê³¼ native API 사ì�´ì—� ì¶”ìƒ�í™” ë ˆì�´ì–´ë¥¼ ë‘�는 것ë�„ ìƒ�당히 좋았는ë�° 기회가 ë�˜ë©´ ê¼ ì½”ë“œë¡œ ë³´ê³ ì‹¶ìŠµë‹ˆë‹¤. 아마 다ì�Œì—� 보게 ë�˜ê² 지만. - 서민관
3.5. 2012ë…„ 6ì›” 2ì�¼ ¶
- Serialize
- Abstraction layer
- Abstraction layer
- Inner Class, Nested Class(ë³´ê°•), Local Class, Static Inner Class
- Iterator (java.util)
- 우리가 아는 interface 사용
- generics 사용
- Collection ì�¼ë°˜í™”, 순차ì � 순회, 대부분ì�˜ ìž�료구조ì—�서 O(1), 변경하지 않는 한 thread safe
- but 중간ì—� 변화ì—� ìžˆì–´ì„ ê·¸ë‹¥
- 우리가 아는 interface 사용
- Iterable (java.lang)
- Iterator� 특징과 Iterable� 사용했� 때� 특징들� 공부하는 시간
- Comparable
- for Sorting.. stable, unstable
- for Sorting.. stable, unstable
3.5.1. 후기 ¶
- 지난시간ì—� ì�´ì�€ Inner Class와 Nested Classì�˜ ê°�ê°� 특징들 Encapsulationì�´ë�¼ë�˜ê°€ 확장성, 임시성, í�´ëž˜ìФ 파ì�¼ ìƒ�성ì�˜ 귀찮ì�Œì�„ ì œê±°í•œê²ƒì�´ ìƒˆë¡œì› ìŠµë‹ˆë‹¤. 사실 쓸ì�¼ì�´ 없어 안쓰긴 하지만 Event핸들러ë�¼ë�˜ê°€ 넘길때 ìž�주 ì‚¬ìš©í•˜ê±°ë“ ìš”.
Inner Classì—�서ì�˜ this는 Inner Class를 뜻합니다. ê·¸ë ‡ê¸° 때문ì—� Inner Class를 í�¬í•¨í•˜ëŠ” Classì�˜ this(현재 ê°�체를 뜻함)ì�„ ë¶ˆëŸ¬ì˜¤ë ¤ë©´ ìƒ�위í�´ëž˜ìФ.this를 ë¶™ì�´ë©´ ë�©ë‹ˆë‹¤.Iterator는 Utilì�´ì§€ë§Œ Iterableì�€ java.lang 패키지(íŠ¹ì • 패키지를 추가하지 ì•Šê³ ìž�ë°”ì�˜ 기본ì �ì�¸ type처럼 쓸수있는 패키지 구성ì�´ java.lang입니다)ì—� í�¬í•¨ë�˜ì–´ 있는ë�° interface를 통한 확장과 재구성으로 ì�¸ë�±ìФ(index)를 통한 순차ì �ì�¸ ìž�료 ì ‘ê·¼ 과는 다른 Iterator를 Javaì—�서 범용으로 쓰게 만들게 ë�œê²ƒìž…니다. ì˜ˆì œë¡œ DBì—�서 List를 한꺼번ì—� 넘겨 받아 로딩하는것ì�€ 100만개ì�˜ ì•„ì�´í…œì�´ 있다면 ì—„ì²ë‚œ 과부하를 겪게ë�˜ê³ Loadingë˜�한 ëŠ�립니다. 하지만 지금 ê°™ì�€ 세대ì—�는 실시간으로 보여주면서 Loadingë˜�한 ê°™ì�´ 하게 ë�˜ì£ . Iterator는 통해서는 ì�´ëŸ° 실시간 Loadingì�„ 좀ë�” 편하게 해줄 수 있게 í•´ì¤�니다. ë�¼ì�´ë¸ŒëŸ¬ë¦¬ ì—†ì�´ 구현하게 ë�˜ë©´ ìƒ�당히 빡셀 것 ê°™ì�€ ê°œë…�ì�„ iterator를 하나ì�˜ itrableì�´ëž€ ì�¸í„°íŽ˜ì�´ìŠ¤ë¡œ Javaì—�서는 기본 패키지로 Iterableì�„ 통해 Custom하게 구현하는 것ì�„ ë�„와주니 얼마나 ê³ ë§ˆìš´ê°€ìš”
여튼 �바는 대단합니다=ㅂ= Generic과 Sorting� 다른 분� 설명좀. - 김준�
3.6. 2012ë…„ 7ì›” 20ì�¼ ¶
- Java Generics
- run-time� type erasure
- 프로그래머� 타입 보장
- 프로그래머� 타입 보장
- run-time� type erasure
- Reflection API
- parameter 얻어오는 방법 세 가지.
- public field
- getter, setter가 존재하는 field
- @property annotation 사용
- public field
- parameter 얻어오는 방법 세 가지.
- Generics와 Reflection� �용한 ObjectMapper 만들기
- Map <-> Object 변환
- Map <-> Object 변환
3.6.1. 후기 ¶
- ë¦¬í”Œë ‰ì…˜ê³¼ ì œë„¤ë¦ìŠ¤ë¥¼ ì�¨ì„œ map -> object와 object -> mapì�„ 하는 부분ì�„ 해봤습니다. ìž�ë°”ì�˜ ì�¼ë°˜ì �ì�¸ 세 가지 ë°©ì‹�ì�˜ í�´ëž˜ìФ ë‚´ 변수ì—� 대해 getClass, getFields, getMethods를 사용해 private, 나 ì ‘ê·¼ìž�ê°€ 있는 경우ì�˜ ê°’ì�„ 받아왔습니다. getter를 사용해서 변수 ê°’ì�„ 받아올 때 ì�´ë¦„ì�´ get으로 시작하는 다른 함수를 ì œì™¸í•˜ê¸° 위해 method.getParameterTypes().length == 0 ê°™ì�€ 부분ì�€ ì�´ë ‡ê²Œ ì²´í�¬í•´ì•¼ ë�œë‹¤ëŠ” 부분ì�€ 나중ì—� ì œë„¤ë¦ìФ ê´€ë ¨ìœ¼ë¡œ ì�¨ë¨¹ì�„ë§Œ í• ê²ƒ 같습니다. ê·¸ë¦¬ê³ mapToObjectì—�서는 ë¬¸ì œê°€ 없었지만 objectToMapì�˜ 경우ì—�는 ì œë„¤ë¦ìФì�˜ type erase때문ì—� Class<T> expectedType = T.class; ê°™ì�€ 코드를 ì‚¬ìš©í• ìˆ˜ 없어서 map.put(field.getName(), (T)field.get(obj));ì—�서 형변환ì�˜ 타입 ì•ˆì „ì„±ì�„ 위해 ì�¸ìž�로 Class<T> valueTypeì�„ ë°›ì•„ì˜¤ê³ valueType.isAssignableFrom(field.getType())로 ì²´í�¬ë¥¼ 하는 부분ë�„ 공부가 ë§Žì�´ ë��습니다. - 서ì˜�주
3.7. 2012ë…„ 7ì›” 27ì�¼ ¶
- Annotation
- 외부 ��브러리 사용
- java.beans
- apache.commons.lang
- util함수들ì�„ ë§Žì�´ ì œê³µí•¨. 한 번ì—� 결과가 나옴.
- google� guava는 함수� 체��� 많� 사용함.
- 함수ì�˜ ì²´ì�´ë‹�ì�„ 위해서는 genericsê°€ 필요함. static method로는 ì²´ì�´ë‹�ì�„ í• ìˆ˜ ì—†ì�Œ.
- util함수들ì�„ ë§Žì�´ ì œê³µí•¨. 한 번ì—� 결과가 나옴.
- java.beans
3.7.1. 후기 ¶
- 웹 수업ì—�서 prototype 설명 때ë�„ 그랬지만 ë¨¼ì € ê°œë…�ì �ì�¸ 부분ì—� 대해서 기본ì �ì�¸ 구현ì�´ 어떻게 ë�˜ì–´ìžˆëŠ”ì§€ë¥¼ ë¨¼ì € ë°°ìš°ê³ ì�´ëŸ¬í•œ 기능들ì�„ ì‹¤ì œë¡œ ë�” 편하게 쓸 수 있는 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ëŠ” ì–´ë–¤ 것들ì�´ 있는지 배우니까 그냥 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë§Œ 아는 것보다 조금 ë�” 알기 쉬운 것 같습니다. ìœ ìš©í•œ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë“¤ì�´ 어떤게 있는지 ë�” ë§Žì�´ 가르ì³�주셨으면 ì¢‹ê² ìŠµë‹ˆë‹¤. Annotationì�€ 매번 쓰기만 했었는ë�° ì�´ë ‡ê²Œ 한 번 만들어보니까 ìƒ�ê°�보다 ì–´ë µì§€ëŠ” 않ì�€ 것 같습니다. - 서ì˜�주
3.9. 2012ë…„ 8ì›” 17ì�¼ ¶
- ObjectMapper (cont.)
- Data 부분� �터페�스로 분리 - 내부�서 FactoryMethod 패턴� 사용. factory를 통해서 �체를 �성한다. new를 사용하지 않기 때문� 구체 �래스를 숨길 수 있다.
- CsvData - dataì�˜ 구체 í�´ëž˜ìФ. ë‚´ë¶€ì—�서 ì†�ë�„ì�˜ í–¥ìƒ�ì�„ 위해서 ì—색ì�¸ ë°©ì‹�ì�„ 사용.
- CsvData - dataì�˜ 구체 í�´ëž˜ìФ. ë‚´ë¶€ì—�서 ì†�ë�„ì�˜ í–¥ìƒ�ì�„ 위해서 ì—색ì�¸ ë°©ì‹�ì�„ 사용.
- Data 부분� �터페�스로 분리 - 내부�서 FactoryMethod 패턴� 사용. factory를 통해서 �체를 �성한다. new를 사용하지 않기 때문� 구체 �래스를 숨길 수 있다.
- Maven - ì�˜ì¡´ì„±(dependency)ì�„ 관리해 주는 툴. pom.xmlì—� 프로ì �트ì�˜ ì�˜ì¡´ì„± ê´€ë ¨ ì •ë³´ë¥¼ ì �으면 ì €ìž¥ì†Œ(repository)ì—�서 ê´€ë ¨ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ 파ì�¼ë“¤ì�„ 받아서 빌드ì—� í�¬í•¨ì‹œì¼œ 준다.
- m2e plugin - maven과 eclipse는 빌드를 다른 방�으로 하기 때문� maven� �존성� eclipse� �존성과 연결해주기 위해서 사용하는 plugin.
- ë�¼ì�´ë¸ŒëŸ¬ë¦¬ 파ì�¼(jar) 만들기(Run as -> Maven Install) - ObjectMapper를 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ì™€ í�´ë�¼ì�´ì–¸íЏ 프로ì �트로 분리.
- Maven Build ê³¼ì •
- resources - src/main/resources ì„¤ì •íŒŒì�¼ 등ì�„ target/classes로 ì „ë‹¬. javac를 사용하지 않는다.
- mvn compile - src/main/java� 있는 소스파�� 컴파�해서 .class를 만들어 target/classes로 보낸다.
- test-resourecs - src/test/resourcesì�˜ ì„¤ì •íŒŒì�¼ 등ì�„ target/test-classes로 ì „ë‹¬.
- mvn test - 컴파ì�¼ì�„ í•˜ê³ ë‚˜ì„œ src/test/java를 컴파ì�¼í•´ì„œ target/test-classes로. @Test 실행 <scope>ê°€ ì–¸ì œ 사용ë�˜ëŠ”ì§€ ê²°ì •
- mvn package - 패키징. pom.xml� <packaging>� 따른 파� �성. 기본� jar파� �성.
- mvn install - 패키징� 파�, pom� .m2/repository� 집어넣는다.
- mvn deploy - 리모트 리�지터리� ��브러리 파�� 배�.
- mvn release
- resources - src/main/resources ì„¤ì •íŒŒì�¼ 등ì�„ target/classes로 ì „ë‹¬. javac를 사용하지 않는다.
- resolve dependencies from workspace projects
- ë�¼ì�´ë¸ŒëŸ¬ë¦¬ 코드ì—� 변경ì�´ 있ì�„ 시 maven installì�„ 다시 하지 않으면 í�´ë�¼ì�´ì–¸íЏ 프로ì �트ì—�서 ë¬¸ì œê°€ ìƒ�길 수 있다.
- ì²´í�¬ê°€ ë�˜ì–´ìžˆì�„ 경우 maven ì�˜ì¡´ì„±ê³¼ 별개로 워í�¬ìŠ¤íŽ˜ì�´ìФ 안ì—� 있는 프로ì �트를 ì°¸ì¡°í• ìˆ˜ 있게 해준다.
- maven ì�˜ì¡´ì„±ê³¼ ì�´í�´ë¦½ìФ ì�˜ì¡´ì„±ê°„ì�˜ ì°¨ì�´ê°€ ë°œìƒ�í• ìˆ˜ 있다.
- ë�¼ì�´ë¸ŒëŸ¬ë¦¬ 코드ì—� 변경ì�´ 있ì�„ 시 maven installì�„ 다시 하지 않으면 í�´ë�¼ì�´ì–¸íЏ 프로ì �트ì—�서 ë¬¸ì œê°€ ìƒ�길 수 있다.
- m2e plugin - maven과 eclipse는 빌드를 다른 방�으로 하기 때문� maven� �존성� eclipse� �존성과 연결해주기 위해서 사용하는 plugin.
3.10. 2012ë…„ 9ì›” 22ì�¼ ¶
- Properties
- map과 비슷한 구조.
- ê°’ì�„ ê°€ì ¸ì˜¤ëŠ” 함수를 getProperty와 getì�˜ ë‘� 가지를 ì œê³µí•œë‹¤.
- getProperty는 Stringì�„ 반환, getì�€ Object를 반환 - ì œë„¤ë¦ì�´ 없었ì�„ 때ì—�는 Object를 받아올 수밖ì—� 없었는ë�° ì�¼ë°˜ì �으로 받아서 쓰는 ê°’ì�´ Stringì�´ì—ˆê¸° 때문ì—� 사용ìž�ì�˜ 형변환ì�„ 피하기 위해 getProperty를 따로 ì œê³µí–ˆì�Œ.
- ê°’ì�„ ê°€ì ¸ì˜¤ëŠ” 함수를 getProperty와 getì�˜ ë‘� 가지를 ì œê³µí•œë‹¤.
- map과 비슷한 구조.
- Reader와 InputStream� 차�
- ì�¸ì½”딩 ë¬¸ì œì�˜ ì°¨ì�´. ì�¸ì½”딩 ë¬¸ì œë¥¼ 해결하기 위해서 Reader, Writer를 만들었다. Reader는 ì�¸ì½”딩 ì •ë³´ë¥¼ ë“¤ê³ ìžˆì–´ì•¼ 한다.
- ì�¸ì½”딩 ë¬¸ì œì�˜ ì°¨ì�´. ì�¸ì½”딩 ë¬¸ì œë¥¼ 해결하기 위해서 Reader, Writer를 만들었다. Reader는 ì�¸ì½”딩 ì •ë³´ë¥¼ ë“¤ê³ ìžˆì–´ì•¼ 한다.
- JDBC - ê°� ë�°ì�´í„°ë“¤ì—� 대한 ì ‘ê·¼ 표준 ì�¸í„°íŽ˜ì�´ìФ
- java.sql.driver �터페�스를 com.mysql.jdbc.driver �래스로 구현, java.sql.connection �터페�스를 com.mysql.jdbc.connection �래스로 구현
- driverì—�서 connectionì�„ 얻어오는 부분ì—� 대해서는 abstract factoryê°€ 사용ë�¨ - ì¶”ìƒ�타입으로부터 ì¶”ìƒ�타입ì�„ ë§Œë“ ë‹¤.
- driverì—�서 connectionì�„ 얻어오는 부분ì—� 대해서는 abstract factoryê°€ 사용ë�¨ - ì¶”ìƒ�타입으로부터 ì¶”ìƒ�타입ì�„ ë§Œë“ ë‹¤.
- java.sql.driver �터페�스를 com.mysql.jdbc.driver �래스로 구현, java.sql.connection �터페�스를 com.mysql.jdbc.connection �래스로 구현
java.sql.Driver driver = new com.mysql.jdbc.Driver();
java.sql.Connection conn = driver.connect("", null); // 구현체 중 com.mysql.jdbc.connection� 반환.
//추�타입 �체� driver로부터 추�타입 �체� conn �성
- abstract factory를 잘 쓰기 위해서는 �터페�스� api가 잘 설계�어 있어야 한다.
- Statement, ResultSet� 대해서� 마찬가지로 �터페�스를 �용한 abstract factory가 사용�.
- driverì�˜ ì„¤ì •ì—�서 new com.mysql.jdbc.Driver(); ëŒ€ì‹ ë³¼ 수 있는 Class.forName("com.mysql.jdbc.Driver"); ì�´ëŸ¬í•œ 코드는 컴파ì�¼ 타임 종ì†�성ì�„ 런타임 종ì†�성으로 바꾼 것ì�´ë‹¤.
Driver driver = new com.mysql.jdbc.Driver(); // 처럼 ì§�ì ‘ 구체í�´ëž˜ìŠ¤ë¡œ new를 하는 대ì‹
Class<Driver> clazz = (Class<Driver>) Class.forName("com.mysql.jdbc.Driver");
Driver driver = clazz.newInstance(); // 같� 방법으로 런타임 종�성으로 바꿀 수 있�.
- 예외�황� 런타임으로 밀어낸 것�기 때문� �러� 대해서는 � 위험해질 수� 있다.
- factory method 패턴 사용 - factory를 숨겨주는 메소드. ë˜ ë§Œë“¤ì§€ë¥¼ ì�¸ìž�ë§Œ ê°€ì§€ê³ ê²°ì •í•˜ëŠ” 함수. 위ì—�서는 ì�¸ìž�로 주는 문ìž�ì—´ì—� ë”°ë�¼("com.mysql.jdbc.Driver") 무엇ì�„ 만들어줄지가 ê²°ì •ë�œë‹¤.
- DriverManager í�´ëž˜ìŠ¤ë¥¼ 사용하면 ì§�ì ‘ driver를 ê°€ì ¸ì™€ì„œ connectionì�„ 얻어오지 않아ë�„ 바로 connectionì�„ 얻어올 수 있다. ì�´ë ‡ê²Œ ì¶”ìƒ�화를 해준 것ì�´ DataSource í�´ëž˜ìФ.
- sqlite
- 기존� dbms와 다르게 dbms가 � 어플리케�션 내부� 들어가서 �작하는 것.
- 분산환경ì�˜ 경우 os단ì—�서 ìƒ�í˜¸ë°°ì œë¥¼ 해주지 못하기 때문ì—� ë�™ì‹œì„± ì œì–´ì—� ë¬¸ì œê°€ 있ì�„ 수 있다. ë”°ë�¼ì„œ 분산환경ì—�서ì�˜ 사용ì�€ 좋지 못하다.
- 기존� dbms와 다르게 dbms가 � 어플리케�션 내부� 들어가서 �작하는 것.
3.11. 2012ë…„ 10ì›” 6ì�¼ ¶
- DataSource와 DriverManager� 차�
- Persistence Layer
- persistance layer는 외부 ë ˆì�´ì–´ë¥¼ ë§Žì�´ 쓰기 때문ì—� 예외가 ë§Žì�´ ìƒ�ê¹€.
- �러한 예외가 비즈니스 로�까지 올�가게 하면 안�.
- 예외가 올ë�¼ê°€ê²Œ ë� 경우는 예외를ì�„ 한 단계 ì¶”ìƒ�화해서 ì˜¬ë ¤ì£¼ëŠ” 것ì�´ 좋다.
- persistance layer는 외부 ë ˆì�´ì–´ë¥¼ ë§Žì�´ 쓰기 때문ì—� 예외가 ë§Žì�´ ìƒ�ê¹€.
- DataBase ì •ê·œí™”(Normalize)
- ë�°ì�´í„°ë¥¼ í…Œì�´ë¸”로 ì €ìž¥í• ë•Œ 중복ë�œ ê°’ì�´ 있는 경우ì—�는 í…Œì�´ë¸”ì�´ ë‚˜ëˆ ì ¸ìžˆëŠ” 경우와 비êµ�해서 다른 í…Œì�´ë¸”ì�„ 찾지 않아ë�„ ë�˜ê¸° 때문ì—� 검색 비용ì�´ ì �다.
- 하지만 중복ë�œ ê°’ì�´ 있는 경우ì—�는 ì—…ë�°ì�´íŠ¸ì‹œ ê°’ì�´ 있는 부분ì�„ ì „ë¶€ 찾아서 ìˆ˜ì •í•´ì•¼ 하므로 ì—…ë�°ì�´íЏ 비용ì�´ 비싸다.
- 반대로 ë�°ì�´í„°ì�˜ 중복ì�„ ì—†ì• ê³ í…Œì�´ë¸”ì�„ 나눴ì�„ 경우는 ì—…ë�°ì�´íЏ 비용ì�´ ì¤„ì–´ë“¤ê³ ê²€ìƒ‰ì�˜ 비용ì�´ 늘어난다.
- ì—…ë�°ì�´íŠ¸ì™€ 검색ì�€ íŠ¸ë ˆì�´ë“œ 오프.
- ì •ê·œí™”ë¥¼ í• ê²½ìš° í…Œì�´ë¸”ê°„ì�˜ 중복ë�œ ê°’ì�„ 없앤다.
- ë�°ì�´í„°ë¥¼ í…Œì�´ë¸”로 ì €ìž¥í• ë•Œ 중복ë�œ ê°’ì�´ 있는 경우ì—�는 í…Œì�´ë¸”ì�´ ë‚˜ëˆ ì ¸ìžˆëŠ” 경우와 비êµ�해서 다른 í…Œì�´ë¸”ì�„ 찾지 않아ë�„ ë�˜ê¸° 때문ì—� 검색 비용ì�´ ì �다.
- Builder 패턴
- 빌ë�”ë�¼ëŠ” 가변ê°�체를 만들어서 ìƒ�태를 계ì†� ë³€ê²½ì‹œí‚¤ê³ ë§ˆì§€ë§‰ì—� ë§Œë“ ë‹¤. 그래서 중간ì—� ì²´ì�¸ì�„ 하나씩 ë�Šì–´ë�„ ë�œë‹¤. 가변체ì�´ë‹� ë°©ì‹�.
- 빌ë�”ë�¼ëŠ” 가변ê°�체를 만들어서 ìƒ�태를 계ì†� ë³€ê²½ì‹œí‚¤ê³ ë§ˆì§€ë§‰ì—� ë§Œë“ ë‹¤. 그래서 중간ì—� ì²´ì�¸ì�„ 하나씩 ë�Šì–´ë�„ ë�œë‹¤. 가변체ì�´ë‹� ë°©ì‹�.
Resource resource = new JdbcResource.Builder()
.setUrl("jdbc:mysql://zeropage.org:3306/test")
.setUser("test")
.setPassword("test")
.setTable("people")
.create();
- 위와 ê°™ì�€ ì²´ì�¸ì‹�ì�˜ 문법으로 ì„¤ì •ì�„ 추가해가며 마지막ì—� ê°�체를 ìƒ�성하는 ë°©ì‹�ì�„ 사용한다.
- ì„¤ì •ì�„ 따로 빼내기 ì¢‹ê³ , setì�„ private함수로 바꿔서 불변ê°�체를 만들 수ë�„ 있다. ì�´ë ‡ê²Œ í• ê²½ìš° ìŠ¤ë ˆë“œ 환경ì—�ë�„ 조금 ë�” ì•ˆì „í•´ì§„ë‹¤.
- ì²´ì�¸ë¬¸ë²•ì�˜ 장ì � - ì²´ì�¸ì�„ 쓸지 ë§�지를 ì„ íƒ�í• ìˆ˜ 있다.
3.12. 2012ë…„ 10ì›” 20ì�¼ ¶
- uri와 url� 비�
- uniform resource identifier와 locatord� 약�. uri가 url보다 � � 개��다.
- mapì—�서 ìž�료를 ê°€ì ¸ì™€ì„œ equals로 비êµ�를 í• ë•Œ urlì�€ ì‹¤ì œë¡œ ê°€ì ¸ì˜¨ ë‚´ìš©ì�´ ê°™ì�€ì§€ 비êµ�í•˜ê³ uri는 ì‹�별ìž�ê°€ ê°™ì�€ì§€ë§Œ 비êµ�한다.
- urlì�˜ equals는 비êµ�를 í•˜ë ¤ë©´ ìž�료를 ê°€ì ¸ì™€ì•¼ 하기 때문ì—� 성능ì�˜ ë‚비가 심하다. ë”°ë�¼ì„œ ì‹¤ì œë¡œ ìž�료가 ê°™ì�€ì§€ 비êµ�해야 í• ë•Œì—�ë§Œ urlì�„ 사용하는 것ì�´ 좋다.
- url과 uri는 서로 toURI, toURL� 지�한다.
- uri� 기준� url� 기준보다 � 엄격하다.
- uniform resource identifier와 locatord� 약�. uri가 url보다 � � 개��다.
- abstract factory패턴과 factory method 패턴� 구분
- �성 메소드를 호출하는 �스턴스� 타입, 메소드� 들어가는 ��� � 가지가 새로 �성�는 �스턴스� �향� 주는 경우 abstract factory
- ìƒ�성 메소드ì�˜ ì�¸ìž�만으로 ìƒ�성ë�˜ëŠ” ì�¸ìŠ¤í„´ìŠ¤ì�˜ 타입ì�´ ê²°ì •ë� 경우 factory method
- �성 메소드를 호출하는 �스턴스� 타입, 메소드� 들어가는 ��� � 가지가 새로 �성�는 �스턴스� �향� 주는 경우 abstract factory
- abstract factory는 확장 위주ì�˜ 패턴ì�´ë‹¤. ìž�ë°” í”„ë ˆìž„ 워í�¬ì—�서는 apiì�˜ 확장ì�´ 중요하기 때문ì—� ìž�주 ë³´ì�´ì§€ë§Œ ì�¼ë°˜ì �ì�¸ 어플리케ì�´ì…˜ì—�서는 확장성ì�„ ì œê³µí• í•„ìš”ì„±ì�´ ì �기 때문ì—� ë§Žì�´ 나타나지 않는다.
- PushbackInputStream �래스
- lookahead inputstream. 기존ì�˜ input streamì�€ 한 번 read하면 ë��나지만 lookahead 버í�¼ë¥¼ ê°€ì§€ê³ ìžˆì–´ì„œ 한 번 read한 후ì—� 다시 read하기 ì „ì�˜ ìƒ�태로 ë�Œì•„ê°ˆ 수 있다.
- �바�서는 inputstream� 대한 지�� 많기 때문� 반환 결과를 inputstream으로 만들 수 있으면 처리가 쉬워진다.
- lookahead inputstream. 기존ì�˜ input streamì�€ 한 번 read하면 ë��나지만 lookahead 버í�¼ë¥¼ ê°€ì§€ê³ ìžˆì–´ì„œ 한 번 read한 후ì—� 다시 read하기 ì „ì�˜ ìƒ�태로 ë�Œì•„ê°ˆ 수 있다.
- strategy 패턴, command 패턴, template method 패턴
- 행�� 확장하기 위한 패턴�다.
- strategy 패턴 - command 패턴
- strategy 패턴ì�€ ì „ì²´ì �ì�¸ í‹€(logic)ì�´ ì§œì—¬ì ¸ ìžˆê³ ê·¸ 안ì—� íŠ¹ì • í–‰ë�™ì�„ 확장하기 위해 ì „ëžµ ê°�체를 사용한다.
반면ì—� command 패턴ì�€ 따로 í‹€ì�´ ì—†ê³ ë³´ë‹¤ 범용ì �으로 사용ë�œë‹¤.
- strategy 패턴ì�€ ì „ì²´ì �ì�¸ í‹€(logic)ì�´ ì§œì—¬ì ¸ ìžˆê³ ê·¸ 안ì—� íŠ¹ì • í–‰ë�™ì�„ 확장하기 위해 ì „ëžµ ê°�체를 사용한다.
- strategy 패턴 - template method 패턴
- strategy 패턴ì�€ ì�¸í„°íŽ˜ì�´ìŠ¤ë¡œ 만들어 ë‘” ì „ëžµ ê°�ì²´ í�´ëž˜ìŠ¤ë¥¼ 구현(implementation)하는 ë°©ì‹�으로 í–‰ë�™ì�„ 확장한다.
반면ì—� template method 패턴ì�€ 부모 í�´ëž˜ìФì—�서 ì „ì²´ì �ì�¸ í‹€ì�„ 만들어 ë‘�ê³ í–‰ë�™ì—� 해당하는 메소드를 ìƒ�ì†� + 오버ë�¼ì�´ë“œ 해서 확장한다.
- strategy 패턴ì�€ ì�¸í„°íŽ˜ì�´ìŠ¤ë¡œ 만들어 ë‘” ì „ëžµ ê°�ì²´ í�´ëž˜ìŠ¤ë¥¼ 구현(implementation)하는 ë°©ì‹�으로 í–‰ë�™ì�„ 확장한다.
- 행�� 확장하기 위한 패턴�다.
3.13. 2012ë…„ 11ì›” 3ì�¼ ¶
- ~let : 외부� 컨테�너�서 ��프사��� 관리해주는 프로그램. 안드로�드� activity같� 경우 외부�서 실행시켜서 �작하게 �. 그것과 비슷한 것.
- applet : 어플리케ì�´ì…˜(브ë�¼ìš°ì €)ìƒ�ì—�서 ë�Œì•„가는 ìž‘ì�€ 프로그램.
- servlet : 서버ìƒ�ì—�서 ë�Œì•„가는 ìž‘ì�€ 프로그램. 아파치 웹서버ì�˜ 모듈 ë°©ì‹�(외부ì—�서 http requestê°€ ë‚ ì•„ì˜¤ë©´ 서버가 받아서 알맞ì�€ 모듈ì—� ì „ë‹¬í•´ì¤Œ.)처럼 만들어 놓ì�€ 것.
- portlet : �탈(관리프로그램 등)��서 �아가는 작� 프로그램.
- applet : 어플리케ì�´ì…˜(브ë�¼ìš°ì €)ìƒ�ì—�서 ë�Œì•„가는 ìž‘ì�€ 프로그램.
- javaSE, javaEE : java스펙� 집합.
- javaSE : JLS(java language specification) + java api를 가리킴. ìž�ë°”ì�˜ ì‹¤ì œ 문법과 언어ì—� 필요한 기본ì �ì�¸ 기능들. 참조 구현체로는 hotspot JVMì�´ 있다.
- javaEE : SE ì�´ì™¸ì�˜ 표준 스펙들ì�„ 다 모아서 javaEEë�¼ê³ 함. javaSE 외ì�˜ 추가ì �ì�¸ 기능들ì�´ 들어ê°�. javaEEì—�서 ì œì�¼ 잘 ì•Œë ¤ì§„ 스펙ì�´ servletì�´ë‹¤. 참조 구현체로는 tomcatê³¼ glassfishê°€ 있다. tomcatì�€ servletì�˜ 스펙만 ë§Œì¡±ì‹œí‚¤ê³ javaEEì�˜ ì „ì²´ 스펙ì�„ 만족시키지는 않지만 glassfish는 javaEEì�˜ ëª¨ë“ ìŠ¤íŽ™ì�„ 만족시킨다.
- tomcat� servlet container지만 glassfish는 WAS(web application server)� 해당한다.
- javaSE : JLS(java language specification) + java api를 가리킴. ìž�ë°”ì�˜ ì‹¤ì œ 문법과 언어ì—� 필요한 기본ì �ì�¸ 기능들. 참조 구현체로는 hotspot JVMì�´ 있다.
- DIP (depencency inversion principle) : 구체í�´ëž˜ìŠ¤ë¥¼ ì‚¬ìš©í• ë•Œ 구체í�´ëž˜ìŠ¤ë¥¼ ì§�ì ‘ 사용하지 ì•Šê³ ì¶”ìƒ�í™” ë�œ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 통해서 사용하게 하는 ë””ìž�ì�¸ 패턴.
- JPAì�˜ 구체 í�´ëž˜ìŠ¤ë¡œ eclipse link와 hibernateê°€ 있는ë�°, ê°�ê°�ì�„ ì‚¬ìš©í• ë•Œ 구체 í�´ëž˜ìŠ¤ë¥¼ 통해서 사용하지 ì•Šê³ JPA ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 통해서 사용하ë�„ë¡� 하면 나중ì—� 구체 í�´ëž˜ìŠ¤ë¥¼ 바꾸기 쉽다.
- JPAì�˜ 구체 í�´ëž˜ìŠ¤ë¡œ eclipse link와 hibernateê°€ 있는ë�°, ê°�ê°�ì�„ ì‚¬ìš©í• ë•Œ 구체 í�´ëž˜ìŠ¤ë¥¼ 통해서 사용하지 ì•Šê³ JPA ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 통해서 사용하ë�„ë¡� 하면 나중ì—� 구체 í�´ëž˜ìŠ¤ë¥¼ 바꾸기 쉽다.
- tomcat� servlet� 배� 시 내부� �작
- tomcatì—� servletì�„ ë°°í�¬í•˜ëŠ” 것ì�€ servletì�„ êµ¬ì„±í•˜ê³ ìžˆëŠ” í�´ëž˜ìŠ¤ë¥¼ tomcatì�˜ í�´ëž˜ìŠ¤íŒ¨ìŠ¤ì—� 집어넣는 것ì�„ ë§�한다. javaì�˜ 특성 ìƒ� tomcatì�´ 실행ë�œ ì�´í›„ì—� í�´ëž˜ìŠ¤íŒ¨ìŠ¤ì—� 나중ì—� 추가ë�œ í�´ëž˜ìŠ¤ë¥¼ 집어넣어서 ë�™ì � 로딩ì�„ í• ìˆ˜ 있다.
- servletì�˜ war(web archive)파ì�¼ì�„ 넣어주면 tomcatë‚´ë¶€ì�˜ watcherê°€ war파ì�¼ì�˜ ì •ë³´ë¥¼ ì�½ì–´ì„œ 추가ë�œ í�´ëž˜ìŠ¤ë¥¼ ë�™ì �으로 로딩해 준다.
- servlet í�´ëž˜ìФì�˜ 로딩 순서 : jvmì—�서 tomcatì�˜ mainí�´ëž˜ìŠ¤ë¥¼ ì§„ìž…ì �ì—� 로딩한다 -> deployment descriptionì—� 언급ë�˜ì–´ìžˆëŠ” servletí�´ëž˜ìŠ¤ë¥¼ tomcatì�˜ ì§„ìž…ì �ì—� 로딩한다.
- tomcatì—� servletì�„ ë°°í�¬í•˜ëŠ” 것ì�€ servletì�„ êµ¬ì„±í•˜ê³ ìžˆëŠ” í�´ëž˜ìŠ¤ë¥¼ tomcatì�˜ í�´ëž˜ìŠ¤íŒ¨ìŠ¤ì—� 집어넣는 것ì�„ ë§�한다. javaì�˜ 특성 ìƒ� tomcatì�´ 실행ë�œ ì�´í›„ì—� í�´ëž˜ìŠ¤íŒ¨ìŠ¤ì—� 나중ì—� 추가ë�œ í�´ëž˜ìŠ¤ë¥¼ 집어넣어서 ë�™ì � 로딩ì�„ í• ìˆ˜ 있다.
- servlet 실행
- template method 패턴ì�´ 사용ë��다. protected로 ì„ ì–¸ë�œ service methodê°€ template methodì—� 해당ë�˜ëŠ”ë�° abstractê°€ 아닌 ì�´ìœ 는 기본 구현ì�„ ì£¼ê³ ì›�하는 호출ì—� 대해 오버ë�¼ì�´ë“œë¥¼ 해서 사용하기 위함ì�´ë‹¤.
- init : servletì�´ 불러와지면 ë¨¼ì € 실행ë�˜ëŠ” method. initì�´ 실행ë�˜ì§€ 않으면 servletì�´ 로딩ë�˜ì§€ 않는다.
- destoy : servletì�´ 종료ë� 시 실행ë�˜ëŠ” method.
- service : 외부ì—�서 서버로 requestê°€ 들어올 시 서버ì—�서 servletì�˜ service method를 실행시킴. service(req, res) ë‚´ë¶€ì—�서 req를 통해 requestì�˜ ê°’ì�„ 받아서 resì�˜ ê°’ì�„ 변경시켜 외부로 내보내준다. 해당 결과를 do*ì�˜ ì�´ë¦„ì�´ ë¶™ì�€ method(doGet, doPost 등)로 ì „ë‹¬í•´ì¤€ë‹¤.
- do* : 해당 httpMethod� 대한 처리를 해주는 method.
- template method 패턴ì�´ 사용ë��다. protected로 ì„ ì–¸ë�œ service methodê°€ template methodì—� 해당ë�˜ëŠ”ë�° abstractê°€ 아닌 ì�´ìœ 는 기본 구현ì�„ ì£¼ê³ ì›�하는 호출ì—� 대해 오버ë�¼ì�´ë“œë¥¼ 해서 사용하기 위함ì�´ë‹¤.
3.14. 2012ë…„ 11ì›” 10ì�¼ ¶
- jar와 war� 차�
- war : src/main� 있는 webapp �� 내부� 있는 파�� root로 오게 �다.
- src/main/java, src/main/resources 가 war� WEB-INF �� 내부� classes 내부� 위치하게 �다.
- src/main/java, src/main/resources 가 war� WEB-INF �� 내부� classes 내부� 위치하게 �다.
- jar : src/main/java, src/main/resources ��가 root로 오게 �다.
- war : src/main� 있는 webapp �� 내부� 있는 파�� root로 오게 �다.
- http ìš”ì²ì�´ servletì—� ì „ë‹¬ë�˜ê¸°ê¹Œì§€ ê³¼ì •
- httpìš”ì²(http://hostname/contextPath/path?params) -> contextPath를 ë³´ê³ í•´ë‹¹í•˜ëŠ” war를 ì°¾ì�Œ -> war ë‚´ë¶€ì�˜ web.xmlì�„ ë³´ê³ <servlet-mapping>ì�˜ ì •ë³´ë¥¼ ë³´ê³ í•´ë‹¹ 주소ì—� 매핑ë�œ servletì�„ 찾는다. -> 해당하는 servletì�´ ì—†ì�„ 경우 defalut servletì�´ 처리
- httpìš”ì²(http://hostname/contextPath/path?params) -> contextPath를 ë³´ê³ í•´ë‹¹í•˜ëŠ” war를 ì°¾ì�Œ -> war ë‚´ë¶€ì�˜ web.xmlì�„ ë³´ê³ <servlet-mapping>ì�˜ ì •ë³´ë¥¼ ë³´ê³ í•´ë‹¹ 주소ì—� 매핑ë�œ servletì�„ 찾는다. -> 해당하는 servletì�´ ì—†ì�„ 경우 defalut servletì�´ 처리
- servlet filter chain
- requestê°€ servlet으로 ì „ë‹¬ë�˜ê¸° ì „ì—� filter chainì�„ 걸어서 여러 servletì—� ì�¼ê´„ì �ì�¸ ë�™ìž‘ì�„ 해줄 수 있ì�Œ.
- request -> Servlet Container -> Filter -> Servlet
- response <- Servlet Container <- Filter <- Servlet
- requestê°€ servlet으로 ì „ë‹¬ë�˜ê¸° ì „ì—� filter chainì�„ 걸어서 여러 servletì—� ì�¼ê´„ì �ì�¸ ë�™ìž‘ì�„ 해줄 수 있ì�Œ.
- servlet� thread safety
- servletì�€ thread per request 구조로 하나ì�˜ servlet ê°�ì²´ê°€ 여러개ì�˜ ìŠ¤ë ˆë“œì—�서 호출ë�˜ëŠ” 구조.
- filter, servletì�€ 하나ì�˜ ê°�체를 urlì—� 매핑해서 여러 ìŠ¤ë ˆë“œì—�서 ì“°ì�´ëŠ” 것임. ë”°ë�¼ì„œ thread-safe 해야 한다.
- thread-safe하기 위해서는 stateful해서는 안 ë�œë‹¤. Servletì�´ stateless하ë�”ë�¼ë�„ ë‚´ë¶€ì—� stateful한 ê°�체를 ë“¤ê³ ìžˆìœ¼ë©´ ê²°êµì�€ stateful하게 ë�œë‹¤. ìž�주 하는 실수ì�´ë¯€ë¡œ 조심하ë�„ë¡� 하ìž�.
- 처리 방법 : ê³µìœ ë�˜ëŠ” 변수를 ì“°ì§€ ë§�ê³ í•¨ìˆ˜ ë‚´ì—�서만 사용하는 ì§€ì— ë³€ìˆ˜ë¥¼ 사용하ë�„ë¡� 하ìž�,
- servletì�€ thread per request 구조로 하나ì�˜ servlet ê°�ì²´ê°€ 여러개ì�˜ ìŠ¤ë ˆë“œì—�서 호출ë�˜ëŠ” 구조.
3.15. 2012ë…„ 12ì›” 23ì�¼ ¶
- IME(Input Method Editor) - OS ë ˆë²¨ì—�서 ì‹¤ì œ key code - 문ìž�ì�˜ mappingê³¼ 문ìž� ì¡°í•©('ã…�' + 'ã…�' ê°™ì�€ 경우)ì�˜ 처리를 í•´ 주는 소프트웨어. Sublimeì—�서는 ì œëŒ€ë¡œ 처리를 안 í•´ 줬다...
- JNI(Java Native Interface)
- Javaì—�서 다른 언어(C언어)로 ë�œ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ ë�™ì �으로 호출해서 ì‚¬ìš©í• ìˆ˜ 있ë�„ë¡� í•´ 주는 방법.
- 소스 코드ì�˜ 컴파ì�¼ ê³¼ì •ì—�서 load ê³¼ì •ì—� 해당하는 ê¸°ìˆ .
- .java 파ì�¼ì—�는 í�´ëž˜ìФ ë‚´ì—� native modifier를 ë¶™ì�¸ 메소드를 ìž‘ì„±í•˜ê³ , .c, .cpp 파ì�¼ì—�는 Javaì—�서 호출ë� 함수ì�˜ 구현ì�„ 작성한다. ì�´í›„ System.loadLibrary(...) 함수를 ì�´ìš©í•´ì„œ .dll 파ì�¼(Windowsì�˜ 경우) ë˜�는 .so(shared object) 파ì�¼(Linuxì�˜ 경우)ì�„ ë�™ì �으로 로드한다.
- ë�¼ì�´ë¸ŒëŸ¬ë¦¬ 파ì�¼ì�˜ 함수는 íŠ¹ì •í•œ naming conventionì�„ 지켜서 작성해야 í•˜ê³ , ì�¸ìž�ë�„ 반드시 몇몇 ì •í•´ì§„ ì�¸ìž�들ì�„ 받아야 한다. ë˜�한 Java와 타입ì�„ 호환시키기 위해 C, C++ì—�서 íŠ¹ì •í•œ 구조체들ì�„ 사용해야 한다. 해당 구조체들ì�€ jni.hì—� ì •ì�˜ë�˜ì–´ 있다.
- ë�„움ì�´ ë� 만한 사ì�´íЏ http://bumworld.dayindayout.co.kr/?p=799
- ë�„움ì�´ ë� 만한 사ì�´íЏ http://bumworld.dayindayout.co.kr/?p=799
- ì‹¤ì œ 사용하기ì—�는 naming conventionì�„ 지켜서 함수를 작성하기는 귀찮기 때문ì—� native를 가진 .class 파ì�¼ì�„ javahì—� 넣으면 conventionì�„ 지킨 .h 파ì�¼ì�„ 만들어 준다.
- .cpp 파ì�¼ë¡œ 작성했ì�„ 때 사용하는 extern "C"는 함수 호출 규약(__cdecl, __stdcall)ê³¼ ê´€ë ¨ë�œ 부분ì�´ë‹¤. extern "C"를 ì �어주는 것으로 __cdecl로 함수를 호출하ë�„ë¡� 한다.
- ë�¼ì�´ë¸ŒëŸ¬ë¦¬ 파ì�¼ì�˜ 함수는 íŠ¹ì •í•œ naming conventionì�„ 지켜서 작성해야 í•˜ê³ , ì�¸ìž�ë�„ 반드시 몇몇 ì •í•´ì§„ ì�¸ìž�들ì�„ 받아야 한다. ë˜�한 Java와 타입ì�„ 호환시키기 위해 C, C++ì—�서 íŠ¹ì •í•œ 구조체들ì�„ 사용해야 한다. 해당 구조체들ì�€ jni.hì—� ì •ì�˜ë�˜ì–´ 있다.
- Javaì—�서 다른 언어(C언어)로 ë�œ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ ë�™ì �으로 호출해서 ì‚¬ìš©í• ìˆ˜ 있ë�„ë¡� í•´ 주는 방법.
3.16. 2013ë…„ 1ì›” 6ì�¼ ¶
- JVM & Java Byte Code
- JVM - stack-based machine
- register-based machineê³¼ì�˜ ì°¨ì�´ëŠ” ì—°ì‚°ì—� 사용ë�˜ëŠ” operandì�˜ ì°¨ì�´. register-basedì—�서는 registerì—�서 operand를 ê°€ì ¸ì˜¤ê³ stack-basedì—�서는 stackì—�서 pop해서 ê°€ì ¸ì˜¨ë‹¤.
- stack-based machineì�˜ 경우 register-based machineì—� 비해 push, popì�´ 많아서 ì†�ë�„ê°€ 조금 ëŠ�리지만 register를 사용하는 경우ì—� 비해 기기ì—� ë�œ 종ì†�ì �ì�´ë‹¤.
- ëª…ë ¹ì–´ì�˜ prefix로 타입ì�„ 구분한다. http://en.wikipedia.org/wiki/Java_bytecode#Instructions
- invoke* ëª…ë ¹ì–´
- invokespecial - vtable lookupì�„ 하지 ì•Šê³ ë©”ì†Œë“œë¥¼ 호출하는 경우. ì–´ë–¤ 메소드를 호출해야 하는지 ì •í•´ì ¸ 있는 경우ì—� 사용ë�œë‹¤. new, private method, super 등.
- invokevirtual - vtable lookupì�„ 한다. ì�¸ìŠ¤í„´ìŠ¤ì�˜ ì‹¤ì œ 타입ì�„ ê°€ì§€ê³ ë©”ì†Œë“œë¥¼ 찾는 경우. 대부분ì�˜ 메소드들ì�´ 여기ì—� 해당한다.
- invokestatic - static 메소드 호출. 첫 ��로 this를 넣어주지 않는다.
- invokeinterface - virtual과 거� 같다. interface� 메소드를 호출하는 경우� 사용한다.
- invokespecial - vtable lookupì�„ 하지 ì•Šê³ ë©”ì†Œë“œë¥¼ 호출하는 경우. ì–´ë–¤ 메소드를 호출해야 하는지 ì •í•´ì ¸ 있는 경우ì—� 사용ë�œë‹¤. new, private method, super 등.
- if문 - if*과 if_*� � 종류로 나뉜다.
- if* 타입 - operand를 하나만 사용해서 0ê³¼ 비êµ�하는 경우가 대부분ì�´ë‹¤. ifeq(0ê³¼ ê°™ì�Œ), ifne(0ì�´ 아님) 등ì�˜ ëª…ë ¹ì–´ê°€ 있다.
- if_* 타입 - stackì—�서 ë‘� ê°œì�˜ operand를 꺼내서 서로 비êµ�하는 경우ì—� 주로 사용ë�œë‹¤. if_icmpeq(ì •ìˆ˜í˜• ê°’ ë‘� 개를 ê°™ì�€ì§€ 비êµ�) 등ì�˜ ëª…ë ¹ì–´ê°€ 있다.
- if* 타입 - operand를 하나만 사용해서 0ê³¼ 비êµ�하는 경우가 대부분ì�´ë‹¤. ifeq(0ê³¼ ê°™ì�Œ), ifne(0ì�´ 아님) 등ì�˜ ëª…ë ¹ì–´ê°€ 있다.
- register-based machineê³¼ì�˜ ì°¨ì�´ëŠ” ì—°ì‚°ì—� 사용ë�˜ëŠ” operandì�˜ ì°¨ì�´. register-basedì—�서는 registerì—�서 operand를 ê°€ì ¸ì˜¤ê³ stack-basedì—�서는 stackì—�서 pop해서 ê°€ì ¸ì˜¨ë‹¤.
- JVM - stack-based machine
- 11월 10�� 둘? - 서지혜
- 복사해서 ê°€ì ¸ì™”ë�”니 ë‚ ì§œ 바꾸는 걸 까먹ì�€ë“¯ ;;; - 서민관
- 복사해서 ê°€ì ¸ì™”ë�”니 ë‚ ì§œ 바꾸는 걸 까먹ì�€ë“¯ ;;; - 서민관









