Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

BigBang: Difference between revisions

From ZeroWiki
imported>ncbonta
No edit summary
(Repair batch-0001 pages from live compare)
 
(70 intermediate revisions by 6 users not shown)
Line 1: Line 1:
* 2012년 그들이 스터디를 시작한다.
* 2012년 그들이 스터디를 시작한다.
* C/C++/Java 모두 다른 언어지만 하나에서 시작했으니...
* 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과 무관한 언어가 있을까..
__TOC__
__TOC__


== 일정 ==
== 일정 ==
* 일단 매주 수요일 6시부터
* ~~일단 매주 수요일 6시부터~~
 
* 화요일 오후 3시부터 6시까지
== 목적 ==
== 목적 ==
* C/C++/Java 언어를 공부하고 서로간의 사용상 차이점과 공통적인 패턴 학습
* C/C++/Java 언어를 공부하고 서로간의 사용상 차이점과 공통적인 패턴 학습
Line 13: Line 14:


== 활동 ==
== 활동 ==
=== [[2013년 1월 2일]] ===
=== 2013년 1월 2일 ===
** [[권영기]], [[김민재]], [[박상영]], [[조광희]]
** [[권영기]], [[김민재]], 박상영, [[조광희]]
==== 프로그래밍 언어의 필수 요소 ====
==== 프로그래밍 언어의 필수 요소 ====
** 제어문, 반복문, 변수, I/O
** 제어문, 반복문, 변수, I/O
Line 39: Line 40:
** 지금부터 어떤 특정 네임스페이스를 쓰겠다는 지시어.
** 지금부터 어떤 특정 네임스페이스를 쓰겠다는 지시어.
* 문자열  
* 문자열  
** char의 배열
** char의 배열, '''null terminated''' char sequence
** 자바에서는 아닌것 처럼 보여도 사실 내부적으로는 비슷하다.
** 자바에서는 아닌것 처럼 보여도 사실 내부적으로는 비슷하다.
** string Class
** string Class
Line 48: Line 49:
** 이걸로 프로그램이 제대로 끝났는지 판단한다.
** 이걸로 프로그램이 제대로 끝났는지 판단한다.
** return에는 중요한 특성이 있는데 이게 호출되면 지역변수를 정리한다.
** return에는 중요한 특성이 있는데 이게 호출되면 지역변수를 정리한다.
** [http://thenine.egloos.com/430823 main 함수의 리턴값]
==== 변수 ====
==== 변수 ====
* 정의 - 어떤 값을 담을수 있는것.
* 정의 - 어떤 값을 담을수 있는것.
Line 62: Line 64:
* bool  
* bool  
** 1bit 짜리.
** 1bit 짜리.
** C는 bool이 없다! - C11은 있단다.
** C는 bool이 없다!, c++은 있다. java는 boolean으로 사용한다. - C11은 있단다.
** 대부분의 경우 그냥 정수로 처리한다.
** 대부분의 경우 그냥 정수로 처리한다.
** 값이 0이면 false 그외는 true
** 값이 0이면 false 그외는 true
** c++에서도 0은 false로, 그외는 true로 간주된다. while(1) {}, while(true) {} 둘 다 가능
** java에서는 int와 boolean은 호환되지 않는다. while(1) {}는 컴파일에러.
==== 제어문, 반복문 ====
==== 제어문, 반복문 ====
* 제어문과 반복문은 어찌보면 동치.
* 제어문과 반복문은 어찌보면 동치.
Line 70: Line 74:
* 세 언어에서 case문 뒤는 "정수" 이다.
* 세 언어에서 case문 뒤는 "정수" 이다.
** ASCII에 속지마라.
** ASCII에 속지마라.
** java7부터 문자열상수 case label 지원. case "hello": ...; 가 된다.
=== 2013년 1월 9일 ===
* 참가자 : [[권영기]], [[김민재]], [[김해천]], [[서지혜]], [[조광희]]


=== [[2013년 1월 9일]] ===
==== 포인터 (Pointer) ====
* 참가자 : [[권영기]], [[김민재]], [[김해천]], [[서지혜]], [[조광희]]
* void pointer 사용 자제합시다. void pointer가 가리키는 값의 타입을 추론할 수 없다. [http://stackoverflow.com/questions/1718412/find-out-type-of-c-void-pointer 참고]


==== 함수 (Function) ====
==== 함수 (Function) ====
Line 79: Line 86:
* 많은 기능을 잘게 쪼개기 위해 함수를 사용한다.
* 많은 기능을 잘게 쪼개기 위해 함수를 사용한다.
* 가독성을 좋게 한다.
* 가독성을 좋게 한다.
* 코드의 재사용성을 높인다.
* global variable의 사용을 자제하자. 함수의 기능을 이해하기 어렵게 만든다.
* global variable의 사용을 자제하자. 함수의 기능을 이해하기 어렵게 만든다.
* void pointer 사용 자제합시다. void pointer가 가리키는 값의 타입을 추론할 수 없다. [http://stackoverflow.com/questions/1718412/find-out-type-of-c-void-pointer 참고]
** 변수 접근을 제어하기 힘들기 때문에 버그를 유발할 확률도 증가한다.
 
* 파라메터 전달 방식
## call by value
## call by pointer
## call by reference(alias)
* C/C++/Java의 parameter는 call-by-value 형식으로 값을 전달한다.
* C/C++/Java의 parameter는 call-by-value 형식으로 값을 전달한다.
* 포인터 값을 전달하는 Call-by-reference의 경우는, 포인터 값을 복사의 방식으로 전달하게 되므로, 일종의 call-by-value라고 볼 수 있다.
* 포인터 값을 전달하는 Call-by-reference의 경우는, 포인터 값을 복사의 방식으로 전달하게 되므로, 일종의 call-by-value라고 볼 수 있다.
Line 91: Line 102:
** 함수 decorator : C++의 오버로딩을 하게 되면, 컴파일 타임에서 각각의 함수를 구분할 수 있도록 붙는 머릿말
** 함수 decorator : C++의 오버로딩을 하게 되면, 컴파일 타임에서 각각의 함수를 구분할 수 있도록 붙는 머릿말
** extern "C"를 이용하면 이러한 함수 decorator가 없어진다.
** 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 &lt;&lt; "hello" &lt;&lt; endl;
  }
  }
이렇게 정의 해 놓은 상태에서
  int main() {
  foo *bar = NULL;
  bar-&gt;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, 인수타입); -&gt; 가변 인수를 읽는 명령
    va_end(ap);
  }
