Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ const_cast 완벽 가이드: 상수성 제거와 실전 활용법

이 글에서는 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() 함수에 직접 전달하려고 하면 컴파일 오류가 발생합니다.