C++에서 클래스의 함수 선언에 있는 const 키워드
C++에서 const
키워드는 프로그램 실행 중에 변경되지 않고 일정하게 유지되는 값을 정의합니다. 이것은 변수와 변수가 보유한 데이터에 대해 매우 간단하게 들립니다.
그러나 어떻게 함수를 상수로 선언할 수 있으며 함수에서 변경되지 않은 상태로 유지되어야 하는 것은 무엇입니까? 이 기사에서 이러한 모든 질문에 답할 것이므로 계속 읽으십시오!
여기서 보고 있는 함수는 클래스에 속하는 함수, 즉 멤버 함수입니다.
C++ 클래스의 함수 선언에서 const
키워드
실제 토론에 들어가기 전에 문제 설명을 올바르게 이해합시다.
우리는 이미 클래스가 데이터 멤버와 멤버 함수를 가질 수 있다는 것을 알고 있습니다. 이러한 멤버 함수는 일반적으로 다음과 같이 클래스 내에서 선언됩니다.
class Demo // class
{
public:
int x;
int showDemo(); // member function declaration
}
여기서 멤버 함수 showDemo()
는 Demo
클래스에 속합니다. 그러나 다음과 같이 멤버 함수 끝에 const
를 추가하면 무엇을 의미합니까?
class Demo // class
{
public:
int x;
int showDemo() const; // const member function declaration
}
이를 이해하기 위해 C++에서 멤버 함수가 일반적으로 어떻게 작동하는지 먼저 살펴보겠습니다.
C++에서 멤버 함수의 동작
아래 주어진 코드를보십시오. 여기에서 먼저 값이 2,
로 설정된 chocolate
데이터 멤버와 Desert()
멤버 함수로 Demo
라는 클래스를 정의합니다.
멤버 함수 내에서 welcome 문과 함께 데이터 멤버 chocolate
의 원래 값을 인쇄한 다음 이 값을 1씩 증가시킵니다. 또한 다음 명령문에서 초콜릿
의 증가된 값을 인쇄합니다.
마지막으로 demo
객체를 생성하고 main
블록에서 Desert()
멤버 함수를 호출합니다. 또한 객체 demo
및 dot
연산자를 사용하여 chocolate
값을 인쇄합니다.
#include <iostream>
using namespace std;
class Demo {
public:
int chocolates = 2;
public:
void Desert() // member function
{
cout << "Hello Chocolates" << endl;
cout << "Before change: " << chocolates << endl;
chocolates++;
cout << "After change: " << chocolates << endl;
}
};
int main() {
Demo demo;
demo.Desert();
cout << demo.chocolates << endl;
}
출력:
Hello Chocolates
Before change: 2
After change: 3
3
여기에서 멤버 함수 내부에서 데이터 멤버 chocolate
의 값을 변경한 것을 볼 수 있습니다. 변경 사항을 보다 정확하게 강조하기 위해 main
블록에서도 이 변수의 값을 인쇄하지만 여전히 3
이라는 업데이트된 값을 얻습니다.
따라서 이 예제는 개체를 변경하기 위해 일반 멤버 함수를 어떻게든 사용할 수 있음을 의미합니다.
여기에는 하나의 클래스와 하나의 객체만 있습니다. 그러나 많은 클래스와 개체로 작업하는 동안 실수로 개체가 변경될 가능성이 높습니다.
이를 방지하기 위해 C++의 const
멤버 함수를 사용합니다.
C++에서 const
멤버 함수의 동작
아래 주어진 예를 보십시오. 이 코드는 이번에는 멤버 함수 뒤에 const
키워드를 넣는 것을 제외하면 이전 코드와 동일합니다.
#include <iostream>
using namespace std;
class Demo {
public:
int chocolates = 2;
public:
void Desert() const // const member function
{
cout << "Hello Chocolates" << endl;
cout << "Before change: " << chocolates << endl;
chocolates++;
cout << "After change: " << chocolates << endl;
}
};
int main() {
Demo demo;
demo.Desert();
cout << demo.chocolates << endl;
}
출력:
In member function 'void Demo::Desert() const':
error: increment of member 'Demo::chocolates' in read-only object
13 | chocolates++;
| ^~~~~~~~~~
멤버 함수를 상수로 만들어 출력이 어떻게 변하는지 확인할 수 있습니다. 이번에는 초콜릿
의 값이 증가하지 않아 오류가 발생합니다.
따라서 이 예는 const
멤버 함수를 사용하여 어떤 식으로든 개체를 변경할 수 없음을 의미합니다.
멤버 함수에 대한 위의 두 가지 비교를 통해 이러한 함수 선언에서 const
를 사용하면 클래스 멤버가 변경되지 않는다는 결론을 내립니다. 메서드에 const
를 추가하면 this
포인터가 const
개체를 가리키므로 데이터 멤버를 변경할 수 없습니다.
우리가 배운 모든 것 후에 객체 변경을 피하기 위해 const
멤버 함수를 사용한다고 말할 수 있습니다. 그러나 다음과 같은 질문이 있을 수 있습니다. const
개체의 용도는 무엇입니까?
개체를 const
로 선언하면 const
멤버 함수만 호출할 수 있습니다. 이는 const
개체를 수정할 수 없고 이 비변경은 const
멤버 함수에 의해서만 약속되기 때문입니다.
아래 예를 보십시오.
Desert
클래스에는 desert()
및 desert() const
라는 두 개의 멤버 함수가 있습니다. 그런 다음 main
블록 내에서 두 개체 d
와 상수 개체 dd
를 정의합니다.
이 예제에 대한 몇 가지 중요한 사항에 유의하십시오.
- 같은 이름을 가진 두 개의 멤버 함수가 있습니다. 유일한 차이점은 그 중 하나가
const
멤버 함수라는 것입니다. - 두 개의 객체가 있는데 그 중 하나는 상수 객체입니다.
- 어떤 객체가 어떤 함수를 호출하는지 지정하지 않고 두 객체에서 멤버 함수
desert()
를 호출합니다.
#include <iostream>
using namespace std;
class Desert {
private:
int cakes;
public:
void desert() { cout << "The first desert function." << endl; }
void desert() const // the const member function
{
cout << "The second const desert function." << endl;
}
};
int main() {
Desert d; // object of class
const Desert& dd = d; // constant object of class
d.desert();
dd.desert();
}
출력:
The first desert function.
The second const desert function.
출력은 일반 멤버 함수 desert()
가 일반 객체 d
에 의해 자동으로 호출되었음을 명확하게 보여줍니다. 반면 const
멤버 함수 desert() const
는 const
개체 dd
에 의해 자동으로 호출됩니다.
개체에서 const
키워드를 제거하면 출력이 변경됩니다.
int main() {
Desert d; // object of class
Desert& dd = d; // remove the constant keyword
d.desert();
dd.desert();
}
출력:
The first desert function.
The first desert function.
이번에는 두 개체가 첫 번째 함수를 호출합니다. 이는 const
객체가 const
멤버 함수를 호출함을 증명합니다.
이것은 상수가 아닌 객체에서 const
멤버 함수를 호출할 수 없다는 의미는 아닙니다. 그러나 const
가 아닌 함수는 const
가 아닌 객체에 의해서만 호출될 수 있습니다.
지금까지는 그렇게 좋았지 만 예외적인 경우가 있습니다. 클래스의 데이터 멤버와 함께 mutable
한정자를 사용하면 const
메서드에서도 개체를 수정할 수 있습니다.
이 예를 보십시오.
#include <iostream>
using namespace std;
class Demo {
public:
mutable int chocolates = 2; // mutable quantifier
public:
void Desert() const // const member function
{
cout << "Hello Chocolates" << endl;
cout << "Before change: " << chocolates << endl;
chocolates++;
cout << "After change: " << chocolates << endl;
}
};
int main() {
Demo demo;
demo.Desert();
cout << demo.chocolates << endl;
}
출력:
Hello Chocolates
Before change: 2
After change: 3
3
이번에는 chocolate
데이터 멤버와 함께 mutable
수량자를 사용하기 때문에 이전과 같은 오류가 발생하지 않습니다. 이는 메서드가 호출된 횟수를 계산하려는 경우에 종종 유용합니다.
이것은 C++의 const
멤버 함수에 관한 것입니다. 여기 저기에 약간의 변경을 가하면서 예제를 더 많이 사용할수록 더 명확해질 것입니다!
C++의 const
에 대한 자세한 내용은 이 문서를 참조하세요.
결론
이 기사에서는 C++의 const
멤버 함수 개념에 대해 논의했습니다. const
멤버 함수는 개체가 실수로 수정되지 않도록 보장하며 const
및 const
가 아닌 개체와 함께 사용할 수 있습니다.
그러나 const
개체는 const
멤버 함수만 취소할 수 있습니다. 또한 데이터 멤버와 함께 mutable 키워드를 사용하면 const
멤버 함수의 일반적인 동작을 변경할 수 있으며 일반적으로 계산 목적으로 사용됩니다.