이번엔 변수 앞에 const
가 붙으면 어떻게 되는지 알아보자.
#include <iostream>
int main()
{
using namespace std;
//const를 맨 앞에 두고 사용하는 것이 일반적이므로 앞의 코드처럼 사용한다.
const double gravity{ 9.8 }; // == double const gravity{9.8};
gravity = 1.2;
return 0;
}
output : compile 오류 (실행 안됨.)
우리가 변수를 선언할 때 double gravity{9.8};
과 같이 uniform initailization을 사용한다면 코드 중간에 다시 대입 연산자를 사용하여 값을 바꿀 수 있다. 그러나 const
를 사용하면 바꿀 수 없게 된다. 고정 값으로 인식을 한다.
다만, 아예 못 바꾸는 것이 아니라 강제로 바꾸는 방법이 있긴 하지만, 매우 안 좋은 방법이니 사용하지 않도록 한다.
#include <iostream>
using namespace std;
void printNumber(int n_number)
{
cout << n_number << endl;
}
int main()
{
printNumber(123);
const double gravity{ 9.8 };
return 0;
}
output : 123
이 코드로 const를 사용하는 경우에 대해 설명해보겠다. 보통 함수를 짜면 매개변수에 들어오는 값을 이용해서 코딩을 하는 경우가 있긴 한데, 다른 Coder가 보다가 바꿔버릴 수도 있다. 그래서 실무에서는 아래와 같은 코드로 작성하여 사용하는 경우가 있다.
#include <iostream>
using namespace std;
void printNumber(const int n_number)
{
// n_number = 124; -> 오류 발생
//그래서 대안은
//int n = n_number;
//cout << n << endl; 과 같이 사용하는 방식이 있다.
cout << n_number << endl;
}
int main()
{
printNumber(123);
const double gravity{ 9.8 };
return 0;
}
이와 같이, const로 바꿔버리면 다른 Coder가 와서 바꿀려고 해도 바꿔지지 않는다.
추후에는 void printNumber(const int& n_number)
이와 같이 코딩하는 경우도 있는데, 대부분의 오픈 소스들이 이와 같은 형태를 띠고 있다. 이에 대한 설명은 나중에 추가적으로 하도록 하겠다.
C에서도 마찬가지겠지만 필요한 것들은 하나에 몰아 넣어두는 것이 정말 편리하다. 무슨말이냐면 저번에 우리가 배운 namespace로 필요한 것들을 갖고오도록 코드를 짜는 것도 매우 편리하다.(헤더파일 생성)
#include <iostream>
#include "MY_CONSTANTS.h"
int main()
{
using namespace std;
double radius;
cin >> radius;
double circumference = 2.0 * radius * constants::pi;
return 0;
}
위의 헤더파일을 보면 MY_CONSTANTS.h파일이 사용되고 있는 것이 보일 것이다. 여기에 무엇이 들어있는지 확인해보면
#pragma once
namespace constants
{
constexpr double pi(3.141592); //컴파일 타임에 확실히 결정되야하는 상수다.
constexpr double avogadro(6.0221413e23);
constexpr double moon_gravity(9.8 / 6.0);
}
로 pi가 저장되어 있는 것을 볼 수 있다. 이 코드를 보면 뭔가 새로운 constexpr
이 있는 것을 볼 수 있는데, 이는 컴파일 타임에 확실히 결정되어야 하는 상수를 선언할 때 위와 같이 코드를 작성한다. 나중에 좀더 코드에 익숙해지면 저절로 알게 될 것이니 지금은 이런 것이 있구나 하고 넘어가길 바란다.