C, C++에서 const란 상수 라는 의미입니다.
즉, 변수, 함수, 객체, 포인터 등.... 을 상수화 시킬 수 있는 키워드 입니다.
그럼 상수란??
데이터의 초기화가 이뤄지면 그 값을 바꿀 수 없도록 해 주는 것입니다.
선언 시 const 변수는 데이터 영역에 들어가게 되며 컴파일과 동시에 데이터 영역 메모리로 올라가 버립니다.
따라서 일반적으론 값의 변경이 이뤄나선 안되는 경우 주로 사용하게 됩니다.
사용 예제를 보도록 하겠습니다.
#include<iostream>
#include<string>
using namespace std;
class A {
private:
int num;
string name;
public:
A() {}
A(int num, string name) {
this->num = num;
this->name = name;
}
void show_Print() const {
cout << "hi" << endl;
num = 10; //컴파일 Error!!!
}
};
int main(void) {
A a;
a.show_Print();
return 0;
}
19행을 보면 show_Print() 함수는 const로 상수화 되어 있습니다.
즉, 이 함수를 통해 값의 변경이 이뤄지는걸 방지하겠다는 뜻입니다.
또한 이 함수는 const로 선언된 변수들 만이 사용될 수 있다는 뜻입니다.
때문에 21행을 보면 일반적인 맴버변수인 num을 넣었을 경우 컴파일 에러를 발생시킵니다.
※ 여기서 주의해야할 점은 const변수가 아니라서 const함수에 사용이 안되는 것은 정확한 이유가 아닙니다.
물론 컴파일에서 허용을 안하는 것 또만 사실이긴 하지만 좀 더 명확한 이유는 다음과 같습니다.
일반 변수는 프로그램이 실행될 때 스택에 들어가게 됩니다. 스택에 들어가게된 변수는 그 값이 언제든 바뀔 수 있기 때문에,
즉, 고정된 값이 아니기 때문에 컴파일러는 해당 변수의 값을 지정해 줄 필요가 없습니다.
하지만 const로 선언된 변수는 해당 값의 초기화가 이뤄져 있고, 컴파일과 동시에 메모리에 올라가게 됨으로
값이 이미 정해져 있는 상태 입니다.
값이 이미 정해져 있는 상태인 변수와 값이 정해져 있지 않는 일반 변수는 데이터 처리가 불가능 하겠죠.
가능한다 하더라도, 그것은 결코 사용자가 원하는 값이 아닐 것입니다.
그렇다면 cout는 const함수에서 어떻게 사용이 가능하느냐?
cout는 ostream의 클래스 객체 이고 이 클래스의 cout 함수들은 많은 함수들을 오버로딩 하고 있는 형태로 되어 있습니다.
여기엔 const로 선언된 함수도 포함되어 있기 때문에 cout는 const함수에서도 작동할 수 있는 것입니다.
const함수의 초기화는 선언과 동시에 초기화 해 주거나 맴버 이니셜라이저(Member Initializer)를 통해 초기화가 가능합니다.
#include<iostream>
#include<string>
using namespace std;
class A {
private:
const int n1 = 10;
const int n2;
public:
A(int _n2) : n2(_n2) {}
};
int main(void) {
A a(100);
return 0;
}
이런 식으로 초기화가 가능합니다.
const를 이용한 함수의 활용은 다음과 같습니다.
간단한 예제를 소개해 보겠습니다.
#include<iostream>
#include<string>
using namespace std;
class A {
private:
const int n1 = 10;
const int n2;
public:
A(int _n2) : n2(_n2) {}
int sum() const {
return n1 + n2;
}
const int sum(int num1, int num2) {
return num1 + num2;
}
};
int main(void) {
A a(100);
cout << a.sum() << endl;
const int num = a.sum(10, 20);
cout << num << endl;
return 0;
}
14행의 함수는 const로 선언된 함수 입니다. 따라서 n1과 n2값을 더해 반환해 주는 것이 가능하지요.
n1과 n2는 const 변수이기 때문에.....
18행의 함수는 반환값이 const로 되어 있습니다. 따라서 맴버 변수는 일반 변수가 들어올 수 있지만
반환값으로 전달되어 값을 저장할 때는 반드시 const 변수로 전달받아야 합니다.
때문에 28행을 보면 const int num에 값을 전달받고 있지요.
여기서 한가지 더 알 수 있는 것이 있습니다. 바로 함수 오버로딩 입니다.
const키워드가 붙으면 오버로딩이 가능하다는 뜻입니다.
때문에 이를 활용하면 다양하게 사용할 수 있습니다.
'프로그래밍 > C++' 카테고리의 다른 글
cout, cin, endl의 연산자 오버라이딩. (0) | 2019.05.17 |
---|---|
C++, 연산자 오버로딩 설명과 사용법!!(교환법칙까지~) (0) | 2019.03.12 |
C++, friend 사용법. (0) | 2019.03.11 |
C++ virtual 함수란? (0) | 2019.03.11 |
C++ 오버라이딩?? 이건 또 뭘까? (0) | 2019.03.04 |
댓글