[c++] constexprμ λͺ¨λ κ²
constexprλ C++11μμ λμ λ ν€μλλ‘, μ»΄νμΌ νμμ κ³μ°μ΄ κ°λ₯ν μμ ννμμ μ μν μ μκ² ν΄μ€λλ€. μ΄ ν€μλλ μ£Όλ‘ ν¨μλ λ³μλ₯Ό μ»΄νμΌ νμμ νκ°νμ¬ νλ‘κ·Έλ¨μ ν¨μ¨μ±μ λμ΄λ λ° μ¬μ©λ©λλ€. C++17 μ΄νλ‘λ μ¬μ© λ²μκ° λμ± νμ₯λμ΄ ν¨μμ λ³μλΏλ§ μλλΌ λ³΅μ‘ν μ°μ°κ³Ό 쑰건문μ ν¬ν¨ν λ€μν ννμλ μ»΄νμΌ νμμ κ³μ°ν μ μκ² λμμ΅λλ€.
constexprμ νΉμ§ λ° μ¬μ© λ°©λ²
1. constexpr λ³μ
constexpr λ³μλ₯Ό μ¬μ©νλ©΄ κ·Έ κ°μ΄ μ»΄νμΌ νμμ κ²°μ λλλ‘ λ³΄μ₯λ©λλ€.
constexpr int myValue = 10; // μ»΄νμΌ νμμ myValueλ 10μΌλ‘ κ³ μ λ¨
2. constexpr ν¨μ
constexpr ν¨μλ₯Ό μ¬μ©νλ©΄ ν΄λΉ ν¨μκ° μ»΄νμΌ νμμ νΈμΆλμ΄ κ·Έ κ²°κ³Όκ° μμλ‘ μ¬μ©λ μ μμ΅λλ€. ν¨μλ λ°λμ λ¨μνκ³ , 볡μ‘ν λ°νμ μ°μ°μ΄ μμ΄μΌ ν©λλ€.
constexpr int square(int x) {
return x * x;
}
μ΄ ν¨μλ μ»΄νμΌ νμμ κ³μ°ν μ μλ λͺ¨λ ννμμ λν΄ μ¬μ©ν μ μμ΅λλ€.
constexpr int squaredValue = square(5); // μ»΄νμΌ νμμ 25λ‘ κ³μ°λ¨
3. constexprκ³Ό constμ μ°¨μ΄μ
- constλ λ°νμ μμμμ μλ―Έν©λλ€. μ¦, μ»΄νμΌ νμμ λ°λμ μ΄κΈ°νλμ§λ μμ΅λλ€.
- constexprλ μ»΄νμΌ νμμ λ°λμ κ³μ°λμ΄μΌ νλ μμ ννμμ μλ―Έν©λλ€.
const int runtimeValue = 10; // λ°νμ μμ
constexpr int compileTimeValue = 20; // μ»΄νμΌ νμ μμ
constexpr ν¨μμ μμ
κΈ°λ³Έμ μΈ constexpr ν¨μ
#include <iostream>
constexpr int factorial(int n) {
return (n <= 1) ? 1 : (n * factorial(n - 1));
}
int main() {
constexpr int result = factorial(5); // μ»΄νμΌ νμμ κ³μ°λ¨
std::cout << "Factorial of 5: " << result << std::endl; // μΆλ ₯: Factorial of 5: 120
return 0;
}
μ΄ μμ μμλ factorial ν¨μκ° μ»΄νμΌ νμμ κ³μ°λμ΄, resultκ° νλ‘κ·Έλ¨μ΄ μ€νλκΈ° μ μ μ΄λ―Έ 120μΌλ‘ νμ λ©λλ€.
쑰건문μ ν¬ν¨ν constexpr ν¨μ
C++14λΆν°λ if, switchμ κ°μ 쑰건문λ constexpr ν¨μ λ΄μμ μ¬μ©ν μ μκ² λμμ΅λλ€.
#include <iostream>
constexpr int max(int a, int b) {
return (a > b) ? a : b;
}
int main() {
constexpr int maxValue = max(10, 20); // μ»΄νμΌ νμμ 20μΌλ‘ κ³μ°λ¨
std::cout << "Max value: " << maxValue << std::endl; // μΆλ ₯: Max value: 20
return 0;
}
constexprμ C++ νμ€μ λ°μ
- C++11: constexprμ λμ μΌλ‘ μ»΄νμΌ νμ μμ ννμκ³Ό ν¨μλ₯Ό μ μν μ μκ² λμμ΅λλ€. ν¨μ λ΄μμ λ¨μΌ return λ¬Έλ§ μ¬μ© κ°λ₯νμ΅λλ€.
- C++14: constexpr ν¨μ λ΄μμ 쑰건문 (if, switch), λ°λ³΅λ¬Έ (for, while) λ±μ μ¬μ©ν μ μκ² λμ΄ λ 볡μ‘ν κ³μ°μ΄ κ°λ₯ν΄μ‘μ΅λλ€.
- C++17: constexprμ μ μ© λ²μκ° λμ± νμ₯λμ΄, constexpr μμ±μμ λ©€λ² ν¨μ, 볡μ‘ν μ¬μ©μ μ μ νμ μ λν΄μλ μ¬μ© κ°λ₯ν΄μ‘μ΅λλ€.
- C++20: constexprμμλ λ λ§μ κΈ°λ₯λ€μ΄ ν¬ν¨λλ©°, μ»΄νμΌ νμ κ³μ°μ λ²μκ° κ±°μ 무νλλ‘ νμ₯λμμ΅λλ€.
constexpr ν¨μμ inline ν¨μμ μ°¨μ΄μ
- constexpr ν¨μ:
- μ»΄νμΌ νμμ κ³μ°λ μ μλ ν¨μμ λλ€. constexpr ν¨μλ νμ μ»΄νμΌ νμμ κ³μ°λλλ‘ μꡬλλ©°, μ΄λ‘ μΈν΄ μμ ννμμ μΌλΆλ‘ μ¬μ©ν μ μμ΅λλ€.
- C++11λΆν° λμ λμμΌλ©°, μ»΄νμΌλ¬κ° κ²°κ³Όλ₯Ό μ»΄νμΌ νμμ νκ°ν μ μλλ‘ λ³΄μ₯ν©λλ€.
- μ»΄νμΌ νμμ νκ°λ μ μλ κ²½μ°, μ€μ λ‘ μ»΄νμΌ νμμ κ³μ°λμ§λ§, λ°νμμμλ νΈμΆλ μ μμ΅λλ€.
- inline ν¨μ:
- μ½λ μ€λ³΅μ μ€μ΄κΈ° μν΄ ν¨μ νΈμΆμ ν¨μ μ½λ μμ²΄λ‘ λ체νλλ‘ νλ ννΈλ₯Ό μ»΄νμΌλ¬μ μ 곡νλ μν μ ν©λλ€.
- inline ν€μλλ μ»΄νμΌλ¬μκ² ν¨μλ₯Ό μΈλΌμΈμΌλ‘ λ체ν΄λ¬λΌλ μμ²μ΄μ§λ§, μ€μ λ‘ μΈλΌμΈμΌλ‘ λ체ν μ§ μ¬λΆλ μ»΄νμΌλ¬μ μ¬λμ λ¬λ € μμ΅λλ€.
- inline ν¨μλ λ°νμμ μ¬μ©λ©λλ€. λ°λΌμ μ»΄νμΌ νμμ κ³μ°λμ§λ μμΌλ©°, νΈμΆλ λλ§λ€ μ€νλ©λλ€.
μμ:
- constexpr ν¨μ:
constexpr int add(int x, int y) {
return x + y;
}
int main() {
constexpr int sum = add(3, 4); // μ»΄νμΌ νμμ 7λ‘ κ³μ°λ¨
return 0;
}
- inline ν¨μ
inline int multiply(int x, int y) {
return x * y;
}
int main() {
int result = multiply(3, 4); // λ°νμμ νΈμΆλ¨
return 0;
}
볡μ‘ν ν΄λμ€λ ꡬ쑰체μμ constexpr νμ©
constexprμ μ¬μ©νλ μ΄μ :
constexprμ 볡μ‘ν ν΄λμ€λ ꡬ쑰체μμλ μ»΄νμΌ νμμ κ°μ²΄λ₯Ό μ΄κΈ°ννκ±°λ μμλ₯Ό κ³μ°νλ λ° μ¬μ©ν μ μμ΅λλ€. μ΄λ μ½λμ ν¨μ¨μ±μ λμ΄κ³ , νΉμ κ°λ€μ΄ μ»΄νμΌ νμμ κ³ μ λλλ‘ λ³΄μ₯νμ¬ μ€λ₯ κ°λ₯μ±μ μ€μ΄λ λ° μ μ©ν©λλ€.
μ¬μ© λ°©λ²:
- constexpr μμ±μ: μ»΄νμΌ νμμ κ°μ²΄λ₯Ό μμ±ν μ μλλ‘ νμ©ν©λλ€.
- constexpr λ©€λ² ν¨μ: ν΄λμ€μ λ©μλκ° μ»΄νμΌ νμμ νΈμΆλ μ μλλ‘ ν©λλ€.
μμ:
#include <iostream>
class Point {
public:
constexpr Point(double x, double y) : x_(x), y_(y) {}
constexpr double getX() const { return x_; }
constexpr double getY() const { return y_; }
constexpr double distanceToOrigin() const {
return sqrt(x_ * x_ + y_ * y_);
}
private:
double x_;
double y_;
};
int main() {
constexpr Point p(3.0, 4.0); // μ»΄νμΌ νμμ κ°μ²΄ μμ±
constexpr double distance = p.distanceToOrigin(); // μ»΄νμΌ νμμ κ³μ°
std::cout << "Distance to origin: " << distance << std::endl; // μΆλ ₯: 5
return 0;
}
constexprμ μ¬μ©ν λ μ£Όμν΄μΌ ν μ¬ν
μ£Όμν μ :
- 볡μ‘ν μ°μ° μ ν: λͺ¨λ μ°μ°μ΄ μ»΄νμΌ νμμ κ³μ°λ μ μλ κ²μ μλλλ€. μλ₯Ό λ€μ΄, νμΌ I/Oλ λμ λ©λͺ¨λ¦¬ ν λΉ λ±μ μ°μ°μ μ»΄νμΌ νμμ μνλ μ μμ΅λλ€.
- ν¨μ λ΄ μν λ³ν κΈμ§: constexpr ν¨μ λ΄μμλ μνλ₯Ό λ³κ²½ν μ μμ΅λλ€. λͺ¨λ μ λ ₯μ΄ κ·Έλλ‘ μΆλ ₯μ λ°μλμ΄μΌ νλ©°, ν¨μ λ΄μμ λ³κ²½λλ κ°λ³ μνκ° μμ΄μΌ ν©λλ€.
- λͺ¨λ κ²½λ‘κ° constexpr 쑰건μ μΆ©μ‘±ν΄μΌ ν¨: 쑰건문μ΄λ λ°λ³΅λ¬Έμ μ¬μ©νλ κ²½μ°, ν¨μμ λͺ¨λ κ²½λ‘κ° constexpr 쑰건μ λ§μ‘±ν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ ν¨μκ° μ»΄νμΌ νμμ νκ°λ μ μμ΅λλ€.
- μ»΄νμΌλ¬ μ§μ: λͺ¨λ μ»΄νμΌλ¬κ° constexprμ λͺ¨λ κΈ°λ₯μ μλ²½ν μ§μνλ κ²μ μλλλ€. νΉν, μ€λλ μ»΄νμΌλ¬λ₯Ό μ¬μ©ν κ²½μ°, μΌλΆ constexpr κΈ°λ₯μ΄ μ νλ μ μμ΅λλ€.
- λ°νμ μ¬μ© κ°λ₯μ±: constexprλ‘ μ μλ ν¨μλ λ³μλ λ°λμ μ»΄νμΌ νμμ κ³μ°λμ§ μμ μλ μμ΅λλ€. μ»΄νμΌ νμμ μΈμλ₯Ό μ μ μλ κ²½μ° λ°νμμ νκ°λ©λλ€. λ°λΌμ constexprμ΄ νμ μ»΄νμΌ νμμ νκ°λλ€κ³ κ°μ ν΄μλ μ λ©λλ€.
μμ:
constexpr int foo(int x) {
if (x > 0) {
return x * x;
} else {
return -x;
}
}
// μ΄ ν¨μλ xκ° μ»΄νμΌ νμμ μ£Όμ΄μ§λ€λ©΄ μ»΄νμΌ νμμ νκ°λμ§λ§,
// λ°νμμ xκ° μ£Όμ΄μ§λ€λ©΄ λ°νμμ νκ°λ©λλ€.
μ΄ μ§λ¬Έλ€μ C++μμμ constexprμ κ°λ ₯ν κΈ°λ₯κ³Ό κ·Έ μ μ© κ°λ₯μ±μ λ κΉμ΄ μ΄ν΄νλ λ° λμμ΄ λ κ²μ λλ€. constexprλ μ±λ₯ μ΅μ νμ μ½λ μμ μ±μμ μ€μν μν μ νλ©°, μ΄λ₯Ό μ μ ν νμ©νλ©΄ λ λμ C++ νλ‘κ·Έλ¨μ μμ±ν μ μμ΅λλ€.