E D R , A S I H C RSS

Big Bang

  • 2012λ…„ 그듀이 μŠ€ν„°λ””λΌ μ‹œμž‘ν•œλ‹€.
  • C/C++/Java λͺ¨λ‘ λ‹€λ₯Έ μ–Έμ–΄μ§€λ§Œ ν•˜λ‚˜μ—μ„œ μ‹œμž‘ν–ˆμœΌλ‹ˆ...
    • ALGOL계 언어라고도 ν•œλ‹€κ³  ν•œλ‹€.. κΆκΈˆν•΄ ν•  μ‚¬λžŒμ„ μœ„ν•΄
    • κ·ΈλŸ¬λ‚˜ λΉ„μŠ·ν•œ μ‹œκΈ°μ— νƒ„μƒν•œ Fortran, lisp등을 μ œν•˜κ³  이후 λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—κ²Œ 영ν–₯을 μ£Όμ—ˆμœΌλ‹ˆ ALGOLκ³Ό λ¬΄κ΄€ν•œ μ–Έμ–΄κ°€ μžˆμ„κΉŒ..


1. 일정

  • 일단 맀주 μˆ˜μš”μΌ 6μ‹œλΆ€ν„°
  • ν™”μš”μΌ μ˜€ν›„ 3μ‹œλΆ€ν„° 6μ‹œκΉŒμ§€

2. λͺ©μ 

  • C/C++/Java μ–Έμ–΄λΌ κ³΅λΆ€ν•˜κ³  μ„œλ‘œκ°„μ˜ μ‚¬μš©μƒ 차이점과 곡톡적인 νŒ¨ν„΄ ν•™μŠ΅
  • μ„œλ‘œ λ‹€λ₯Έ μ„Έ μ–Έμ–΄λΌ λ§ˆμΉ˜ ν•œμ–Έμ–΄μ²˜λŸΌ μ“Έμˆ˜ μžˆκ²Œλ”..
  • μ΄ˆμ‹¬μž λŒ€ν™˜μ˜

3. ν™œλ™

3.1. 2013λ…„ 1μ›” 2일

3.1.1. ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ν•„μˆ˜ μš”μ†Œ

  • μ œμ–΄λ¬Έ, 반볡문, λ³€μˆ˜, I/O
    • I/OλŠ” μ½˜μ†” λΏλ§Œμ•„λ‹ˆλΌ λ‹€λ₯Έ 어떀것이 될수 μžˆλ‹€.
      • μΌ€λΉˆ λΈνŠΈλ‹‰μ€ λͺ¨λ‹ˆν„°κ°€ μ—†μ–΄μ„œ μž‘ν˜”λ‹€.

3.1.2. 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 ν•¨μˆ˜μ˜ 리턴값

3.1.3. λ³€μˆ˜

  • μ •μ˜ - μ–΄λ–€ 값을 λ‹΄μ„μˆ˜ μžˆλŠ”κ²ƒ.
    • 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) {}λŠ” μ»΄νŒŒμΌμ—λŸ¬.

3.1.4. μ œμ–΄λ¬Έ, 반볡문

  • μ œμ–΄λ¬Έκ³Ό λ°˜λ³΅λ¬Έμ€ μ–΄μ°Œλ³΄λ©΄ λ™μΉ˜.
  • switch caseλ¬Έμ—μ„œ caseλŠ” 컴파일러만 μ•ŒλΏ(Labelμ΄λΌλŠ” μ†Œλ¦¬..)
  • μ„Έ μ–Έμ–΄μ—μ„œ caseλ¬Έ λ’€λŠ” "μ •μˆ˜" 이닀.
    • ASCII에 μ†μ§€λ§ˆλΌ.
    • java7λΆ€ν„° λ¬Έμžμ—΄μƒμˆ˜ case label 지원. case "hello": ...; κ°€ λœλ‹€.

3.2.1. 포인터 (Pointer)

  • void pointer μ‚¬μš© μžμ œν•©μ‹œλ‹€. void pointerκ°€ κ°€λ¦¬ν‚€λŠ” κ°’μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μ—†λ‹€. μ°Έκ³ 

3.2.2. ν•¨μˆ˜ (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κ°€ 없어진닀.

3.3. 2013λ…„ 1μ›” 16일

3.3.1. Thread

  • mutex, semaphore, spinlock, critical section, race condition, dead lock
  • event driven, event loop, thread polling, busy waiting,
  • java ForkJoin
    • 왠지λͺ¨λ₯΄κ²Œ C++μ—μ„œ λΉ„μŠ·ν•œκ±Έ λ§Œλ“€μ–΄ 보고 μ‹Άμ–΄ 지λ„μš” - μ•ˆν˜μ€

3.3.2. Template

  • μœΌμ•… μ΄λ ‡κ²Œ 재λΈμžˆλŠ” λ‚΄μš©λ“€μ„ λͺ» λ“€μ—ˆλ‹€λ‹ˆ γ… γ… γ… γ… γ…  - κΉ€λΌμž¬

3.4. 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) 와 κ°™λ‹€.

