이 글에서는 C++에서 const_cast가 어떻게 동작하는지 살펴봅니다.
const_cast는 C++의 타입 캐스팅 연산자 중 하나로, 객체의 상수 값(const)을 변경하거나, 쉽게 말해 객체에서 상수성을 제거하는 데 사용됩니다.
상수로 선언된 객체의 값을 특정 시점에 가끔씩 변경해야 하는 프로그램에서 const_cast가 유용하게 활용될 수 있습니다.
문법
기본 문법은 다음과 같습니다.
const_cast<타입 이름>(표현식)
예제
Input: x = 50 const int* y = &x cout<<"old value is"<<*y<<"\n"; int* z=const_cast<int *>(y); *z=100; cout<<"new value is"<<*y; Output: old value is 50 new value is 100
위 예제는 const_cast의 기본적인 사용 방법을 보여줍니다. 먼저 int 타입의 상수 변수 x를 선언하고 값 50을 할당한 뒤, 이 변수 x를 가리키는 int 타입의 상수 포인터 y를 선언했습니다.
const_cast를 사용하려면 세 번째 포인터가 필요합니다. 여기서는 같은 데이터 타입인 int형 포인터 z를 생성했습니다.
상수 변수 x를 가리키고 있는 상수 포인터 y를 const_cast에 전달한 후 포인터 z에 대입하면, 상수 포인터 y가 가리키는 값을 변경할 수 있게 됩니다.
이렇게 해서 const_cast를 통해 상수 값을 50에서 100으로 변경할 수 있었습니다.
만약 const_cast를 사용하지 않고 포인터 y가 가리키는 변수 x의 값을 변경하려고 하면 다음과 같은 오류가 발생합니다 — "read-only(읽기 전용) 위치에 대한 할당" 오류입니다.
프로그램의 접근 방식
- 먼저 int 타입의 상수 변수를 생성하고 적절한 값을 지정합니다. 예를 들어 변수명은 "a", 값은 20으로 합니다.
- 그다음 같은 데이터 타입의 상수 포인터 "b"를 생성하고, 상수 변수 "a"의 주소를 할당합니다.
- const_cast에 사용할 세 번째 포인터 "c"를 int 타입으로 생성합니다.
- 상수 포인터 "b"를 const_cast에 전달하고 그 결과를 포인터 "c"에 대입합니다.
- 마지막으로 포인터 "c"의 값을 변경합니다. 그러면 상수 포인터 "b"가 가리키는 값도 자동으로 함께 변경됩니다.
알고리즘
Start
Step 1 -> In function main()
Declare a constant int a=20
Declare a constant pointer int* b=&a
Declare a pointer int*c = const_cast<int *>(b)
Assign *c=40
Stop예제 코드
#include <iostream>
using namespace std;
int main() {
const int a = 20;
const int* b = &a;
cout<<"old value is"<<*b<<"\n";
int* c=const_cast<int *>(b);
*c=40;
cout<<"new value is"<<*b;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
old value is 20 new value is 40
여기서 상수 포인터 "b"는 값이 20으로 고정되어 변경할 수 없는 상수 변수 "a"를 가리키고 있습니다. 하지만 같은 데이터 타입의 비상수(non-const) 포인터 "c"를 새로 만들고 const_cast를 적용함으로써 해당 상수 값을 변경할 수 있었습니다.
포인터 "c"의 값 변경은 상수 포인터 "b"가 가리키던 상수 값 20의 변화로 이어졌습니다. 따라서 const_cast를 사용하기 전 출력 값은 20이었고, 사용한 후에는 40이 되었습니다.
const_cast의 다른 활용법
프로그램에서 const_cast는 상수 데이터를, 상수 데이터를 받지 않는 다른 함수에 전달할 때도 사용할 수 있습니다.
예제 코드
#include <iostream>
using namespace std;
int change(int* p2) {
return (*p2 * 10);
}
int main() {
const int num = 100;
const int *p = #
int *p1 = const_cast <int *>(p);
cout << change(p1);
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
1000
이 프로그램은 const_cast를 사용해 상수 값 100을, 상수 데이터를 받지 않는 change() 함수에 전달하는 과정을 보여줍니다.
change() 함수는 전달받은 값에 10을 곱한 뒤 그 결과를 main() 함수로 반환하고, main() 함수가 최종 출력인 1000을 생성합니다.
만약 const_cast 없이 동일한 프로그램을 실행하여 상수 값을 change() 함수에 직접 전달하려고 하면 컴파일 오류가 발생합니다.