* 2012ë…„ ê·¸ë“¤ì´ ìŠ¤í„°ë””ë¥¼ 시작한다. * C/C++/Java ëª¨ë‘ ë‹¤ë¥¸ 언어지만 하나ì—ì„œ 시작했으니... * ALGOL계 언어ë¼ê³ ë„ í•œë‹¤ê³ í•œë‹¤.. [http://hkpark.netholdings.co.kr/web/inform/default/inform_view.asp?menu_id=9730&id=1456&parent_id=1517 ê¶ê¸ˆí•´ í• ì‚¬ëžŒì„ ìœ„í•´] * 그러나 비슷한 ì‹œê¸°ì— íƒ„ìƒí•œ Fortran, lispë“±ì„ ì œí•˜ê³ ì´í›„ ëŒ€ë¶€ë¶„ì˜ ì–¸ì–´ì—게 ì˜í–¥ì„ 주었으니 ALGOLê³¼ 무관한 언어가 있ì„까.. [[TableOfContents]] == ì¼ì • == * ~~ì¼ë‹¨ 매주 ìˆ˜ìš”ì¼ 6시부터~~ * í™”ìš”ì¼ ì˜¤í›„ 3시부터 6시까지 == 목ì == * C/C++/Java 언어를 ê³µë¶€í•˜ê³ ì„œë¡œê°„ì˜ ì‚¬ìš©ìƒ ì°¨ì´ì ê³¼ 공통ì ì¸ íŒ¨í„´ 학습 * 서로 다른 세 언어를 마치 한언어처럼 쓸수 있게ë”.. * ì´ˆì‹¬ìž ëŒ€í™˜ì˜ == í™œë™ == === [2013ë…„ 1ì›” 2ì¼] === * [권ì˜ê¸°], [김민재], [ë°•ìƒì˜], [ì¡°ê´‘í¬] ==== í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ì˜ í•„ìˆ˜ 요소 ==== * ì œì–´ë¬¸, 반복문, 변수, I/O * I/O는 콘솔 ë¿ë§Œì•„ë‹ˆë¼ ë‹¤ë¥¸ ì–´ë–¤ê²ƒì´ ë 수 있다. * 케빈 ë¯¸íŠ¸ë‹‰ì€ ëª¨ë‹ˆí„°ê°€ 없어서 잡혔다. ==== c++ì˜ "hello world" í”„ë¡œê·¸ëž¨ì„ ëœ¯ì–´ë³´ìž ==== {{{ #include <iostream> using namespace std; int main(){ cout<<"hello!"<<endl; return 0; } }}} * #ì´ ë¶™ì–´ìžˆëŠ” ëª…ë ¹ì–´ - Preprocessorê°€ 처리 * #include, #define, #ifndef 등... * ë‚˜ì¤‘ì— ë°°ìš°ê² ì§€ë§Œ ì´ê±´ ì•ˆì“¸ìˆ˜ë¡ ì¢‹ìŒ - [안í˜ì¤€] * 왜? 컴파ì¼ëŸ¬ëŠ” ì´ëŸ°ê±° 모르기 때문. * namespace : ì´ë¦„ ì¤‘ë³µì„ ë§‰ê¸° 위해 사용 * using namespace NAME; -> NAMEì˜ namespace를 해당 scope 안ì—ì„œ ì´ìš©í•˜ê² 다는 것 * std * 기본 í•¨ìˆ˜ë“¤ì˜ namespace * using * 지금부터 ì–´ë–¤ íŠ¹ì • 네임스페ì´ìŠ¤ë¥¼ ì“°ê² ë‹¤ëŠ” 지시어. * 문ìžì—´ * charì˜ ë°°ì—´, '''null terminated''' char sequence * ìžë°”ì—서는 아닌것 처럼 ë³´ì—¬ë„ ì‚¬ì‹¤ 내부ì 으로는 비슷하다. * string Class * endl * ë¼ì¸ë 문ìžë¥¼ ì¶œë ¥í•˜ê³ ë²„í¼ë¥¼ 비운다. * return 0; * UNIX/LINUX 계열ì—서는 중요한 ì •ë³´ * ì´ê±¸ë¡œ í”„ë¡œê·¸ëž¨ì´ ì œëŒ€ë¡œ ë났는지 íŒë‹¨í•œë‹¤. * returnì—는 중요한 íŠ¹ì„±ì´ ìžˆëŠ”ë° ì´ê²Œ 호출ë˜ë©´ 지ì—변수를 ì •ë¦¬í•œë‹¤. * [http://thenine.egloos.com/430823 main í•¨ìˆ˜ì˜ ë¦¬í„´ê°’] ==== 변수 ==== * ì •ì˜ - ì–´ë–¤ ê°’ì„ ë‹´ì„수 있는것. * C/C++/JAVAì€ í˜•ì„ ê°•ì œí•˜ëŠ” 강형언어기 ë•Œë¬¸ì— í˜•ì´ ìžˆë‹¤. * 당연히 강형언어가 ë” ë¹ ë¥´ê²Œ ë™ìž‘í• ìˆ˜ 있다. CPUì—ì„œ ì–´ë–¤ ëª¨ë“ˆì„ ì“°ëŠ”ì§€ 알기 때문. * ì •ìˆ˜ * int, long, long long, short, char * intí¬ê¸°ëŠ” CPUê°€ í•œë²ˆì— ì²˜ë¦¬í• ìˆ˜ 있는 ì •ìˆ˜ - 당연히 16bitì—서는 다를수 있다. * long long ê°™ì€ ê²½ìš°ì—는 ì—†ì„ìˆ˜ë„ ìžˆë‹¤. * 실수 * float, double * floatê°€ floatì¸ ì´ìœ - ë¶€ë™ ì†Œìˆ˜ì ì´ë¼ì„œ.... * double ì€ ê·¸ëƒ¥ double floatë¼ì„œ.. * bool * 1bit 짜리. * C는 boolì´ ì—†ë‹¤!, c++ì€ ìžˆë‹¤. java는 boolean으로 사용한다. - C11ì€ ìžˆë‹¨ë‹¤. * ëŒ€ë¶€ë¶„ì˜ ê²½ìš° 그냥 ì •ìˆ˜ë¡œ 처리한다. * ê°’ì´ 0ì´ë©´ false 그외는 true * c++ì—ì„œë„ 0ì€ falseë¡œ, 그외는 trueë¡œ 간주ëœë‹¤. while(1) {}, while(true) {} 둘 다 가능 * javaì—서는 int와 booleanì€ í˜¸í™˜ë˜ì§€ 않는다. while(1) {}는 컴파ì¼ì—러. ==== ì œì–´ë¬¸, 반복문 ==== * ì œì–´ë¬¸ê³¼ ë°˜ë³µë¬¸ì€ ì–´ì°Œë³´ë©´ ë™ì¹˜. * switch case문ì—ì„œ case는 컴파ì¼ëŸ¬ë§Œ ì•Œë¿(Labelì´ë¼ëŠ” 소리..) * 세 언어ì—ì„œ case문 뒤는 "ì •ìˆ˜" ì´ë‹¤. * ASCIIì— ì†ì§€ë§ˆë¼. * java7부터 문ìžì—´ìƒìˆ˜ case label 지ì›. case "hello": ...; ê°€ ëœë‹¤. === [2013ë…„ 1ì›” 9ì¼] === * ì°¸ê°€ìž : [권ì˜ê¸°], [김민재], [김해천], [서지혜], [ì¡°ê´‘í¬] ==== í¬ì¸í„° (Pointer) ==== * void pointer 사용 ìžì œí•©ì‹œë‹¤. void pointerê°€ 가리키는 ê°’ì˜ íƒ€ìž…ì„ ì¶”ë¡ í• ìˆ˜ 없다. [http://stackoverflow.com/questions/1718412/find-out-type-of-c-void-pointer ì°¸ê³ ] ==== 함수 (Function) ==== * functionì´ëž€ inputê³¼ outputì´ ìžˆëŠ” 기능 단위 * í•¨ìˆ˜ì— parameter 를 넘겨주지 않거나 return ì´ ì—†ëŠ” í•¨ìˆ˜ë„ ìžˆìŒ. * ë§Žì€ ê¸°ëŠ¥ì„ ìž˜ê²Œ 쪼개기 위해 함수를 사용한다. * ê°€ë…ì„±ì„ ì¢‹ê²Œ 한다. * ì½”ë“œì˜ ìž¬ì‚¬ìš©ì„±ì„ ë†’ì¸ë‹¤. * global variableì˜ ì‚¬ìš©ì„ ìžì œí•˜ìž. í•¨ìˆ˜ì˜ ê¸°ëŠ¥ì„ ì´í•´í•˜ê¸° ì–´ë µê²Œ ë§Œë“ ë‹¤. * 변수 ì ‘ê·¼ì„ ì œì–´í•˜ê¸° 힘들기 ë•Œë¬¸ì— ë²„ê·¸ë¥¼ ìœ ë°œí• í™•ë¥ ë„ ì¦ê°€í•œë‹¤. * 파ë¼ë©”í„° ì „ë‹¬ ë°©ì‹ 1. call by value 1. call by pointer 1. call by reference(alias) * C/C++/Javaì˜ parameter는 call-by-value 형ì‹ìœ¼ë¡œ ê°’ì„ ì „ë‹¬í•œë‹¤. * í¬ì¸í„° ê°’ì„ ì „ë‹¬í•˜ëŠ” Call-by-referenceì˜ ê²½ìš°ëŠ”, í¬ì¸í„° ê°’ì„ ë³µì‚¬ì˜ ë°©ì‹ìœ¼ë¡œ ì „ë‹¬í•˜ê²Œ ë˜ë¯€ë¡œ, ì¼ì¢…ì˜ call-by-valueë¼ê³ ë³¼ 수 있다. * 참조는 내부ì 으로 í¬ì¸í„°ë¥¼ ì´ìš©í•œë‹¤. * C/C++ì˜ í•¨ìˆ˜ 호출 방법(Calling Convention) * __stdcall, __thiscall, __pascal, __syscall 등 * ì¸ìžì˜ ì „ë‹¬ ë°©ì‹ê³¼ stackì˜ í•´ì œ ë°©ë²•ì˜ ì°¨ì´ * 함수 decorator : C++ì˜ ì˜¤ë²„ë¡œë”©ì„ í•˜ê²Œ ë˜ë©´, ì»´íŒŒì¼ íƒ€ìž„ì—ì„œ ê°ê°ì˜ 함수를 êµ¬ë¶„í• ìˆ˜ 있ë„ë¡ ë¶™ëŠ” ë¨¸ë¦¿ë§ * extern "C"를 ì´ìš©í•˜ë©´ ì´ëŸ¬í•œ 함수 decoratorê°€ 없어진다. * [http://kldp.org/node/121134 extern "c"ì˜ ì˜ë¯¸?] * [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf c++11(아마ë„?) Working Draft]ì˜ 7.5ì ˆ linkage specification ì°¸ê³ === 2013ë…„ 1ì›” 16ì¼ === ==== Thread ==== * mutex, semaphore, spinlock, critical section, race condition, dead lock * event driven, event loop, thread polling, busy waiting, * java ForkJoin * ì™ ì§€ëª¨ë¥´ê²Œ C++ì—ì„œ 비슷한걸 만들어 ë³´ê³ ì‹¶ì–´ 지네요 - [안í˜ì¤€] ==== Template ==== * 으악 ì´ë ‡ê²Œ 재미있는 ë‚´ìš©ë“¤ì„ ëª» 들었다니 ã… ã… ã… ã… ã… - [김민재] * ê¶ê¸ˆí•˜ë©´ ì˜¤ë°±ì› - [서지혜] === 2013ë…„ 1ì›” 22ì¼ === * 실습. ì„ í˜•ëŒ€ìˆ˜í•™ 계산기를 만들어보기 * #ifndef NAME : #define NAMEì´ ë˜ì–´ìžˆì§€ 않는 ê²½ìš°ì— ìž‘ë™í•œë‹¤. 주로 í—¤ë”íŒŒì¼ ì¤‘ë³µ include를 막기 위해 사용한다. {{{ ~cpp #ifndef _HEADER_FILE_NAME_ // naming ruleì´ ë”°ë¡œ 있는진 ëª¨ë¥´ê² ìŒ #define _HEADER_FILE_NAME_ ... // header source ... #endif _HEADER_FILE_NAME_ }}} * #pragma onceë„ ë™ì¼í•œ 효과를 준다. ì „ì²´ 소스코드를 단 한번만 include 한다. (비표준) * 비표준ì´ì§€ë§Œ ê±°ì˜ ëª¨ë“ ì»´íŒŒì¼ëŸ¬ê°€ 지ì›í•˜ë¯€ë¡œ defacto {{{ ~cpp #pragma once }}} * const 멤버 í•¨ìˆ˜ì˜ íš¨ê³¼ * returnë˜ëŠ” ê°’ì„ ì°¸ì¡°í•˜ëŠ” êµ¬ë¬¸ì„ ìž‘ì„±í•˜ë©´ dangling pointer ìœ„í—˜ì´ ìžˆë‹¤. * move constructor(?) * ì—°ì‚°ìž ì˜¤ë²„ë¡œë”© : C++ì—서는 operator를 ì´ìš©í•´ì„œ ì—°ì‚°ìžì— íŠ¹ì • ê¸°ëŠ¥ì„ ì •ì˜í• 수 있다. C와 ìžë°”ì—서는 안 ëœë‹¤. * ì—°ì‚°ìž ì˜¤ë²„ë¡œë”©ì—ì„œ friendê°€ í•„ìš”í–ˆë˜ ì´ìœ ! * int와 ê°ì²´ì™€ì˜ ê³±ì…ˆì„ êµ¬í˜„, ë‚¨ì˜ ë©¤ë²„í•¨ìˆ˜ * ì˜¤í† ë°•ì‹±, 언박싱(ìžë™ìœ¼ë¡œ 형태를 변환해준다?) * <<는 shift ì—°ì‚°ìžì— 오버로딩 í•œ 것 (stream) * ì—°ì‚°ìž ì˜¤ë²„ë¡œë”©ì„ í•œ 경우, ê°ì²´ u와 vê°€ 있으면, u+v == u.operator+(v) 와 같다. === 2013ë…„ 1ì›” 29ì¼ === * ì‹ ê¸°í•œ í¬ì¸í„° ë†€ì´ * ì°¸ê³ : [Cppì—ì„œì˜ë©¤ë²„함수구현메커니즘] {{{ class foo { void hello(void) { cout << "hello" << endl; } } }}} ì´ë ‡ê²Œ ì •ì˜ í•´ ë†“ì€ ìƒíƒœì—ì„œ {{{ int main() { foo *bar = NULL; bar->hello(); } }}} ì´ë ‡ê²Œ 작성해서 실행하면, 보기ì—는 ì‹¤í–‰ì´ ì•ˆ ë 것 같지만 ì‹¤í–‰ì´ ëœë‹¤. * ì¸ìŠ¤í„´ìŠ¤ëŠ” NULL를 가리키지만, ì‹¤ì œë¡œ 실행ë 때는 hello í•¨ìˆ˜ë§Œì„ í˜¸ì¶œí•˜ê¸° 때문ì´ë‹¤. (문장 ì„¤ëª…ì´ ë¶€ì¡±í•œë°?) * stackì´ë‚˜ heapì—ì„œ ë°ì´í„°ë¥¼ free í• ë•Œ, ì‹¤ì œë¡œ í¬ì¸í„°ë§Œ ì´ë™ì´ ëœë‹¤. 그래서 ì‹¤ì œë¡œëŠ” ë°ì´í„°ê°€ ë©”ëª¨ë¦¬ì— ë‚¨ì•„ìžˆê²Œ ëœë‹¤(ê¸°ì¡´ì˜ ê°’ì„ ì´ˆê¸°í™”í™” í• í•„ìš”ì—†ì´ í• ë‹¹ 플래그만 í•´ì œí•˜ë©´ ë˜ë¯€ë¡œ). ì¤‘ê°„ì— ë‹¤ë¥¸ ê³³ì—ì„œ í˜¸ì¶œì´ ë ê²½ìš°ì— ë°ì´í„°ê°€ ë®ì–´ ì¨ì§€ëŠ” ë¬¸ì œê°€ ë°œìƒí• 수 있으므로, dangling pointer를 조심해야 한다. * ì´ ì´ì•¼ê¸°ëŠ” osì˜ ê°€ìš© 메모리 풀과 ìƒê´€ì´ 있군 - [서지혜] * ostringstream -> streamì— ë”ê°€ 하면 string으로 나온다 * 가변 ì¸ìˆ˜ void NAME (int name, …) '…'ì€ ê°€ë³€ ì¸ìˆ˜ë¥¼ 표현한 것ì´ë‹¤. {{{ void Func(int ê³ ì •ì¸ìž, …) { va_list ap; va_start(ap, ê³ ì •ì¸ìž); va_arg(ap, ì¸ìˆ˜íƒ€ìž…); -> 가변 ì¸ìˆ˜ë¥¼ ì½ëŠ” ëª…ë ¹ va_end(ap); } }}} * í˜•ì€ ë³´ìž¥í•˜ì§€ 않는다. 가변ì¸ìžë“¤ì˜ í˜•ì„ ê°•ì œí• ìˆ˜ 없기 ë•Œë¬¸ì— stackì— void*ë¡œ ì €ìž¥ëœë‹¤. ê·¸ë¦¬ê³ ìµœì†Œí•œ ì¸ìžê°€ 하나는 있어야 한다. * printf는 어떻게 ì¸ìžë“¤ì˜ í˜•ì„ ê´€ë¦¬í•˜ì§€? - [서지혜] * printfì˜ ê²½ìš°ì—는 첫째ì¸ìžë¡œ í˜•ì„ íŒë‹¨í• 수 있기 ë•Œë¬¸ì— ë¬¸ì œê°€ ë˜ì§€ ì•Šì£ . 하지만 ê°™ì€ ì´ìœ ì—ì„œì¸ì§€ printf("%f", 3) ì„ ìž˜ëª»ì¶œë ¥í•˜ëŠ” ë¬¸ì œê°€ 있습니다. ì´ ì·¨ì•½ì ì„ ì´ìš©í•œ 해킹 ë°©ë²•ë„ ì¡´ìž¬í•˜ì§€ìš”. - [안í˜ì¤€] * 첫번째 ì¸ìž ì•ˆì— %d.. 등으로 가변ì¸ìžì˜ í˜•ì„ ê²€ì‚¬í•˜ëŠ”ê±°ì•¼? - [서지혜] * ì •ë‹µ! 첫번째 ì¸ìžì— ì´ë¯¸ 형ì—대한 ì •ë³´ë¥¼ 넘겨 주기 ë•Œë¬¸ì— ê°€ë³€ì¸ìžë¼ë„ 대ì³ê°€ 가능합니다. 예시 코드 {{{ #include <iostream> #include <cstdarg> using namespace std; void test(int num, ...) { va_list ap; va_start(ap, num); for(int i=0; i<num; i++) { cout << va_arg(ap, int) << endl; } va_end(ap); } int main(void) { test(5, 1,2,3,4,5); return 0; } }}} * stl vector를 ì´ìš©í•œ class vector 만들기 * namespaceë¡œ ê°™ì€ ì´ë¦„ì„ ê°€ì§„ í´ëž˜ìŠ¤ë“¤ì„ ì‚¬ìš©í•´ë³´ìž * templateê³¼ friend * template와 friend 사ì´ì— 여러 ë§¤í•‘ì´ ì¡´ìž¬í•œë‹¤. many to many, one to many, many to one, one to one : [http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc16friends_and_templates.htm ì°¸ê³ ] * c++11ì—ì„œ autoì˜ ì˜ë¯¸ê°€ 달ë¼ì¡Œë‹¤?? === 2013ë…„ 2ì›” 13ì¼ === * 가변ì¸ìžì˜ 취약ì ì„ ì´ìš©í•œ 공격 (Format String Attack) * ì°¸ê³ : http://www.hackerschool.org/HS_Boards/data/Lib_system/The_Mystery_of_Format_String_Exploitation.pdf * 가변ì¸ìžì˜ í˜•ì„ ê²€ì‚¬í•˜ëŠ” 주체가 컴파ì¼ëŸ¬ê°€ ì•„ë‹Œ, 함수ì´ê¸° 때문ì´ë‹¤. * privateì˜ ìƒì† * private ìƒì†ì„ 받게 ë˜ë©´, í´ëž˜ìŠ¤ ë‚´ì—서만 ì‚¬ìš©í• ìˆ˜ ìžˆê³ , 외부ì—서는 ì ‘ê·¼ì„ í• ìˆ˜ 없다. 부모 í´ëž˜ìŠ¤ê°€ ê°€ìƒí•¨ìˆ˜ë¥¼ ê°€ì§€ê³ ìžˆê³ , ì´ê²ƒì„ ìž¬ì •ì˜ í•´ì„œ ì‚¬ìš©í• ìˆ˜ 있다. * ì–´ë–¤ í´ëž˜ìŠ¤ë¥¼ ì“°ë˜, ì™¸ë¶€ì— ê³µê°œí•˜ì§€ ì•Šê³ , ê°€ìƒí•¨ìˆ˜ë¥¼ ìƒì†ë°›ì•„야 í• ë•Œ ì‚¬ìš©í• ìˆ˜ 있다. * (사실 people í´ëž˜ìŠ¤ ì•ˆì— DataInfo를 멤버 변수로 ì„ ì–¸í•´ì„œ ì‚¬ìš©í•´ë„ ë˜ê¸´ 하다. 하지만 private ìƒì†ì„ ë°›ì„ ë•Œ 보다 메모리를 ë” ë§Žì´ ì‚¬ìš©í•˜ê²Œ ë˜ê¸° 때문ì—, private ìƒì†ì„ 쓰는 게 좋다.) * #define와 typedefì˜ ì°¨ì´ * #defineì€ ë§¤í¬ë¡œì´ê¸° 때문ì—, preprocessorì— ì˜í•´ì„œ 처리ë˜ê³ , typedef는 compilerì— ì˜í•´ 처리ëœë‹¤. * í•¨ì • ì¹´ë“œ ë¬¸ì œ (thanks to [서지혜] 누나) {{{ int a, b =5; a= b++ + ++b + ++b + ++b + b++ ; }}} * aì˜ ê°’ì€ ë˜ê¹Œ? * ++b(1st), +(2nd), b++(3rd), =(4th) * ì—°ì‚°ì€ ì˜¤ë¥¸ìª½ì—ì„œ 왼쪽으로 진행. * containerì˜ ì¢…ë¥˜ * standard STL sequence container * vector(메모리가 ì—°ì†ì ì¸ (ë™ì ) ë°°ì—´), string, deque(double ended queue, ë±ì´ë¼ê³ ë„ í•œë‹¤. [http://www.cplusplus.com/reference/deque/deque/ ì°¸ê³ ]), list(linked-list) * standard STL associate container * set(집합, 순서가 없는 리스트, ì¤‘ë³µì„ í—ˆìš© 안함), multiset, map(key와 valueê°€ ì§ì„ 지어서 set으로 ì €ìž¥ëœë‹¤), multimap (setê³¼ mapì€ input ë ë•Œ, valanced tree 형태로 ì €ìž¥ë˜ê¸° ë•Œë¬¸ì— search timeì´ í•ìƒ log nì„ ìœ ì§€í• ìˆ˜ 있다. 즉, 들어온 순서와 ì •ë ¬ 순서가 ì¼ì¹˜í•˜ì§€ 않게 ëœë‹¤.) * non-standard sequence container * slist(single-list), rope(대용량 string) * non-standard associate container * hash-set(hash 계열들) * ë„서관 == hash system (ì±… 마다 ê³ ìœ ë²ˆí˜¸ê°€ 붙어있ìŒ) * hash는 메모리를 ë§Žì´ ë¨¹ëŠ”ë‹¤. * not in STL container * bitset, valarray, stack, queue * ìœ„ì˜ ê°ê°ì˜ 예시는 메모리 기반, node 기반(linked-list)으로 êµ¬ë¶„ì´ ëœë‹¤. * vector<bool>ì€ ì¼ë°˜ì ì¸ vector ì—°ì‚°ì´ ë¶ˆê°€ëŠ¥í•œë°, ì´ê±¸ 해결하기 위해 bitsetì„ ì´ìš©í•œë‹¤. * setê³¼ hash-set * setì€ valanced tree 형태로 ì €ìž¥ëœë‹¤. hash-setì€ ìˆœì„œê°€ ë³´ìž¥ì´ ë˜ì§€ 않는다. * stringê³¼ vector<char> -> 참조 ì¹´ìš´íŒ…ì„ ì•ˆ 하기 때문ì—, vectorë¡œ 쓸 경우 ë” ë¹ ë¥¼ 수 있다. * 삽입과 ì‚ì œì‹œ transaction(ìž‘ì—… 하다가 오류가 ë‚ ê²½ìš°, ëŒì•„ê°ˆ 수 있는 기능)ì´ ê°€ëŠ¥í•œ 경우 * list는 보장ë¨. vector는 보장ë˜ì§€ ì•ŠìŒ * 무효화가 ì 어야 하는 경우ì—는 node 기반(list, set)ì„ ì‚¬ìš©í•´ì•¼ 한다. {{{ ArrayList arr; //arr.size() = 10; for(int i=0; i<10; i++) { arr.delete(i); } arr.size == 0; (???) }}} * ì´ë ‡ê²Œ ìž‘ì„±í–ˆì„ ë•Œ, arr.size는 0ì´ ë˜ì§€ 않는다는 ê²ƒì„ í™•ì¸í• 수 있다. * arr.size()는 ë…•ì›ížˆ 0ì´ ë˜ì§€ 않는다.. naver.. iê°€ 5ì¼ ë•Œ ArrayIndexOutOfBounds Exceptionì´ ë°œìƒí•œë‹¤ * vectorì˜ ì‚½ìž…, ì‚ì œê°€ ì¼ì–´ë‚ ë•Œ, ì „ì²´ ë°°ì—´ í¬ê¸°ê°€ ì œí•œ í¬ê¸°(1024)를 넘어갈 경우, 2ë°° í¬ê¸°ì˜ ë°°ì—´ì„ ë§Œë“¤ê²Œ ë˜ëŠ”ë°, ì´ ë•Œ ê°ê°ì— 해당하는 í¬ì¸í„°ê°€ ì „ë¶€ 바뀌게 ë˜ë¯€ë¡œ '무효화' ë˜ëŠ” 것ì´ë‹¤. * 그런ë°, ì •í™•í•œ 무효화 ì‹œì ì„ ì•Œ 수 없으므로, ì–¸ì œë“ ì§€ 무효화 ë 수 ìžˆë‹¤ê³ ìƒê°í•˜ëŠ” ê²ƒì´ ì¢‹ë‹¤. * qsort ìž‘ì„±ì„ ìœ„í•´ì„œëŠ” 함수 í¬ì¸í„°ë¥¼ ì§€ì •í•´ì•¼ 하는ë°, C++ì˜ í´ëž˜ìŠ¤ë¥¼ ì´ìš©í•˜ë©´ ì´ê²ƒì„ ìƒëžµí• 수 있다. {{{ vector <widget *> ar; ar,push_back(new widget()); ar.pop(); }}} * ì´ë ‡ê²Œ ë 경우, widgetì€ ê³„ì† ìƒì„±ë˜ëŠ”ë°, popì„ í•˜ë©´, 만들어진 widgetì€ ê³„ì† ë©”ëª¨ë¦¬ì— ìƒì£¼í•˜ê³ , widgetì„ ê°€ë¦¬í‚¤ê³ ìžˆëŠ” ar í•ëª©ë“¤ë§Œ ì‚ì œëœë‹¤. 그래서, shared_ptrì„ ì‚¬ìš©í•œë‹¤. * tr1ì€ C++0xì—ì„œ ì œì •ëœ ê²ƒë“¤ì´ tr1 namespaceë¡œ ì •ì˜ë˜ì–´ ìžˆì—ˆëŠ”ë° C++11ì´ ë‚˜ì˜¤ë©´ì„œ 다 통합ë˜ì—ˆë‹¤ê³ 한다. * boost는 c++ libraryì¸ë°, 주요 쓰는 함수나 íŒ¨í„´ë“¤ì„ ë‹¤ 모아 ë†“ì€ ê²ƒë“¤ì´ë‹¤. (javaì˜ jUnit ê°™ì€ ê±°?) vector v; ì¼ ë•Œ if(v.size()==0) ì´ê²ƒ 보다는 if(v.empty());를 ì¨ì„œ 공백ì¸ì§€ 확ì¸í•œë‹¤. * ì†ë„ê°€ ë¹ ë¥´ë‹¤. size를 구하는 ê³¼ì •ì´ ìƒëžµë˜ê³ , 오류를 ì¤„ì¼ ìˆ˜ 있다. * vectorì˜ swap * vectorì˜ reserve * forë¬¸ì„ ì´ìš©í•´ì„œ 100개를 í• ë‹¹í•˜ëŠ” 것 보다, reserve(100)ì„ í•´ì„œ í• ë‹¹í•˜ëŠ” ê²ƒì´ íš¨ìœ¨ì ì´ë‹¤. * vectorì˜ resize * resize는 reserveì˜ í• ë‹¹í•˜ëŠ” ì—í• ì— ì´ˆê¸°í™”ê¹Œì§€ í•´ 준다. [계ì†ìž‘성중] === 2013ë…„ 7ì›” 12ì¼ === * Effective C++ ì±…ì„ ê³µë¶€í•˜ê¸°ë¡œ ê²°ì • ==== ìš©ì–´ ì •ì˜ ==== * ì„ ì–¸(Declaration) - ì–´ë–¤ 대ìƒì˜ ì´ë¦„ê³¼ íƒ€ìž…ì„ ì»´íŒŒì¼ëŸ¬ì—게 ì•Œë ¤ 주는 것 {{{ e.g. extern int x; class Widget; }}} * ì •ì˜(Definition) - êµ¬í˜„ì´ ë“¤ì–´ 있는 경우. {{{ e.g. int x; class Widget{ Widget(); .... } }}} * ê°ì²´ - Effective C++ì—서는 ë„“ì€ ë²”ìœ„ë¡œ ê°ì²´ë¥¼ ì •ì˜. Premetive typeë„ ê°ì²´ë¡œ 보기로 함. * 초기화 - ì–´ë–¤ ê°ì²´ì— ìµœì´ˆì˜ ê°’ì„ ë¶€ì—¬í•˜ëŠ” ê³¼ì •. * ìƒì„±ìž - 특별한 ì •ì˜ ì—†ì´ë„ 세 ê°€ì§€ì˜ ìƒì„±ìžê°€ ì •ì˜ëœë‹¤. - 기본 ìƒì„±ìž, 복사 ìƒì„±ìž(copy constructor), 복사 대입 ì—°ì‚°ìž(copy assignment operator). * 복사 ìƒì„±ìž - ì–´ë–¤ ê°ì²´ì˜ 초기화를 위해 그와 ê°™ì€ íƒ€ìž…ì˜ ê°ì²´ë¡œë¶€í„° ì´ˆê¸°í™”í• ë•Œ 호출ë˜ëŠ” 함수. {{{ //e.g. Widget w1 = w2; }}} e.g. functionì— call by valueë¡œ ê°ì²´ë¥¼ 넘겨줄 경우, * 복사 대입 ì—°ì‚°ìž - ê°™ì€ íƒ€ìž…ì˜ ë‹¤ë¥¸ ê°ì²´ì— ì–´ë–¤ ê°ì²´ì˜ ê°’ì„ ë³µì‚¬í•˜ëŠ” ìš©ë„ë¡œ ì“°ì´ëŠ” 함수ì´ë‹¤. {{{ //e.g. Widget w1; Widget w2; w1 = w2; }}} * 함수 ê°ì²´ * ë¯¸ì •ì˜ ë™ìž‘ - 터질지 안 í„°ì§ˆì§€ë„ ëª¨ë¦„. {{{ //e.g. struct Line{ string str; Line* next; }; b = (Line *)malloc(sizeof(Line)); b->str = input(); // BOOM! l->next = b; }}} ì´ìœ 는 stringì€ ìƒì„±ìžê°€ 호출ë˜ì§€ 않으므로(mallocì— ì˜í•´ì„œ) ==== Chapter 1. C++를 ì–¸ì–´ë“¤ì˜ ì—°í•©ì²´ë¡œ ë°”ë¼ë³´ëŠ” 안목 필수 ==== * C, OOP, Template, STL * C++ì˜ íŒ¨ëŸ¬ë‹¤ìž„ì´ ë‹¤ì–‘í•˜ê¸° ë•Œë¬¸ì— C++를 사용하는 ë°©ë²•ë„ ë§¤ìš° 달ë¼ì§ˆ 수 ìžˆê³ ìµœì í™” ë°©ë²•ë„ ë‹¬ë¼ì§ˆ 수 ë°–ì— ì—†ë‹¤. * 쓰는 ë°©ë²•ì— ë”°ë¼ì„œ ì¼€ë°”ì¼€ì¸ ê²ƒ! ==== Chapter 2. #defineì„ ì“°ë ¤ê±°ë“ const, enum, inlineì„ ë– ì˜¬ë¦¬ìž. ==== * #defineì„ ì‚¬ìš©í•˜ë©´ 컴파ì¼ëŸ¬ê°€ 잡아주지 못해서 ì—러를 ë°œìƒì‹œí‚¬ ê°€ëŠ¥ì„±ì´ í¬ë‹¤. 그러나 ì´ ë§ì´ #defineì„ ì‚¬ìš©í•˜ì§€ ë§ë¼ëŠ” ì˜ë¯¸ëŠ” 아니다! 케바케로서 #defineì´ const보다 맞는 ê²½ìš°ë„ ì¡´ìž¬í•œë‹¤. {{{ //e.g. const int A const some A }}} {{{ //외부ì—ì„œ extern some A //ì˜ ê²½ìš° Aê°€ 초기화가 안ë 수 있다. scopeì— ë”°ë¥¸ ë¬¸ì œê°€ ë°œìƒ ë 수 있다. }}} * Macro Functionì´ í•„ìš”í•œ 경우 - inline template function으로 대체 하면 í•´ê²° ==== Chapter 3. 낌새만 ë³´ì´ë©´ const를 들ì´ëŒ€ ë³´ìž. ==== {{{ //e.g. const char * p = greeting //비ìƒìˆ˜ í¬ì¸í„°, ìƒìˆ˜ ë°ì´í„°í† char * const p = greeting //ìƒìˆ˜ í¬ì¸í„°, 비ìƒìˆ˜ ë°ì´í„° constì— ì˜í•œ ìƒìˆ˜í™”를 íŒë‹¨í•˜ëŠ” ê¸°ì¤€ì€ *ì˜ ì•žì— ìžˆëƒ ë’¤ì— ìžˆëƒë¡œ 따진다. const char * p = greeting char const * p = greeting //ì€ ê°™ë‹¤. //in STL interator const iterator a iterator const a //-> T * const const_iterator a //-> const T * }}} * 열심히 잘 붙ì´ë©´ 소스코드가 ê²¬ê³ í•´ì§„ë‹¤. * const Functionì´ëƒ 아니ëƒë¡œë„ overloadingì´ ëœë‹¤. * 비트 수준 ìƒìˆ˜ì„± - ì–´ë–¤ 맴버 함수가 ê·¸ ê°ì²´ì˜ ì–´ë–¤ ë°ì´í„° ë§´ë²„ë„ ê±´ë“œë¦¬ì§€ 않아야 하지만 ê·¸ 맴버 함수가 constìž„ì„ ì¸ì •í•˜ëŠ” ê°œë….(C++ì—서는 ) * 비트 수준 ìƒìˆ˜ì„±ì˜ 한계 : const 함수ì—ì„œ ê°ì²´ì˜ ì–´ë–¤ ë°ì´í„° 맴버는 건드리지 ì•Šê³ ë°ì´í„° 맴버가 가리키는 ë°ì´í„°ë¥¼ 건드리는 경우는 ë§‰ì„ ìˆ˜ 없다. * 논리 수준 ìƒìˆ˜ì„± * 비ìƒìˆ˜ ë²„ì „ê³¼ ìƒìˆ˜ ë²„ì „ - 비ìƒìˆ˜ ë²„ì „ì—ì„œ ìƒìˆ˜ ë²„ì „ì„ í˜¸ì¶œ; const_cast : const를 떼어내는 것 static_cast : const를 붙ì´ëŠ” 것 -> C styleì˜ (const type)variable ê³¼ 같다. === 다ìŒì£¼ ì˜ˆê³ ? === * ?? ---- * ì´ ë„¤ì´ë°ì€ í•„ì‹œ íŠœí„°ì˜ ìµœê·¼ ë“œë¼ë§ˆ ì„±í–¥ì´ ë°˜ì˜ëœ 것ì¼ê²Œì•¼... - [김태진] * 오오 ì ì 재미있어진다 :D * 화요ì¼ì— í•˜ê² ë‹¤ê³ í•œ ì‚¬ëžŒë“¤ì´ ë³´ì´ì§€ 않는군요...=ã……= -[김태진] * 매우 ì• ì„í•˜ê²Œë„ ë‚´ê°€ 가지를 못 하니....... 하필 수요ì¼....... - [황현] * ì´ë²ˆì£¼ê¹Œì§€ ìˆ˜ìš”ì¼ ì €ë…˜ì´ë‹ˆê¹Œ 시간 바꿀수 있ì„듯ㅋㅋ ë˜ëŠ”ë‚ ë§í•´ - [서지혜] * 다ìŒì‹œê°„부턴 ì´ë¡ 보단 실습 위주로 가는게 ì¢‹ì„ ê²ƒ 같아요. 백문ì´ë¶ˆì—¬ì¼íƒ€ê¸°ë„ í•˜ê³ ì°¸ì—¬ìžê°„ì˜ ê°ì„ ë¹ ë¥´ê²Œ 줄ì´ëŠ” 방법ì´ê³ .. - [서지혜] * 22ì¼ë¶€í„° í™”ìš”ì¼ ì˜¤í›„ 3시입니다 - [ì¡°ê´‘í¬] * 구글 행아웃 ì •ë§ ì¢‹ë„¤ìš”ã…‹ã…‹ã…‹ã…‹ ê·¸ë ‡ë‹¤ê³ íŠœí„°ê°€ 집ì—ì„œ ì›ê²©ìœ¼ë¡œ ê°•ì˜í•´ì„œëŠ” 아니ë˜ì˜µë‹ˆë‹¤ã…‹ã…‹ã…‹ã…‹ - [김민재] * 행아웃으로 하는 ê°•ì˜ ìž¬ë¯¸ìžˆì—ˆìŠµë‹ˆë‹¤. 껄껄껄 - [권ì˜ê¸°]