3.5. 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의 의λΈκ°€ λ‹¬λΌμ‘Œλ‹€??

3.6. 2013λ…„ 2μ›” 13일

  • κ°€λ³€μΈμžμ˜ 취약점을 μ΄μš©ν•œ 곡격 (Format String Attack)
  • 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의 ν• λ‹Ήν•˜λŠ” 역할에 μ΄ˆκΈ°ν™”κΉŒμ§€ ν•΄ μ€λ‹€.
κ³„μ†μž‘μ„±μ€‘

3.7. 2013λ…„ 7μ›” 12일


  • Effective C++ 책을 κ³΅λΆ€ν•˜κΈ°λ‘œ κ²°μ •

3.7.1. μš©μ–΄ μ •μ˜


  • μ„ μ–Έ(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에 μ˜ν•΄μ„œ)




3.7.2. Chapter 1. C++λΌ μ–Έμ–΄λ“€μ˜ μ—°ν•©μ²΄λ‘œ λ°”λΌλ³΄λŠ” μ•ˆλͺ© ν•„μˆ˜


  • C, OOP, Template, STL
  • C++의 νŒ¨λŸ¬λ‹€μž„μ΄ λ‹€μ–‘ν•˜κΈ° λ•Œλ¬Έμ— C++λΌ μ‚¬μš©ν•˜λŠ” 방법도 맀우 λ‹¬λΌμ§ˆ 수 있고 μ΅œμ ν™” 방법도 λ‹¬λΌμ§ˆ 수 밖에 μ—†λ‹€.

  • μ“°λŠ” 방법에 λ”°λΌμ„œ 케바케인 것!

3.7.3. 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으둜 λŒ€μ²΄ ν•˜λ©΄ ν•΄κ²°


3.7.4. 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 κ³Ό κ°™λ‹€.

3.8. 7μ›” 19일


3.9. λ‹€μŒμ£Ό 예고?

  • ??


  • 이 λ„이밍은 ν•„μ‹œ νŠœν„°μ˜ 졜근 λ“œλΌλ§ˆ μ„±ν–₯이 반영된 κ²ƒμΌκ²Œμ•Ό... - κΉ€νƒœμ§„
  • 였였 점점 재λΈμžˆμ–΄μ§„λ‹€ :D
  • ν™”μš”μΌμ— ν•˜κ² λ‹€κ³  ν•œ μ‚¬λžŒλ“€μ΄ 보이지 μ•ŠλŠ”κ΅°μš”...=γ……= -κΉ€νƒœμ§„
  • 맀우 μ• μ„ν•˜κ²Œλ„ λ‚΄κ°€ κ°€μ§€λΌ λͺ» ν•˜λ‹ˆ....... ν•˜ν•„ μˆ˜μš”μΌ....... - ν™©ν˜„
    • μ΄λ²ˆμ£ΌκΉŒμ§€ μˆ˜μš”μΌ μ €λ…˜μ΄λ‹ˆκΉŒ μ‹œκ°„ λ°”κΏ€μˆ˜ μžˆμ„λ“γ…‹γ…‹ λ˜λŠ”λ‚  말해 - μ„œμ§€ν˜œ
  • λ‹€μŒμ‹œκ°„λΆ€ν„΄ 이둠보단 μ‹€μŠ΅ μœ„μ£Όλ‘œ κ°€λŠ”κ²Œ 쒋을 것 κ°™μ•„μš”. λ°±λ¬Έμ΄λΆˆμ—¬μΌνƒ€κΈ°λ„ ν•˜κ³  μ°Έμ—¬μžκ°„μ˜ 갭을 λΉ λ₯΄κ²Œ μ„μ΄λŠ” 방법이고.. - μ„œμ§€ν˜œ
  • 22일뢀터 ν™”μš”μΌ μ˜€ν›„ 3μ‹œμž…λ‹ˆλ‹€ - 쑰광희
  • ꡬ글 행아웃 정말 μ’‹λ„μš”γ…‹γ…‹γ…‹γ…‹ κ·Έλ ‡λ‹€κ³  νŠœν„°κ°€ μ§‘μ—μ„œ μ›κ²©μœΌλ‘œ κ°•μ˜ν•΄μ„œλŠ” μ•„λ‹ˆλ˜μ˜΅λ‹ˆλ‹€γ…‹γ…‹γ…‹γ…‹ - κΉ€λΌμž¬
  • ν–‰μ•„μ›ƒμœΌλ‘œ ν•˜λŠ” κ°•μ˜ 재λΈμžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ»„κ»„κ»„ - ꢌ영기
  • λ©˜ν† λ§ 회의 λ•Œλ¬Έμ— μ§€λ‚œ κΈˆμš”μΌ μ°Έμ—¬ λͺ»ν–ˆλ„μš”.. γ… γ…  - κΉ€λΌμž¬
  • http://wiki.zeropage.org/wiki.php/i++VS++i 이거 전에 μ–˜κΈ°ν–ˆλ˜κ±°λ‹€ - μ„œμ§€ν˜œ
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:36
Processing time 0.1015 sec