C++프로그래밍/C 와 C++ 기초실습

상수

season97 2023. 10. 9. 17:40

▶ 상수란?

 

ㆍ 변수와 달리 저장된 데이터를 변경할 수 없는 공간에 할당된 수를 의미한다.

 

ㆍ 상수는 한번 데이터를 저장하고 나면 변경하는 것이 일반적으로는 불가능하다.

 

▶ c / c++언어 상수의 종류

 

1. 리터널상수

 

ㆍ 이름이 없는 상수를 말한다.

 

ㆍ 프로그램 코드에서 직접 사용되는 고정된 값을 말한다.

 

2. 심볼릭 상수

 

ㆍ 이름이 있는 상수를 말한다.

 

ㆍ 특정 값을 가진

이름이 붙은 상수. C++에서는 const키워드나 #define 전처리기를 사용하여 심볼릭 상수를 만들 수 있다.

리터널상수와 심볼릭 상수 예시

 

▶ const 키워드란?

 

ㆍ 상수를 정의하는데 사용되는 키워드로 const로 선언된 변수는 한 번 초기화 하면 그 값을 변경할 수 없다.

 

ㆍ const는 함수 매개변수와 return 타입에도 사용 될 수 있으며 해당 값이 함수 내에서 변경되지 않음을 보장한다.

 

const키워드 변수예시와 포인터에서 예시

 

const 키워드 함수 예시

ㆍ getValue() 메서드에 const 키워드가 붙어 있으므로 이 메서드 내에서 myValue 값을 바꿀수 없다고 컴파일러에게 알려준다. 

 

 

※ 느낀점 : c++에서 const키워드는 프로그램의 안정성과 유지보수성을 높여주는거 같다. 

 

 

 

▶ constexpr 키워드란?

 

ㆍ c++11 에서 도입된 키워드로, 컴파일 타임에 상수 표현식을 계산할 수 있음을 나타낸다.

 

ㆍ 성능 최적화를 위한 중요한 기능으로 이 키워드를 사용하면 런타임이 아닌 컴파일타임에 연산이 수행되므로

실행 시간을 줄일 수 있다.

 

ㆍ constexpr 키워드는 변수나 함수 모두에 사용될 수 있다

 

ㆍ constexpr변수 : 이 변수의 값은 컴파일 타임에 알려져야 하며 상수이다.

 

ㆍ constexpr함수 : 이 함수는 주어진 인자들이 모두 컴파일 타임 상수일 때 컴파일 타임에 실행될 수 있다.

 

constexpr 사용 예제

ㆍ 위 코드에서 square(10) 은 컴파일 시점에 계산되므로 결과인 100은 프로그램 코드 내부에서 직접 사용되는 리터럴 상수와 같아진다.

 

ㆍ C++14 부터는 constexpr 함수가 조건문, 반복문등을 포함할수 있게 되었고 C++17부터는 람다식도 포함할 수 있게되었다.

 

ㆍ C++20부터는 consteval이라는 새로운 키워드가 도입되었으며, 해당 함수가 항상 컴파일시점에서만 실행됨을 보장한다고 한다.

 

※ 추가로 c#에서는 readonly 라는 상수화 키워드를 사용한다.

 

 

▶ const 키워드와 constexpr 키워드의 차이점

 

1. 초기화 시점

 

ㆍ const 변수는 런타임에 초기화 될 수 있지만, constexpr변수는 반드시 컴파일 타임에 초기화 되어야 한다.

 

2. 오류 발견 시기

 

ㆍ const변수의 오류는 런타임에 발견되지만 constexpr 변수의 오류는 컴파일 타임에 발견된다.

 

3. 변경 가능성

 

ㆍ 일반적으로 const와 constexpr 모두 한 번 선언된 후 값을 변경할 수 없다

 

ㆍ 하지만 c++에서 const포인터를 사용할 때 포인터를 통해 가리키는 값은 바꿀 수 있다.

 

ㆍ 단. 포인터 자체가 const로 선언된 경우엔 값을 바꿀 수 없다

 

ㆍ 반만 constexpr은 어떠한 경우라도 값을 변경할 수 없다.

 

4. 함수에서의 사용

 

ㆍ const 함수는 클래스 맴버 변수를 수정하지 않음을 나타낸다

 

ㆍ constexpr 함수는 컴파일 타임 상수를 반환함을 나타낸다. 

 

5. 추가로 기억해야 할 것

 

ㆍ 모든 constexpr변수나 함수는 const이지만 그 반대는 성립하지 않는다.

 

ㆍ constexpr은 주로 컴파일 타임 계산 최적화를 위해 사용된다.

 

 

'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글

컴파일 과정과 전처리기  (0) 2023.10.09
변수와 상수 영역과 Lifecycle  (0) 2023.10.09
함수  (1) 2023.10.09
조건문  (1) 2023.10.09
반복문과 출력  (1) 2023.10.09