ν¨μμ μ μ
- ν¨μμ μ΄λ¦μ ν¨μκ° μννλ κΈ°λ₯μ μ΅μ’ (μ 체) κ²°κ³Όλ₯Ό λ»νλλ‘ νλ€.
- λ³μ, ν¨μ, enum, ν΄λμ€ λ±μ μ¬μ©λκΈ° μ μ μ μΈνλ€.
- μ μλ μ€μ§ 1νλ§ κ°λ₯νλ€(One Definition Rule) <-> μ μΈμ μ¬λ¬ ν νμ©λλ€
inline ν¨μ
- inline ν¨μλ ν€λ νμΌμμ μ μΈνκ³ μ μν΄μΌ νλ©°, μ΄λ₯Ό μ¬λ¬ νμΌμμ μ¬μ©ν μ μλ€.
- inline ν¨μλ ν¨μ νΈμΆμ νμ§ μκ³ , ν¨μμ λ³Έλ¬Έμ νΈμΆ μμΉμ μ§μ μ½μ νλ λ°©λ²μ μ μνλ C++μ μ΅μ ν κΈ°λ²
- μ»΄νμΌλ¬μκ² ν¨μλ₯Ό μΈλΌμΈ μ²λ¦¬ν κ°λ₯μ±μ κ³ λ €ν΄λ¬λΌλ ννΈλ₯Ό μ£Όλ©°, ν¨μ νΈμΆμ μ΅μ ννλ €λ μλλ₯Ό μ λ¬
- μΌλ°μ μΌλ‘ ν¨μκ° νΈμΆλλ©΄, μ€νμ μ€ννλ μμ΄ μμ±λλλ° μ€ν νλ μμ μμ±νκ³ μ κ±°νλ κ³Όμ μλ μ€λ²ν€λκ° λ°μνλ€. μ΄λ νΉν μμ ν¨μκ° λ°λ³΅μ μΌλ‘ νΈμΆλ λ μ±λ₯μ λΆμ μ μΈ μν₯μ μ€ μ μλ€.
- inline ν¨μλ₯Ό μ¬μ©νλ©΄, μ»΄νμΌλ¬λ ν¨μλ₯Ό νΈμΆνλ λμ ν΄λΉ ν¨μμ μ½λλ₯Ό μ§μ νΈμΆ μμΉμ μ½μ νκΈ° λλ¬Έμ ν¨μ νΈμΆμ μν μ€ν νλ μ μμ±μ΄ λΆνμν΄μ§λ―λ‘, μ€νμ μ¬μ©νλ μ€λ²ν€λκ° μ κ±°λ μ μλ€.
- non-static μΈλΌμΈ ν¨μκ° μλ‘ λ€λ₯Έ νμΌμ μ¬λ¬ λ² μ μΈλ λ, λͺ¨λ inline μ μΈν΄μΌ νκ³ , λͺ¨λ μ μλ λμΌν΄μΌ νκ³ , λμΌν μ£Όμλ₯Ό κ°μ§λ€
- inline ν¨μκ° μ¬λ¬ μμ€ νμΌμμ μ μλλλΌλ λͺ¨λ μ μκ° λμΌνλ€κ³ νμΈνλ©΄, μ€λ₯λ₯Ό λ°μμν€μ§ μμ
- λͺ¨λ μ μκ° λμΌνκΈ° λλ¬Έμ κ° μμ€ νμΌμμμ ν¨μ μ μλ λμΌν λ©λͺ¨λ¦¬ μμΉλ₯Ό κ°λ¦¬ν΄
<맀ν¬λ‘μ μΈλΌμΈ ν¨μ>
μ¬κ·μ ν¨μ
- μ¬κ·μ ν¨μλ μκΈ° μμ μ νΈμΆνλ ν¨μ. factorialμ μ¬κ·μ ν¨μμ μ’μ μμ΄λ€.
- stack overflowμ μνμ΄ μμΌλ―λ‘ λ°λ³΅λ¬Έμ΄ μ’μ μ μμ ( μλͺ»λ μ¬κ· νΈμΆλ‘ μΈν΄ 무ν 루νμ λΉ μ§ μ μκΈ° λλ¬Έμ )
long factorial(const int number){
if (number == 1) return 1;
return number * factorial(number-1);
}
Lambda ν¨μ
λλ€ ν¨μλ μ΄λ¦μ΄ μλ ν¨μ κ°μ²΄λ₯Ό μλ―Ένλ€. μ΄λ¦ μμ΄ κ°λ¨νκ² μ μν μ μλ ν¨μλΌκ³ ν μ μλ€.
ν¨μμ λΉμ·νκ² λμνμ§λ§ μ΅λͺ ν¨μ(anonymous function)λ‘ μ¬μ©ν μ μλ€.
Lambda ν¨μμ νμμ±
(1)
리μ€νΈλ λ°°μ΄μ μ λ ¬ν λ, μ λ ¬ κΈ°μ€μ ν¨μλ‘ λ§λ€μ΄μ μ¬μ©νλ€λ©΄ 보ν΅μ μ λ ¬ ν¨μμ κΈ°μ€μ μ ν΄μ£Όλ ν¨μλ₯Ό λ°λ‘ μ μν΄μΌ νμ§λ§, λλ€ ν¨μλ₯Ό μ¬μ©νλ©΄ μ λ ¬ν λ κ°λ¨νκ² κ·Έ μ리μμ κΈ°μ€μ μ μν μ μλ€. μ¦, μ½λκ° κ°κ²°ν΄μ§κ³ , νΉμ μμ μ μν΄ λΆνμν ν¨μ μ μλ₯Ό μ€μΌ μ μλ€. μ¦, λλ€ ν¨μλ μ½λ λ΄μμ μΌμμ μΌλ‘ κ°λ¨ν ν¨μλ₯Ό μμ±ν λ μ μ©νκ² μ¬μ©λλ€.
(2)
λν νμ¬ μ€μ½νμ μλ λ³μλ€μ μΊ‘μ²(capture)νμ¬ μ¬μ©ν μ μλ€λ μ μμ μΌλ°μ μΈ ν¨μμ λ€λ₯΄λ€.
κΈ°μ‘΄μ ν¨μ ν¬μΈν° λμ μ¬μ©νκ±°λ, νΉμ λ²μ λ΄μ λ³μλ₯Ό μΊ‘μ²νμ¬ μ¬μ©νλ κ²½μ°μ κ°λ ₯ν κΈ°λ₯μ μ 곡νλ€.
μΊ‘μ²λ₯Ό μ¬μ©νλ μ΄μ λ λλ€ ν¨μκ° μ μλ μΈλΆ λ²μμ μλ λ³μλ€μ λλ€ ν¨μ λ΄λΆμμ μ¬μ©ν μ μλλ‘ νκΈ° μν΄μμ΄λ€. μ½κ² λ§ν΄, λλ€ ν¨μλ λ³΄ν΅ μ½λ λ΄λΆμμ μ μλλλ°, κ·Έ λλ€ ν¨μκ° μΈλΆμ μλ λ³μλ₯Ό νμλ‘ ν λ κ·Έ λ³μλ₯Ό μΊ‘μ²νμ¬ μ¬μ©νλ€.
<λ΄λ¦Όμ°¨μ μ λ ¬ λλ€ν¨μ μ¬μ© μμ >
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 3};
// λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b;
});
for (int n : numbers) {
std::cout << n << " ";
}
// μΆλ ₯: 8 5 3 2 1
return 0;
}
- μΊ‘μ²(Captures) [ ]:
- λλ€ ν¨μκ° μ μλ μ€μ½νμμ μ¬μ© μ€μΈ λ³μλ€μ μΊ‘μ²νμ¬ μ¬μ©ν μ μκ² ν΄μ€λ€.
- μλ₯Ό λ€μ΄ [&]λ μ°Έμ‘°λ‘ μΊ‘μ²νκ³ , [=]λ κ°μΌλ‘ μΊ‘μ²νλ€.
- 맀κ°λ³μ(Parameters) ( ):
- ν¨μμ λμΌνκ² λλ€ ν¨μκ° νΈμΆλ λ μ λ¬λλ μΈμλ€μ μ μνλ€
- μμ: (int a, int b)λ λ κ°μ μ μν 맀κ°λ³μλ₯Ό λ°λ λλ€ ν¨μλ₯Ό λνλΈλ€
- λ°ν νμ
(Trailing-Return-Type) -> return type:
- λλ€ ν¨μμ λ°ν νμ μ μ§μ ν©λλ€.
- μ΄ λΆλΆμ μλ΅ν μ μμΌλ©°, μ»΄νμΌλ¬κ° μλμΌλ‘ λ°ν νμ μ μ μΆν μλ μλ€.
- ν¨μ ꡬν(Definition) { }:
- ν¨μμ 본체λ‘, μ€μ λ‘ μ€νλλ μ½λκ° λ€μ΄κ°λ€.
- μμ: { return a > b; }λ aκ° bλ³΄λ€ ν΄ λ μ°Έμ λ°ννλ λλ€ ν¨μλ₯Ό λνλΈλ€.
κΈ°λ³Έ 맀κ°λ³μ κ° κ·μΉ
μ μΈκ³Ό μ μμ μ°¨μ΄
- μ μΈ: μλ³μμ μ΄λ¦κ³Ό νμ
λ§ μλ €μ€λ€ λ©λͺ¨λ¦¬ ν λΉμ μ΄λ£¨μ΄μ§μ§ μλλ€.
- μ: extern int x; (μ¬κΈ°μ xκ° μ΄λ€ κ³³μ μ μλμ΄ μμμ μλ €μ€λλ€.)
- μ μ: μ€μ λ‘ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ κ°μ μ΄κΈ°νν¨
- μ: int x = 10; (xμ λ©λͺ¨λ¦¬κ° ν λΉλκ³ κ°μ΄ μ΄κΈ°νλ©λλ€.)
ν¨μμ λ°ν κ°
- ν¨μλ μ½μλ κΈ°λ₯μ μννκ³ κ·Έ μνκ²°κ³Όλ₯Ό νΈμΆν¨μμκ² λ°ννλ κ²μ΄ μΌλ°μ
- λ°ν κ°μ μ λ¬ : returnμΌλ‘ κ²°κ³Όκ°μ λ°ν
- νΌνΈμΆ ν¨μμμλ returnλ¬Έμ μ΄μ©ν΄μ νΈμΆ ν¨μ( ex mainν¨μ)μκ² μμ μ μν κ²°κ³Όλ₯Ό λ°ννλ€
- λ°νν κ°μ΄ μ μμ μΈ κ³μ°/μ²λ¦¬ κ²°κ³Όκ° μλλΌ λΉμ μμ μΈ μ²λ¦¬ μ¦ μ€λ₯λ₯Ό λ»νλ κ²½μ°μλ νΈμΆν¨μμμ μ΄λ₯Ό μ²λ¦¬ν¨
ex) return -1 // μ€λ₯ μν©μ΄ λ°μνμ κ²½μ°
λ°νκ°μ΄ μλ **νΈμΆν¨μ** : returnλ¬Έμ μ°μ§ μμλ λλ€
(1) λ°ννμ μ΄ void μΈ ν¨μ
(2) main ν¨μ : μ΄ νΈμΆμ λ°νκ°μ΄ μκΈ° λλ¬Έμ, ν¨μκ° μ€νλ ν λ€μ μ½λλ‘ λμ΄κ°λ€
ν¨μ μ€λ²λ‘λ©
- cμμλ νμ©λμ§ μμμ§λ§ C++μμλ νμ©λλ€
ν¨μ ν¬μΈν°(Function Pointer)
- ν¨μ ν¬μΈν°λ ν¨μμ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ μ₯ν μ μλ ν¬μΈν°.
- pFuncλ μΌλ°μ μΌλ‘ ν¨μ ν¬μΈν°λ₯Ό μ μ₯νλ λ³μμ μ΄λ¦μΌλ‘ μ¬μ©λλ€ μ΄ μ΄λ¦μμ pλ ν¬μΈν°λ₯Ό μλ―Ένκ³ , Funcλ ν¨μμ μ½μ΄λ‘ ν΄μλλ€. μ¦, pFuncλ ν¨μμ μ£Όμλ₯Ό μ μ₯ν μ μλ ν¬μΈν°λ₯Ό κ°λ¦¬ν¨λ€.
- ν¨μ ν¬μΈν°λ₯Ό μ¬μ©νλ©΄ ν¨μμ μ£Όμλ₯Ό λ³μμ μ μ₯νκ³ , λμ€μ μ΄ λ³μλ₯Ό ν΅ν΄ ν¨μλ₯Ό νΈμΆν μ μλ€.
#include <iostream>
// ν¨μ μ μ
void printMessage() {
std::cout << "Hello, World!" << std::endl;
}
// ν¨μ ν¬μΈν°λ₯Ό μΈμλ‘ λ°λ ν¨μ
void executeFunction(void (*pFunc)()) {
pFunc(); // ν¨μ ν¬μΈν°λ₯Ό ν΅ν΄ ν¨μ νΈμΆ
}
int main() {
// ν¨μ ν¬μΈν°λ₯Ό λ³μμ μ μ₯
void (*pFunc)() = printMessage;
// ν¨μ ν¬μΈν°λ₯Ό μΈμλ‘ μ λ¬
executeFunction(pFunc);
return 0;
}
μΈμμ μ ν
- constκ° λΆκ³ λλ©΄ κ°μ λ³κ²½ν μ μμΌλ―λ‘ μμ μ΄ λΆκ°λ₯ν΄μ§λ€.
ꡬ쑰체μ μ λ¬
μΈμ μ λ¬ λ°©μ
Call by Value (κ°=μΌλ°λ³μμ μν νΈμΆ)
- ν¨μμ μΈμμ κ°μ 볡μ¬ν΄μ μ λ¬
- ν¨μ λ΄λΆμμλ μ΄ λ³΅μ¬λ κ°μΌλ‘ μμ μ μννλ©°, μλμ κ°μ λ³κ²½λμ§ μλλ€
- ν¨μ λ΄λΆμμ μΈμλ₯Ό λ³κ²½ν΄λ, μλμ κ°μ μν₯μ λ―ΈμΉμ§ μλλ€.
- μλ κ°μ λ³κ²½νμ§ μμμΌ ν λ μ¬μ©
- ex) ν¨μκ° λ¨μν λ°μ΄ν°λ₯Ό μ²λ¦¬νκ³ κ²°κ³Όλ§ λ°ννλ κ²½μ°.
** κΈ°λ³Έμ μΌλ‘ νΌνΈμΆν¨μμμ μμ±ν λ°ν κ°μ νΈμΆν¨μλ‘ λ³΅μ¬λλ€.(κ°μ μν μ λ¬μ΄ λ°μνλ€) **
κ·Έλ¬λ κ°μ μν μ λ¬μΌλ‘ 볡μ¬λλ λ°©μμ λ°ν νμ μ΄ κ΅¬μ‘°μ²΄/ν΄λμ€μ κ°μ΄ λ§μ λ©λͺ¨λ¦¬ μ¬μ©ν λ λΉμ©μ΄ 컀
=> μ±λ₯ λ¬Έμ λ₯Ό νΌνκΈ° μν΄ μ°Έμ‘°λ₯Ό λ°ννλ λ°©λ²μ΄ μ¬μ©λ μ μλ€ -> λ©λͺ¨λ¦¬ μ¬μ©μ μ΅μννκ³ μ±λ₯μ κ°μ ν μ μλ€.
Call by Reference (μ°Έμ‘°μ μν νΈμΆ)
- μΈμμ κ°μ 볡μ¬x
- ν¨μμ μΈμμ μ°Έμ‘°(μ£Όμ)λ₯Ό μ λ¬
- ν¨μ λ΄λΆμμλ μ΄ μ°Έμ‘°λ₯Ό ν΅ν΄ μλμ κ°μ μ§μ λ³κ²½ν μ μλ€.
- ν¨μ λ΄λΆμμ μΈμλ₯Ό λ³κ²½νλ©΄, μλμ κ°λ λ³κ²½λλ€.
- μλ κ°μ ν¨μ λ΄λΆμμ λ³κ²½ν΄μΌ ν λ μ¬μ©
- ex) ν¨μκ° μ λ ₯κ°μ μμ νκ±°λ, μ¬λ¬ κ°μ λ°νν΄μΌ νλ κ²½μ°.
=> μ°Έμ‘° λ°ν μ μ£Όμν μ : μ°Έμ‘°λ‘ λ°ννλ κ²½μ°, ν¨μ λ΄λΆμμ μμ±λ μ§μ λ³μμ μ°Έμ‘°λ₯Ό λ°ννλ©΄ μ λλ€.
ν¨μκ° μ’ λ£λλ©΄ μ§μ λ³μμ λ©λͺ¨λ¦¬κ° ν΄μ λκΈ° λλ¬Έμ, μ΄λ₯Ό μ°Έμ‘°νλ κ²μ μλͺ»λ λ©λͺ¨λ¦¬ μ κ·Όμ μ΄λν μ μλ€.
(μλͺ»λ μμ, λΆμμ ν μ°Έμ‘°) : μ§μλ³μμ μ°Έμ‘°λ₯Ό λ°ννλ©΄ μλλ€.
int& badFunction() {
int x = 10;
return x; // μλͺ»λ μ½λ: xλ ν¨μκ° λλλ©΄ μ¬λΌμ§
(μμ ν μ°Έμ‘° λ° ν¬μΈν° λ°ν)
- global (μ μ) λ³μμ λν μ°Έμ‘°/ν¬μΈν° λ°ν
- static(μ μ λ³μ μ¬μ©ν) μ§μ λ³μμ λν μ°Έμ‘°/ν¬μΈν° λ°ν : μ μ λ³μλ νλ‘κ·Έλ¨μ΄ μ’ λ£λ λκΉμ§ μλͺ μ΄ μ μ§λλ―λ‘ μμ
- ν λΉλ λμ λ©λͺ¨λ¦¬(new ν€μλ)μ λν ν¬μΈν° λ°ν : λμ λ©λͺ¨λ¦¬ ν λΉ μ¬μ©
- μ°Έμ‘° 맀κ°λ³μμ λν μ°Έμ‘°/ν¬μΈν° λ°ν
Call by Reference Pointer (ν¬μΈν°μ μν νΈμΆ) vs μ°Έμ‘°μ μν νΈμΆ
const μμ 맀κ°λ³μ
- 맀κ°λ³μλ₯Ό constλ‘ μ μΈν¨μΌλ‘μ¨ ν΄λΉ 맀κ°λ³μμ κ°μ΄ νΌνΈμΆν¨μμμ λ³κ²½λλ κ²μ λΆνν¨
- κΈ°λ³Έμ μΌλ‘ ν¬μΈν°μ μ°Έμ‘°λ constλ‘ μ λ¬ (C++ Core Guidelines)
κ°μ μν νΈμΆ ν¬μΈν°μ μν νΈμΆ μ°Έμ‘°μ μν νΈμΆ