C++11부터 도입된 constexpr
키워드는 컴파일 시간에 평가될 수 있는 상수 표현식을 정의할 수 있게 합니다. 이는 프로그램의 성능과 안정성을 높이는 데 유용합니다. 오늘은 constexpr
의 사용법과 상수 표현식에 대해 자세히 학습하겠습니다.
constexpr (상수 표현식)
constexpr의 기본 사용법
constexpr
키워드는 변수, 함수, 생성자 등에 사용할 수 있습니다. constexpr
로 선언된 변수는 반드시 컴파일 시간에 값을 결정할 수 있어야 합니다.
기본 예제
#include <iostream>
constexpr int square(int x) {
return x * x;
}
int main() {
constexpr int result = square(5);
std::cout << "Square of 5: " << result << std::endl;
return 0;
}
이 예제에서 square
함수는 constexpr
로 선언되어 컴파일 시간에 result
의 값을 계산할 수 있습니다.
컴파일 시간 상수와 런타임 상수
constexpr
변수는 반드시 컴파일 시간에 값을 결정해야 하지만, const
변수는 런타임에 값을 결정할 수 있습니다.
컴파일 시간 상수
constexpr int compileTimeConstant = 10;
런타임 상수
const int runtimeConstant = someFunction();
runtimeConstant
는 someFunction()
의 실행 결과에 따라 값이 결정됩니다.
constexpr 함수
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;
return 0;
}
이 예제에서 factorial
함수는 constexpr
로 선언되어 컴파일 시간에 결과를 계산할 수 있습니다.
constexpr와 상수 표현식의 활용
constexpr
를 사용하면 컴파일 시간에 다양한 계산을 수행할 수 있어 프로그램의 성능을 향상시킬 수 있습니다.
상수 표현식을 사용하는 예제
파이 값 계산
#include <iostream>
constexpr double pi() {
return 3.14159265358979323846;
}
int main() {
constexpr double piValue = pi();
std::cout << "Pi value: " << piValue << std::endl;
return 0;
}
배열 크기 정의
#include <iostream>
constexpr int arraySize() {
return 10;
}
int main() {
int arr[arraySize()]; // 컴파일 시간에 배열 크기 결정
std::cout << "Array size: " << sizeof(arr) / sizeof(arr[0]) << std::endl;
return 0;
}
실습 문제
문제 1: constexpr을 사용하여 컴파일 시간에 피보나치 수 계산
constexpr
를 사용하여 컴파일 시간에 피보나치 수를 계산하는 함수를 작성하세요.
해설:
#include <iostream>
constexpr int fibonacci(int n) {
return (n <= 1) ? n : (fibonacci(n - 1) + fibonacci(n - 2));
}
int main() {
constexpr int result = fibonacci(10);
std::cout << "Fibonacci of 10: " << result << std::endl;
return 0;
}
문제 2: constexpr을 사용하여 삼각형의 넓이를 계산하는 함수 작성
constexpr
를 사용하여 삼각형의 넓이를 계산하는 함수를 작성하세요.
해설:
#include <iostream>
constexpr double triangleArea(double base, double height) {
return 0.5 * base * height;
}
int main() {
constexpr double area = triangleArea(5.0, 10.0);
std::cout << "Area of the triangle: " << area << std::endl;
return 0;
}
문제 3: constexpr을 사용하여 컴파일 시간에 배열의 최대 값을 계산하는 함수 작성
constexpr
를 사용하여 컴파일 시간에 배열의 최대 값을 계산하는 함수를 작성하세요.
해설:
#include <iostream>
constexpr int max(int a, int b) {
return (a > b) ? a : b;
}
constexpr int arrayMax(const int* arr, int size) {
return (size == 1) ? arr[0] : max(arr[0], arrayMax(arr + 1, size - 1));
}
int main() {
constexpr int arr[] = {1, 5, 3, 9, 7};
constexpr int result = arrayMax(arr, 5);
std::cout << "Max value in array: " << result << std::endl;
return 0;
}
이제 6일차의 학습을 마쳤습니다. constexpr
와 상수 표현식에 대해 상세히 학습하고 실습 문제를 풀어보았습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "R-값 참조와 이동 시멘틱"에 대해 다루겠습니다.
'-----ETC----- > C++ 고급 프로그래밍과 응용 프로젝트 시리즈' 카테고리의 다른 글
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 8: 디자인 패턴 심화 - 싱글톤 패턴 (Singleton Pattern) (0) | 2024.08.01 |
---|---|
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 5: 범위 기반 for 루프와 초기화 리스트 (0) | 2024.08.01 |
[C++ 고급 프로그래밍과 응용 프로젝트] Day 3: SFINAE와 개념 (0) | 2024.08.01 |
[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 4: C++20의 개념과 모듈 (0) | 2024.08.01 |
[C++ 고급 프로그래밍과 응용 프로젝트] Day 2: 고급 템플릿 프로그래밍 (0) | 2024.08.01 |