[Effective C++] Chapter 1 #1
πref.
μ€μ½§ λ§μ΄μ΄μ€, Effective C++ [3ν], κ³½μ©μ¬(μ), νλ‘ν λ―Έλμ΄, 2015
2. #define
νλͺ© 2:
#define
μ μ°λ €κ±°λconst, enum, inline
μ λ μ¬λ¦¬μ
define μ½λ μμ
1
#define ASPECT_RATIO 1.653
μμ€ μ½λκ° μ»΄νμΌλ¬λ‘ λμ΄κ°κΈ° μ μ μ ν μ²λ¦¬μκ° ν΄λΉ μ½λλ₯Ό μ«μ μμλ‘ λ³νμν¨λ€. κ²°κ³Όμ μΌλ‘, ASPECT_RATIO
λΌλ μ΄λ¦μ μ»΄ν‘리λ¬κ° μ°λ κΈ°νΈ ν
μ΄λΈμ λ€μ΄κ°μ§ μλλ€!
μ«μ μμλ‘ λ체λ μ½λμμ μ»΄νμΌ μλ¬κ° λ°μνλ©΄ κ³€λν μν©μ΄ λ°μνλ€,
- μμ€ μ½λμ
ASPECT_RATIO
κ° μμλλ° μλ¬ λ©μμ§μ1.653
κ° μΆλ ₯λ¨- λ§μ½, ν΄λΉ
define
μ΄ μ μλ μ½λκ° μ§μ μμ±ν κ²μ΄ μλλΌλ©΄ μ΄λ μ½λμΈμ§ μ°Ύλ λ° μκ°μ λλΉνκ² λ¨ - κΈ°νΈμ λλ²κ±°μλ κ°μ λ¬Έμ κ° λ°μν μ μμ(κΈ°νΈ ν μ΄λΈμ λ€μ΄κ°μ§ μκΈ° λλ¬Έ)
- λ§μ½, ν΄λΉ
μ μμ μ½λμ ν΄κ²°μ
1
2
const double AspectRatio = 1.653
// λλ¬Έμλ‘λ§ νκΈ°νλ μ΄λ¦μ λκ° λ§€ν¬λ‘μ μ°λ κ²μ΄λ―λ‘, μ΄λ¦ νκΈ°λ λ°κΏμ£Όμ΄μΌ νλ€!
- μΈμ΄ μ°¨μμμ μ§μνλ μμ νμ
μ λ°μ΄ν°μ΄λ―λ‘ μ»΄νμΌλ¬λ μΈμ κ°λ₯
- μ»΄νμΌλ¬ κΈ°νΈ ν μ΄λΈμ μ μ₯
- μμκ° λΆλμμμ μ€μ νμ
μΌ κ²½μ°, μ»΄νμΌμ κ±°μΉ μ΅μ’
μ½λμ ν¬κΈ°κ°
#define
λ³΄λ€ μκ² λμ¬ μ μμ#define
μ κ²½μ°1.653
μ μ¬λ³Έμ΄ λ±μ₯ νμλ§λ€ λ§λ€μ΄μ§μ§λ§, μμ νμ μΌ κ²½μ° λ± ν κ°λ§ μμ±
1. #define
=> μμ κ΅μ²΄ μ μ£Όμμ¬ν
1.1. μμ ν¬μΈν° μ μ
μμ ν¬μΈν°(
constant pointer
) μ μλκ° ν€λ νμΌμμ μμλ₯Ό μ μνλ―λ‘, ν¬μΈν°λ₯Ό λ°λμ
const
λ‘ μ μΈν¬μΈν°κ° κ°λ¦¬ν€λ λμλ ν¨κ»
const
λ‘ μ μΈνλ κ²μ΄ μΌλ°μ μeg) μ΄λ€ ν€λ νμΌ μμ
char*
κΈ°λ°μ λ¬Έμμ΄ μμλ₯Ό μ μν κ²½μ°,const
λ₯Ό λ λ² κΈ°μ¬const char * const authorName = "Scott Meyers";
const std::string authorName("Scott Meyers");
=>string
κ°μ²΄ μ¬μ©μ κΆμ₯!
2. ν΄λμ€ λ©€λ²λ‘ μμ μ μ
μ΄λ€ μμμ μ ν¨λ²μλ₯Ό ν΄λμ€λ‘ νμ ν κ²½μ°, μ¬λ³Έ κ°μκ° ν κ°λ₯Ό λμ§ λͺ»νκ² νκ³ μΆλ€λ©΄ μ μ λ©€λ²λ‘ μ μΈνμ.
1
2
3
4
5
6
class GamePlayer{
private:
static const int NumTurns = 5; // μμ μ μΈ
int scores[NumTurns]; // μμλ₯Ό μ¬μ©νλ λΆλΆ
...
};
μ½λ μμ± μ μ μΈ ν μ μλΆλ₯Ό μμ±νλ κ²μ΄ μΌλ°μ μ
μ μ λ©€λ²λ‘ λ§λ€μ΄μ§λ μ μλ₯ νμ μ ν΄λμ€ μμλ μ μ λ§λ ¨νμ§ μμ
ν΄λμ€ μμμ μ£Όμλ₯Ό ꡬν κ²½μ°μλ§ μ μλΆ κ΅¬ν
const int GamePlayer::NumTurns;
- λ³λμ μ μλ₯Ό κΈ°μ¬ν κ²½μ°, κ°μ μ 곡νμ§ μμ
- μ΄λ, ν΄λμ€ μμμ μ μλ ꡬν νμΌμ κΈ°μ¬
- ν΄λμ€ μμμ μ΄κΈ°κ°μ ν΄λΉ μμκ° μ μΈλ μμ μ λ°λ‘ μ΄κΈ°ν
- λ³λμ μ μλ₯Ό κΈ°μ¬ν κ²½μ°, κ°μ μ 곡νμ§ μμ
μμ λ체 μ μ£Όμμ¬ν
ν΄λμ€ μμλ
#define
μΌλ‘ λ§λ€μ§ λ§μ#define
μ ν΄λμ€ μμλ₯Ό μ μνλλ° μ¬μ©ν μ xμ΄λ€ ννμ μΊ‘μν ννλ λ°μ μ μμ
eg)
private
ννμ#define
ꡬ문μ μ‘΄μ¬νμ§ μμ
1.2. ν΄λμ€ λ©€λ² μ΄κΈ°νκ° μ΄λ €μ΄ κ²½μ°
μ»΄νμΌλ¬κ° μ μ ν΄λμ€ λ©€λ²κ° μ μΈλ μμ μ μ΄κΈ°κ°μ μ£Όλ κ²μ΄ λ§μ§ μλλ€κ³ νλ¨ν κ²½μ°, μ΄κΈ°κ°μ μμ μ μ μμ μ κΈ°μ¬νμ.
1
2
3
4
5
6
7
8
class CostEstimate {
private:
static const double FudgeFactor;
...
};
// μ μ ν΄λμ€ μμμ μ μ => ꡬν νμΌμ μ μ!
const double CostEstimate::FudgeFactor = 1.35;
μ΄λ, ν΄λΉ ν΄λμ€λ₯Ό μ»΄νμΌνλ λμ€ ν΄λμ€ μμμ κ°μ΄ νμν κ²½μ°κ° μκΉ
GamePlayer::scores
κ³Ό κ°μ΄ λ°°μ΄ λ©€λ² μ μΈ=> βλμ΄μ λκ°μ (
enmu hack
)β κΈ°λ²μ μ¬μ©ν΄ ν΄κ²° κ°λ₯
1
2
3
4
5
6
7
8
class GamePlayer {
private:
// "λμ΄μ λκ°μ ": NumTurnsλ₯Ό 5μ λν κΈ°νΈμ μ΄λ¦μΌλ‘ λ§λ λ€.
enum { NumTurns = 5 };
int scores[NumTurns];
...
};
λμ΄μ λκ°μ
λμ λ°©μμ΄
const
보λ€#define
μ κ°κΉμconst
μ μ£Όμλ₯Ό μ‘μλ΄λ κ²μ ν©λΉνλ,enum
μ μ£Όμλ₯Ό ν¨λΆλ‘ μ‘μ μ x(=>
#define
κ³Ό μ μ¬ν¨!!)κ°λ°μκ° μ μΈν μ μ μμμ μ£Όμλ₯Ό λ€λ₯Έ μ¬λμ΄ μ»λ κ² μ«μ κ²½μ°
const
κ°μ²΄μ λν λ©λͺ¨λ¦¬λ₯Ό λ§λ€κ³ μΆμ§ μμ κ²½μ°(=>
enum
μ κ²½μ° μ΄λ€ ννμ μΈλ°μλ λ©λͺ¨λ¦¬ ν λΉμ νμ§ μμ)
ν νλ¦Ώ λ©ννλ‘κ·Έλλ°μ ν΅μ¬ κΈ°μ μ΄ λ¨
2.1. μ€μ© μ¬λ‘
맀ν¬λ‘ ν¨μ
1
2
// aμ b μ€ ν° κ²μ fλ‘ λκΉ
#define CALL_WHTH_MAX(a, b) f((a) > (b) ? (a) : (b))
- ν¨μμ²λΌ 보μ΄μ§λ§ ν¨μ νΈμΆ μ€λ²ν€λλ₯Ό μΌμΌν€μ§ μλ 맀ν¬λ‘ ꡬν
- μ΄λ° μμ 맀ν¬λ‘λ λ¨μ μ΄ λ§μ. κΆμ₯νμ§ μλλ€.
- 맀ν¬λ‘ λ³Έλ¬Έμ λ€μ΄ μλ μΈμλ§λ€ λ°λμ κ΄νΈλ₯Ό μμ μ£Όμ.
- κ΄νΈκ° μμΌλ©΄ ννμμ 맀ν¬λ‘μ λκΈΈ λ μ€λ₯κ° λ°μν μ μμ
1
2
3
4
int a = 5, b = 0;
CALL_WHTH_MAX(++a, b); // a λ λ² μ¦κ°
CALL_WHTH_MAX(++a, b+10); // a ν λ² μ¦κ°
f
κ° νΈμΆλκΈ° μ μa
κ° μ¦κ°νλ νμκ° λ¬λΌμ§- λΉκ΅λ₯Ό ν΅ν΄ μ²λ¦¬ν κ²°κ³Όκ° μ΄λ€ κ²μ΄λμ λ°λΌ λ¬λΌμ§λ€(νλ‘κ·Έλ¨μ μ¬ λ°μ)
λ¨μ κ°μ ν μ½λ
1
2
3
4
5
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}
ν νλ¦Ώμ΄κΈ° λλ¬Έμ λμΌ κ³μ΄ ν¨μκ΅°(family of functions)μ μμ±
λμΌν νμ μ κ°μ²΄ λ κ°λ₯Ό μΈμλ‘ λ°κ³ λ μ€ ν° κ²μΌλ‘
f
λ‘ λ겨 νΈμΆν¨μ λ³Έλ¬Έμ κ΄νΈλ₯Ό μΈ νμ x
μΈμλ₯Ό μ¬λ¬ λ² νκ°νμ§ μμ
callWithMax
λ μ€μ λ‘ κ΅¬νλ ν¨μμ΄λ―λ‘ μ ν¨λ²μ λ° μ κ·Όκ·μΉμ κ·Έλλ‘ λ°λΌκ°cf) μμμ ν΄λμ€μμλ§ μ¬μ©ν μ μλ μΈλΌμΈ ν¨μμ λν΄μλ λ¬Έμ κ° λ°μνμ§ μμ
β 맀ν¬λ‘λ μ΄λ° μ΄μΌκΈ°μ λν΄ κ΄λ ¨ x
*πͺConclusion)* **
1. λ¨μν μμλ₯Ό μΈ λλ, #define
λ³΄λ€ const
νΉμ enum
μ μ°μ μκ°νμ.
2. ν¨μμ²λΌ 보μ΄λ 맀ν¬λ‘λ₯Ό λ§λ€λ €λ©΄ #define
λ³΄λ€ μΈλΌμΈ ν¨μλ₯Ό μ°μ μκ°νμ.