''출발합니다 ì•ˆì „ë²¨íŠ¸ 매시구요'' ''ì‹ì‚¬ í•˜ê³ ì˜¤ì…¨ë‚˜ìš”? 멀미가 좀 ì‹¬í• í…ë°...'' [[TableOfContents]] = 미시Cpp = 회차 : 1회차 시간 : 11시 30ë¶„ ~ 2시 30ë¶„(ì˜ˆì •) => 12시 ~ 2시(ì‹¤ì œ) 장소 : 6층 == ì°¸ê°€ì› == || ë©˜í† || [장용운] || ì§€ê° || ||<|3> 멘티 || [ìœ ìž¬ë²”] || ì¶œì„ || || [ì‹ í˜•ì² ] || ì¶œì„ || || [김성ì›] || ì¶œì„ || == ì´ë²ˆì— 배울 것 == * C와 C++ì˜ ì°¨ì´ì * í—¤ë”와 include ê°œë… ìž¡ê¸° * 네임스페ì´ìФ * std::cout, std::cin, std::endl * 참조형 * 함수 오버로딩 * ë””í´íЏ 파ë¼ë¯¸í„° * ë™ì í• ë‹¹ ì—°ì‚°ìž new, delete, delete[] * 구조체와 í´ëž˜ìФ * í´ëž˜ìŠ¤ì™€ ì¸ìŠ¤í„´ìŠ¤ * í´ëž˜ìФ ì •ì˜ ë¬¸ë²• * 메서드 외부 ì •ì˜ì™€ í—¤ë” * ★(C++11)auto * ★(C++11)range-based for loop * ★(C++11)std::array = 스터디 ì§„í–‰ = == ë‚´ìš© == 1. C와 C++ì˜ ì°¨ì´ì * C++ì€ ê°ì²´ì§€í–¥ í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ì´ë‹¤. * C는 규모ì 으로 C++ì˜ subsetì´ë¼ê³ ìƒê°í•˜ê¸° 쉽다. * C++ì—ì„œì˜ í‘œì¤€ ë¼ì´ë¸ŒëŸ¬ë¦¬ í—¤ë”ëª…ì€ .h로 ë나지 않는다. * 기존 Cì—ì„œì˜ í—¤ë”를 ì´ìš©í•˜ê³ 싶다면 <ì´ë¦„.h>를 <cì´ë¦„>으로 ì„ ì–¸í•´ì„œ ì´ìš©í• 수 있다(C++í˜¸í™˜ë²„ì „). 2.í—¤ë”와 include ê°œë… ìž¡ê¸° * í—¤ë”는 다른 í—¤ë”ì˜ include나 ì „ì²˜ë¦¬ê¸° 매í¬ë¡œ, í´ëž˜ìŠ¤ë‚˜ 함수 ë“±ì˜ declarationì´ ë“¤ì–´ê°„ë‹¤. * 외부 파ì¼ì— ì •ì˜ëœ 함수나 í´ëž˜ìŠ¤ì˜ declarationì€ ëª¨ë“ íŒŒì¼ì— 필요하다. declarationì´ ì—†ìœ¼ë©´ ì™¸ë¶€ì— ì •ì˜ëœ 함수나 í´ëž˜ìŠ¤ë¥¼ ì´ìš©í• 수 없다. * declarationì´ ìžˆì§€ë§Œ definitionì´ ì—†ëŠ” identifier는 ë§ì»¤ì— ì˜í•´ 외부 ë§í¬ê°€ ì´ë£¨ì–´ì§„다. 3. 네임스페ì´ìФ * 네임스페ì´ìŠ¤ëŠ” 다른 팀ì›ì´ 작성한 소스 ì½”ë“œì™€ì˜ ì´ë¦„ ì¶©ëŒì„ 막아준다. * 네임스페ì´ìФ 중괄호 블ë¡ì€ ê°™ì€ ì´ë¦„으로 다시 만들 수 있다. 4. std::cout, std::cin, std::endl * std::cin, std::coutì€ C++ì—ì„œì˜ í‘œì¤€ ìž…ì¶œë ¥ 스트림ì´ë‹¤. * <<ì—°ì‚°ìžì™€ >>ì—°ì‚°ìžë¥¼ ì´ìš©í•˜ì—¬ ëª¨ë“ ê¸°ë³¸ íƒ€ìž…ì„ ì¶œë ¥í• ìˆ˜ 있다. * std::endlì€ ì¤„ë°”ê¿ˆì„ ì˜ë¯¸í•œë‹¤. 5. 참조형 * ì°¸ì¡°í˜•ì€ ë³€ìˆ˜ì˜ ì´ë¦„ì„ ì¶”ê°€ ì •ì˜í•˜ëŠ” 방법ì´ë‹¤. * ì°¸ì¡°í˜•ì€ ì„ ì–¸ 시 ì°¸ì¡°í• ëŒ€ìƒì„ 초기화해야 한다. * 한번 대ìƒì„ ì§€ì •í•œ ì°¸ì¡°í˜•ì€ ì°¸ì¡° 대ìƒì„ 바꿀 수 없다. * ì°¸ì¡°í˜•ì€ í¬ì¸í„°ë³´ë‹¤ ì•ˆì „í•œ call-by-reference 방법ì´ë‹¤. * 함수 파ë¼ë¯¸í„°ë¡œ ì°¸ì¡°í˜•ì„ ì´ìš©í• 수 있다. * ì°¸ì¡°í˜•ì„ ì´ìš©í•˜ë©´ ê°’ì˜ ë³µì‚¬ê°€ ì „í˜€ ì¼ì–´ë‚˜ì§€ 않는다. 6. 함수 오버로딩 * C++ì—서는 ê°™ì€ ì´ë¦„ì˜ í•¨ìˆ˜ë¼ë„ ì¸ìžì˜ 개수나 íƒ€ìž…ì´ ë‹¤ë¥´ë‹¤ë©´ 중복 ì •ì˜í• 수 있다. * 리턴 타입만 다른 경우ì—는 ì˜¤ë²„ë¡œë”©í• ìˆ˜ 없다. * 함수를 ì˜¤ë²„ë¡œë”©í• ë•ŒëŠ” ì‹¤ì œ í˜¸ì¶œí• ë•Œ ëª¨í˜¸ì„±ì´ ë°œìƒí•˜ì§€ 않아야 한다. || void func(int, int); || void func(float, float); || ||<-2> func(1, 2)는 왼쪽 함수가 호출ëœë‹¤ func(1.0, 2)나 func(1, 2.0)ì€ floatê°€ int로 묵시ì 형 ë³€í™˜ì´ ì¼ì–´ë‚˜ 왼쪽 함수가 호출ëœë‹¤ func(1.0, 2.0)ì€ ëª¨í˜¸ì„± ì—러가 ë°œìƒí•œë‹¤ || 7. ë””í´íЏ 파ë¼ë¯¸í„° * 함수 파ë¼ë¯¸í„°ì— ë””í´íЏ ê°’ì„ ì§€ì •í•˜ë©´ 해당 ì¸ìžë¥¼ ìƒëžµí•˜ì—¬ ë””í´íЏ ê°’ì„ ì§€ì •í• ìˆ˜ 있다. * ë””í´íЏ 파ë¼ë¯¸í„°ëŠ” 가장 우측 파ë¼ë¯¸í„°ë¶€í„° ì 용해야 한다. ê·¸ë ‡ê²Œ ê°•ì œí•˜ì§€ 않으면 ì–´ëŠ ì¸ìžê°€ ìƒëžµë는지 êµ¬ë¶„í• ìˆ˜ 없기 때문ì´ë‹¤. * ë””í´íЏ 파ë¼ë¯¸í„°ëŠ” 함수 í”„ë¡œí† íƒ€ìž… ì„ ì–¸ì„ ì‚¬ìš©í• ê²½ìš° ì„ ì–¸ë¶€ì—ë§Œ 작성해야 한다. ì •ì˜ë¶€ì—서는 ë””í´íЏ ê°’ì„ ê¸°ìˆ í•˜ì§€ 않는다. * ë””í´íЏ 파ë¼ë¯¸í„°ì— ì˜í•´ ìƒëžµì´ 가능한 함수를 ì˜¤ë²„ë¡œë”©í• ë•ŒëŠ” 모호성 ì—러를 피해야 한다. 8. ë™ì í• ë‹¹ ì—°ì‚°ìž new, delete, delete[] * new ì—°ì‚°ìžë¥¼ ì´ìš©í•˜ì—¬ ë‹¨ì¼ ë³€ìˆ˜ë‚˜ ë°°ì—´ì„ íŽ¸ë¦¬í•˜ê²Œ ë™ì í• ë‹¹í• ìˆ˜ 있다. * ë‹¨ì¼ ë³€ìˆ˜ì˜ í•´ì œì—는 delete, ë°°ì—´ì˜ í•´ì œì—는 delete[]를 ì´ìš©í•œë‹¤. 9. í´ëž˜ìŠ¤ì™€ ì¸ìŠ¤í„´ìŠ¤ * í´ëž˜ìŠ¤ëŠ” ì¶”ìƒì ê°œë…ì„ ì •ì˜í•œ 것ì´ê³ ì¸ìŠ¤í„´ìŠ¤ëŠ” ê·¸ê²ƒì„ êµ¬ì²´í™”í•œ ì‹¤ì œ 변수ì´ë‹¤. 10. í´ëž˜ìФ ì •ì˜ ë¬¸ë²• * í´ëž˜ìŠ¤ë¥¼ ì •ì˜í• ë• ì„¸ë¯¸ì½œë¡ ì„ ì“´ë‹¤. 11. 메서드 외부 ì •ì˜ì™€ í—¤ë” * í´ëž˜ìŠ¤ì˜ ë©”ì„œë“œëŠ” í´ëž˜ì„œ ì •ì˜ë¶€ì— ì„ ì–¸ë§Œ í•˜ê³ ì™¸ë¶€ì—서 ì •ì˜í• 수 있다. * 보통 í—¤ë”ì—는 메서드 ì •ì˜ë¥¼ í¬í•¨í•˜ì§€ 않는다. 12.(C++11)auto * auto 키워드는 수ì‹ìœ¼ë¡œë¶€í„° íƒ€ìž…ì„ ì¶”ë¡ í•œë‹¤. * auto& 키워드는 ì¶”ë¡ ëœ íƒ€ìž…ì˜ ì°¸ì¡°í˜•ì„ ì˜ë¯¸í•œë‹¤. 13. (C++11)range-based for loop * 범위 기반 forë¬¸ì„ ì´ìš©í•˜ë©´ ë°°ì—´ì´ë‚˜ STL 컨테ì´ë„ˆë¥¼ 편리하게 ìˆœíšŒí• ìˆ˜ 있다. 14. (C++11)std::array * std::array를 ì´ìš©í•˜ë©´ 편리하게 ë°°ì—´ì„ ë‹¤ë£° 수 있다. == 코드 == * C í—¤ë” ì´ìš©í•˜ê¸° ||<:> C ||<:> C++ || ||<:> #include <stdio.h> ||<:> #include <cstdio> || ||<:> #include <stdlib.h> ||<:> #include <cstdlib> || ||<:> #include <string.h> ||<:> #include <cstring> || 기타 등등... * namespace 키워드 {{{ using namespace std; // std 네임스페ì´ìŠ¤ë¥¼ ìƒëžµí•˜ê³ 사용가능 using std::endl; // endlë§Œ std를 ìƒëžµí•˜ê³ 사용가능 namespace A { void testMethod() { std::cout << "A.testMethod called" << std::endl; } } namespace B { void testMethod() { std::cout << "B.testMethod called" << std::endl; } } void main(void) { A::testMethod(); B::testMethod(); /* output A.testMethod called B.testMethod called */ } }}} * std::cout, std::cin, std::endl {{{ #include <iostream> // 필요함 void main(void) { std::cout << "ì¶œë ¥í•˜ëŠ” 함수" << 0 << 0.4 << std::endl; // std::endlì€ ê°œí–‰, 숫ìžë‚˜ ì‹¤ìˆ˜ë„ ì¶œë ¥ê°€ëŠ¥ int a; char * testArr[5] = {0, }; std::cin >> a; // & í•„ìš”ì—†ìŒ std::cin >> testArr // 가능 } }}} * 참조형 {{{ void main(void) { int num = 4; int& refNum = num; // refNumì€ numê³¼ ê°™ì´ ì·¨ê¸‰ë¨, í¬ì¸í„°ë„ 아니다. addOne(num); // call-by-value. num = 4로 변함 addOne(refNum); // call-by-reference. num = 5로 변함 } }}} * 함수 오버로딩 {{{ void overloadMethod(); void overloadMethod(int a); void overloadMethod(int b, int c); // ì˜¤ë²„ë¡œë“œëœ í•¨ìˆ˜ë“¤ }}} * ë””í´íЏ 파ë¼ë¯¸í„° {{{ void testMethod(int a, int b, int c = 5) // c는 ë””í´íЏ 파ë¼ë¯¸í„° void main(void) { testMethod(1,2,3); // 가능 testMethod(1,2); // ì´ê²ƒë„ 가능 } void testMethod(int a, int b, int c) // ì •ì˜ë¶€ì—는 ë””í´íЏ 파ë¼ë¯¸í„° 금지 { // .... } }}} * ë™ì í• ë‹¹ ì—°ì‚°ìž new, delete, delete[] {{{ void main(void) { int * allocArray = new int[5]; std::string * allocString = new string(); // new로 ë™ì í• ë‹¹ delete allocString; // 메모리 í•´ì œ delete[] allocArray; // ë°°ì—´ 메모리를 í•´ì œí• ë•Œ 사용 } }}} * í´ëž˜ìŠ¤ì™€ ì¸ìŠ¤í„´ìŠ¤ {{{ class TestClass // í´ëž˜ìФ { }; void main(void) { TestClass inst = TestClass(); // ì¸ìŠ¤í„´ìŠ¤ TestClass * pInst = new TestClass(); // ë™ì í• ë‹¹ ì¸ìŠ¤í„´ìŠ¤ delete pInst; } }}} * Class ì •ì˜í•˜ê¸° {{{ class TestClass { // 필드(멤버)나 메서드를 채워넣기 }; // ì„¸ë¯¸ì½œë¡ ì‚½ìž…ì— ì£¼ì˜ }}} * 메서드 외부 ì •ì˜ {{{ class TestClass { void testMethod(int para1, int para2); // í”„ë¡œí† íƒ€ìž…ë§Œ ì •ì˜ }; // 외부ì—서 testMethod 메서드를 ì •ì˜í•¨ void TestClass::testMethod(int para1, int para2) { std::cout << para1 << para2 << std::endl; } }}} * '''(C++11)''' auto 키워드 {{{ auto typeArray = new int[5]; // typeArray는 ìžë™ìœ¼ë¡œ int *로 ì„¤ì •ë¨ TestClass testInst = TestClass(); auto& realNum = testInst; // realNumì€ TestClass&로 ìžë™ ì„¤ì •ë¨ }}} * '''(C++11)''' ranged-based for loop {{{ int testArray[5] = { 1, 2, 3, 4, 5 }; for (int value : testArray) { // value는 순서대로 1, 2, 3, 4, 5ê°€ ëŒ€ìž…ë¨ } for (int& refValue : testArray) { // ì°¸ì¡°í˜•ìœ¼ë¡œë„ ê°€ëŠ¥ } for ((auto í˜¹ì€ auto&) value : something) { // ë”가를 한다. } }}} * '''(C++11)''' std::array {{{ #include <array> // 필요함 void main(void) { std::array<type, size> cppArray = { .... }; // cppArray ì•„ëž˜ì— ìžˆëŠ” 다양한 메서드 ì´ìš© 가능 } }}} ---- = 잡담 = * 잘하는 ì• ë“¤ì´ë‹ˆê¹ ì§„ë„ ë¹¨ë¦¬ 뺄거임 ë¸Œë ˆì´í¬ ì—†ìŒ - [장용운] * ìš°ì£¼ì„ ì€ ê´€ì„±ìœ¼ë¡œ ê°€ë„ ë˜ëŠ”ë° íŠœí„°ë‹˜ì´ ë¬´í•œ 부스터를 ë°œë™í•˜ê³ ê³„ì‹ ë‹µë‹ˆë‹¤... - [ìœ ìž¬ë²”] * ì½”ë“œëž€ì´ ë¹„ì–´ìžˆì–´ì„œ 채워갑니다! ~~틀린 ê²ƒì´ ìžˆì„ ìˆ˜ 있습니다.~~ - [ì‹ í˜•ì² ] * 나ì´ìФ í˜•ì² ì´ ì½”ë“œì˜¬ë¦¬ë‹ˆê¹Œ 우리있어보임ㅋㅋㅋㅋㅋ - [장용운] --------------------------------------------------------------------- [활ë™ì§€ë„/2015] [미시Cpp]