* 형은 보장하지 않는다. 가변인자들의 형을 강제할 수 없기 때문에 stack에 void*로 저장된다. 그리고 최소한 인자가 하나는 있어야 한다.
** printf는 어떻게 인자들의 형을 관리하지? - [[서지혜]]
** printf의 경우에는 첫째인자로 형을 판단할수 있기 때문에 문제가 되지 않죠. 하지만 같은 이유에서인지 printf("%f", 3) 을 잘못출력하는 문제가 있습니다. 이 취약점을 이용한 해킹 방법도 존재하지요. - [[안혁준]]
** 첫번째 인자 안에 %d.. 등으로 가변인자의 형을 검사하는거야? - [[서지혜]]
*** 정답! 첫번째 인자에 이미 형에대한 정보를 넘겨 주기 때문에 가변인자라도 대쳐가 가능합니다.
예시 코드
  #include &lt;iostream&gt;
  #include &lt;cstdarg&gt;
  using namespace std;
  void test(int num, ...) {
  va_list ap;
  va_start(ap, num);
  for(int i=0; i&lt;num; i++) {
    cout &lt;&lt; va_arg(ap, int) &lt;&lt; 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&lt;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 &lt;widget *&gt; 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) - 어떤 대상의 이름과 타입을 컴파일러에게 알려 주는 것
    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-&gt;str = input(); // BOOM!
      l-&gt;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
  //-&gt; T * const
  const_iterator a
  //-&gt; const T *
 
** 열심히 잘 붙이면 소스코드가 견고해진다.
** const Function이냐 아니냐로도 overloading이 된다.
 
** 비트 수준 상수성 - 어떤 맴버 함수가 그 객체의 어떤 데이터 맴버도 건드리지 않아야 하지만 그 맴버 함수가 const임을 인정하는 개념.(C++에서는 )
** 비트 수준 상수성의 한계 : const 함수에서 객체의 어떤 데이터 맴버는 건드리지 않고 데이터 맴버가 가리키는 데이터를 건드리는 경우는 막을 수 없다.
 
** 논리 수준 상수성
 
 
** 비상수 버전과 상수 버전 - 비상수 버전에서 상수 버전을 호출;
 
    const_cast : const를 떼어내는 것
    static_cast : const를 붙이는 것 -> C style의 (const type)variable 과 같다.
=== 7월 19일 ===


=== 다음주 예고? ===
=== 다음주 예고? ===
* ??


----
----
Line 100: Line 396:
* 오오 점점 재미있어진다 :D  
* 오오 점점 재미있어진다 :D  
* 화요일에 하겠다고 한 사람들이 보이지 않는군요...=ㅅ= -[[김태진]]
* 화요일에 하겠다고 한 사람들이 보이지 않는군요...=ㅅ= -[[김태진]]
 
* 매우 애석하게도 내가 가지를 못 하니....... 하필 수요일....... - [[황현]]
** 이번주까지 수요일 저녘이니까 시간 바꿀수 있을듯ㅋㅋ 되는날 말해 - [[서지혜]]
* 다음시간부턴 이론보단 실습 위주로 가는게 좋을 것 같아요. 백문이불여일타기도 하고 참여자간의 갭을 빠르게 줄이는 방법이고.. - [[서지혜]]
* 22일부터 화요일 오후 3시입니다 - [[조광희]]
* 구글 행아웃 정말 좋네요ㅋㅋㅋㅋ 그렇다고 튜터가 집에서 원격으로 강의해서는 아니되옵니다ㅋㅋㅋㅋ - [[김민재]]
* 행아웃으로 하는 강의 재미있었습니다. 껄껄껄 - [[권영기]]
* 멘토링 회의 때문에 지난 금요일 참여 못했네요.. ㅠㅠ - [[김민재]]
* [http://wiki.zeropage.org/wiki.php/i++VS++i] 이거 전에 얘기했던거다 - [[서지혜]]

Latest revision as of 23:56, 26 March 2026

  • 2012년 그들이 스터디를 시작한다.
  • C/C++/Java 모두 다른 언어지만 하나에서 시작했으니...
    • ALGOL계 언어라고도 한다고 한다.. 궁금해 할 사람을 위해
    • 그러나 비슷한 시기에 탄생한 Fortran, lisp등을 제하고 이후 대부분의 언어에게 영향을 주었으니 ALGOL과 무관한 언어가 있을까..

일정

  • ~~일단 매주 수요일 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에는 중요한 특성이 있는데 이게 호출되면 지역변수를 정리한다.
    • 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가 가리키는 값의 타입을 추론할 수 없다. 참고

함수 (Function)

  • function이란 input과 output이 있는 기능 단위
    • 함수에 parameter 를 넘겨주지 않거나 return 이 없는 함수도 있음.
  • 많은 기능을 잘게 쪼개기 위해 함수를 사용한다.
  • 가독성을 좋게 한다.
  • 코드의 재사용성을 높인다.
  • global variable의 사용을 자제하자. 함수의 기능을 이해하기 어렵게 만든다.
    • 변수 접근을 제어하기 힘들기 때문에 버그를 유발할 확률도 증가한다.
  • 파라메터 전달 방식
    1. call by value
    2. call by pointer
    3. 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가 없어진다.
    • extern "c"의 의미?
    • 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일

 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 : 참고
  • c++11에서 auto의 의미가 달라졌다??

2013년 2월 13일

  • 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, 덱이라고도 한다. 참고), 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) - 어떤 대상의 이름과 타입을 컴파일러에게 알려 주는 것
   	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 과 같다.

