본문 바로가기
-----ETC-----/C++ 고급 프로그래밍과 응용 프로젝트 시리즈

[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 6: constexpr과 상수 표현식

by cogito21_cpp 2024. 8. 1.
반응형

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();

runtimeConstantsomeFunction()의 실행 결과에 따라 값이 결정됩니다.


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-값 참조와 이동 시멘틱"에 대해 다루겠습니다.

반응형