* 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(); 
 }
}}}
이렇게 작성해서 실행하면, 보기에는 실행이 안 될 것 같지만 실행이 된다.
 -> 인스턴스는 0를 가리키지만, 실제로 실행될 때는 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는 어떻게 인자들의 형을 관리하지? - [서지혜]
 예시 코드
{{{
 #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의 의미가 달라졌다?? 
[계속작성중]  

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

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