7월 19일

다음주 예고?

  • ??

  • 이 네이밍은 필시 튜터의 최근 드라마 성향이 반영된 것일게야... - 김태진
  • 오오 점점 재미있어진다 :D
  • 화요일에 하겠다고 한 사람들이 보이지 않는군요...=ㅅ= -김태진
  • 매우 애석하게도 내가 가지를 못 하니....... 하필 수요일....... - 황현
    • 이번주까지 수요일 저녘이니까 시간 바꿀수 있을듯ㅋㅋ 되는날 말해 - 서지혜
  • 다음시간부턴 이론보단 실습 위주로 가는게 좋을 것 같아요. 백문이불여일타기도 하고 참여자간의 갭을 빠르게 줄이는 방법이고.. - 서지혜
  • 22일부터 화요일 오후 3시입니다 - 조광희
  • 구글 행아웃 정말 좋네요ㅋㅋㅋㅋ 그렇다고 튜터가 집에서 원격으로 강의해서는 아니되옵니다ㅋㅋㅋㅋ - 김민재
  • 행아웃으로 하는 강의 재미있었습니다. 껄껄껄 - 권영기
  • 멘토링 회의 때문에 지난 금요일 참여 못했네요.. ㅠㅠ - 김민재
  • [1] 이거 전에 얘기했던거다 - 서지혜