01. C++μ μΈμ΄λ€μ μ°ν©μ²΄μ΄λ€.
c++μ ν¬κ² 4κ°μ§ μΈμ΄μ μ°ν©μ²΄μ΄κ³ , μ΄λ€ λΆλΆμ μ¬μ©νλλμ λ°λΌ νλ‘κ·Έλλ° κ·μΉμ΄ λ€λ₯΄λ€.
01. c
02. κ°μ²΄ μ§ν₯ κ°λ μ c++
classλ₯Ό μ°λ c
03. template c++
c++μ μΌλ°ν νλ‘κ·Έλλ°
04. STL
template library
02. #define 보λ€λ const, enum, inlineμ΄ μ’λ€.
λ¨μν μμλ₯Ό μΈ λλ, λ§€ν¬λ‘ λμ const κ°μ²΄ λλ enumλ₯Ό μ΄λ€.
issue
μ«μ μμλ‘ λ체λ μ½λμμ μ»΄νμΌ μλ¬λΌλ λ°μνλ©΄ ν·κ°λ¦°λ€.
#define PI 3.14
μμ€μ½λκ° μ»΄νμΌλ¬μκ² PIλ₯Ό μλ €μ£ΌκΈ° μ μ, μ ν μ²λ¦¬μκ° μ«μ μμλ‘ λ체ν΄λ²λ¦¬λ―λ‘ μ»΄νμΌλ¬λ PIκ° μλλΌ 3.14λ‘ μΈμνλ€. μ¦, PIλ μ»΄νμΌλ¬μ κΈ°νΈ ν μ΄λΈμ λ€μ΄κ°μ§ μλλ€.
Solution
λ¨μν μμλ₯Ό μΈ λλ, λ§€ν¬λ‘ λμ const κ°μ²΄ λλ enumλ₯Ό μ΄λ€.
const double pi=3.14;
μ»΄νμΌμ κ±°μΉ μ΅μ’
μ½λμ ν¬κΈ°κ° λ§€ν¬λ‘λ₯Ό μ¬μ©ν λλ³΄λ€ λ μλ€.
μλνλ©΄ μ μλ PIλ§λ€ 3.14λ‘ λ°κΏμ€μ λ±μ₯νμλ§νΌ 3.14μ μ¬λ³Έμ΄ νμνμ§λ§, νμλ μ¬λ³Έμ΄ pi 1κ°λ©΄ λκΈ° λλ¬Έμ΄λ€.
caution
μμ ν¬μΈν°λ₯Ό μ μν λ const μ°μ
ν¬μΈν°μ ν¬μΈν°κ° κ°λ¦¬ν€λ λμ λ λ€ constλ‘ μ μΈνλ€.
const char* const name = "Larvine Kim"; //const std::string name = "Larvine Kim";
caution
ν΄λμ€ μμλ₯Ό μ μν λ μμμ μ¬λ³Έ κ°μλ₯Ό 1κ°λ‘ μ νκ³ μΆλ€λ©΄ static memberλ‘ λ§λ€μ
class GamePlayer{
private:
static const int numTurns = 5; //μ μΈ
int scores[numTurns];
}
caution
static memberλ‘ λ§λ€μ΄μ§λ μ μλ₯ νμ
(κ°μ’
μ μνμ
, char, bool λ±)μ ν΄λμ€ λ΄λΆ μμλ μ μΈλ§ ν΄λ λλ€!
λ¨, ν΄λμ€ μμμ μ£Όμλ₯Ό ꡬνλ κ²½μ°, μ»΄νμΌλ¬κ° μ μλ₯Ό ν΄λΌκ³ νλ κ²½μ°μλ λ³λλ‘ μ μν΄μΌ νλ€.
const int GamePlayer::numTurns; //μ μ
ν΄λμ€ μμλ μ μΈν λ μ΄κΈ°ννλ―λ‘ μ μν λλ κ°μ μ£Όμ§ μλλ€. μ΄ λ, μ€λλ μ»΄νμΌλ¬ μ€ λ°λλ‘ static ν΄λμ€ λ©€λ²κ° μ μΈν λ μ΄κΈ°κ°μ μ€μλ μλλ€κ³ νλ κ²½μ°λ μμΌλ,
μ΄ λλ λ°λλ‘ νλ€. μ΄μ λν ν΄κ²°μ±
μΌλ‘ λμ΄μ λκ°μ (enum hack)
μ΄ μλ€.
caution
#defineλ ν΄λμ€ μμλ₯Ό μ μνλλ° μΈ μ μκ³ , private λ± μΊ‘μνλ μλλ€.
λμ΄μ λκ°μ (enum hack)
- enumμ int λμ μ¬μ©ν μ μλ€.
class GamePlayer{ private: enum{numTurns = 5}; int scores[numTurns]; }
01. λμ λ°©μμ΄ #defineμ κ°κΉλ€.
- enumμ #defineμ²λΌ μ£Όμλ₯Ό μ»μ μ μλλ°, μ¬μ©μκ° μ μ μμμ μ£Όμλ₯Ό μ»κ±°λ μ°Έμ‘°μλ₯Ό μ°λ κ²μ λ§κ³ μΆμ λ μ μ©νλ€.
- enumμ #defineμ²λΌ λ©λͺ¨λ¦¬ ν λΉμ μ λ νμ§ μλλ€.
- μ λλ‘λ μ»΄νμΌλ¬λ μ μ νμ μ const κ°μ²΄μ λν΄ κ·Έ κ°μ²΄μ λν ν¬μΈν°λ μ°Έμ‘°μλ₯Ό λ§λ€μ§ μλ μ΄μ, λ©λͺ¨λ¦¬λ₯Ό ν λΉνμ§ μλλ€.
- μ»΄νμΌλ¬λ§λ€ λ€λ₯Ό μ μμΌλ―λ‘ μμ νκ² νκ³ μΆλ€λ©΄ enumμ μ°μ.
02. template metaprogrammingμ ν΅μ¬μ΄λ€.
ν¨μμ²λΌ μ°λ λ§€ν¬λ‘κ° νμνλ©΄, inline ν¨μ(μμμ ν΄λμ€ λ΄λΆμμλ§ μΈ μ μμ)μ λν templateμ μ¬μ©νμ.
issue
λ§€ν¬λ‘ ν¨μλ₯Ό μ£Όμνμ!
λ§€ν¬λ‘ ν¨μλ ν¨μμ²λΌ μκ²Όμ§λ§ ν¨μ νΈμΆ overheadλ₯Ό μΌμΌν€μ§ μκΈ° λλ¬Έμ μ¬μ©νλ€.
#define MAX(a,b) f((a)>(b)?(a):(b))
int a = 5, b = 0;
MAX(++a, b); //a==7
MAX(++a, b+10); //a==6
fκ° νΈμΆλκΈ° μ μ aκ° μ¦κ°νλ νμκ° λ¬λΌμ§λ€.
Solution
ν¨μμ²λΌ μ°λ λ§€ν¬λ‘κ° νμνλ©΄, inline ν¨μ(μμμ ν΄λμ€ λ΄λΆμμλ§ μΈ μ μμ)μ λν templateμ μ¬μ©νμ.
template<typename T>
inline void max(const T& a, const T& b){
f(a>b?a:b);
}
03. const
constλ₯Ό λΆμ¬ μ μΈνλ©΄ μ»΄νμΌλ¬κ° μλ¬λ₯Ό μ‘λλ° λμμ΄ λλ€.
- const
-
- μλ―Έμ μΈ μ μ½: const ν€μλκ° λΆμ κ°μ²΄λ μΈλΆ λ³κ²½μ΄ μλλ€.
- μλ―Έμ μΈ μ μ½μ μμ€ μ½λ μμ€μμ λΆμ΄κ³ , μ»΄νμΌλ¬κ° μ μ½μ μ§μΌμ€λ€.
- μ΄λ€ κ°μ΄ λΆλ³μ΄μ΄μΌ νλ€λ μ μμμ μλλ₯Ό μ»΄νμΌλ¬μ λ€λ₯Έ νλ‘κ·Έλλ¨Έμ λλ μ μλ μλ¨μ΄λ€.
constλ μ΄λ€ μ ν¨ λ²μμ μλ κ°μ²΄μλ λΆμ μ μκ³ , ν¨μ λ§€κ°λ³μ, λ°ννμ , λ©€λ²ν¨μ λ±μ λΆμ μ μλ€.
- μ€λ₯ΈνΈμ κΎΈλ©°μ€λ€κ³ μ¬κΈ°μ.
01. ν¬μΈν°
char str[] = "string";
char *p = a; //λΉμμ ν¬μΈν°, λΉμμ λ°μ΄ν°
const char *p = a; //λΉμμ ν¬μΈν°, μμ λ°μ΄ν°
char* const p = a; //μμ ν¬μΈν°, λΉμμ λ°μ΄ν°
const char* const p = a; //μμ ν¬μΈν°, μμ λ°μ΄ν°
void f1(const Widget *pw); //μμ Widget κ°μ²΄μ λν ν¬μΈν°
void f2(Widget const *pw); //μμ Widget κ°μ²΄μ λν ν¬μΈν° == const Widget *
02. STL λ°λ³΅μ(iterator)
STL λ°λ³΅μλ ν¬μΈν°λ₯Ό λ³Έλ¬ κ²μ΄μ΄μ κΈ°λ³Έμ μΌλ‘ T* μ λΉμ·νκ² λμνλ€. (T* const: μμ ν¬μΈν°, λΉμμ λ°μ΄ν°)
λ°λ³΅μλ μμ μ΄ κ°λ¦¬ν€λ λμμ΄ μλ κ²μ κ°λ¦¬ν€λ κ²½μ°κ° νμ©λμ§ μλλ€. (ν¬μΈν° λ³κ²½ X)
λμ λ°λ³΅μκ° κ°λ¦¬ν€λ λμ μ체λ₯Ό λ³κ²½ν μλ μλ€.
issue
λ³κ²½ λΆκ°λ₯ν κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ°λ³΅μκ° νμνλ€λ©΄?
Solution
const_iterator λ₯Ό μ¬μ©νλ€. (const T*: λΉμμ ν¬μΈν°, μμ λ°μ΄ν°)
std::vector<int> vec;
const std::vector<int>::iterator iter = vec.begin();
*iter = 10;
++iter; //error
const std::vector<int>::const_iterator cIter = vec.begin();
*cIter = 10; //error
++cIter;
03. ν¨μ μ μΈ
ν¨μλ₯Ό constλ‘ μ μΈνλ©΄ μ’μ μ μ μ¬μ©μ μ μ νμ
μ μ¬μ©ν λ μ€μνμ§ μμ μ μλ€λ μ μ΄λ€.
μ¬μ©μ μ μ νμ
μ μ¬μ©νλ©΄, κΈ°λ³Έ νμ
κ³Ό μΈλ°μμ΄ λΉνΈνμ±μ νμ§ μλλ‘ ν΄μ£Όλ νΉμ§μ΄ μλ€.
Widget a, b, c;
//μΈλ°μμ΄ λΉνΈνμ±μ νμ§ μλλ‘ ν΄μ£Όλ νΉμ§λλ¬Έμ νμ©λλ κ²μ΄ λ¬Έμ λ€.
if (a * b = c){ //λΉκ΅νλ €κ³ νμλλ°, λμ
ν΄λ²λ Έλ€.
...
}
04. λ§€κ°λ³μ
05. μμ λ©€λ² ν¨μ: ν΄λΉ λ©€λ² ν¨μκ° μμ κ°μ²΄μ λν΄ νΈμΆλ ν¨μμ΄λ€. (ex: auto func() const -> void)
- ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό μ΄ν΄νκΈ° μ½λ€.
- ν΄λμ€λ‘ λ§λ€μ΄μ§ κ°μ²΄λ₯Ό λ³κ²½ν μ μλ ν¨μμ λ³κ²½ν μ μλ ν¨μλ₯Ό μ¬μ©μκ° λ―Έλ¦¬ μ μ μλ€.
- μμ κ°μ²΄λ₯Ό μ¬μ©ν μ μκ² νλ€.
- μμ κ°μ²΄μ λν μ°Έμ‘°μλ‘ κ°μ²΄λ₯Ό μ λ¬νλ©΄ μ±λ₯μ μ 리νλ€.
- μμ λ§€κ°λ³μλ₯Ό μ‘°μν μ μλ const λ©€λ² ν¨μκ° νμνλ€.
λ
Όλ¦¬μ μΈ μμμ±μ μ¬μ©ν΄μ νλ‘κ·Έλλ°νλ€.
μμ λ©€λ²μ λΉμμ λ©€λ² ν¨μκ° κΈ°λ₯μ μΌλ‘ μλ‘ λκ°μ΄ ꡬνλμ΄ μλ€λ©΄, μ½λ μ€λ³΅μ νΌνλ κ²μ΄ μ’λ€.
μ΄ λ, λΉμμ λ²μ μ΄ μμ λ²μ μ νΈμΆνλλ‘ νμ.