본문 바로가기

C++

C++ Const 정확도(Const Correctness)

 

1. Const 정확도가 중요한 이유

The benefit of const correctness is that it prevents you from inadvertently modifying something you didn’t expect would be modified. 
const 정확도가 왜 중요할까요? 
const 정확도의 효과는 의도치 않게 수정하고 싶지 않았던 것에 대해서 수정하는 것을 방지한다는 것입니다.
조금 더 깊게 들어가면 더 다양한 이유가 있겠지만 위의 문장이 const 정확도의 중요성에 있어서 많은 부분을 요약해준다고 생각합니다.

 

2. 참조와 포인터에서의 사용

const T* p

pointer p가 const T타입을 가리킨다고 해석할 수 있습니다.
T 타입을 const 관점으로 바라보기 때문에 값을 수정할 수 없습니다.

const 관점으로 T 타입 객체를 바라보는 pointer

T* const  p

const 관점의 pointer가 Type T객체를 가리킨다고 해석할 수 있습니다.

pointer가 const 관점이기 때문에 안에 들어있는 주소 값을 변경할 수는 없지만, 역참조를 이용해 값을 변경할 수 있습니다.

const 관점의 pointer(Type T 객체를 바라보는)

 

const T* const  p

const 관점의 pointer가 const 관점의 Type T변수를 가리킨다고 해석할 수 있습니다.

const 관점으로 pointer를 바라보기 때문에 pointer 내부 주소를 변경할 수 없고,

마찬가지로 Type T 객체도 const 관점으로 바라보기 때문에 역참조를 통한 값 변경이 불가능합니다.

const 관점의 포인터가 가리키는 const 관점의 Type T 객체

 

const  T &x

참조 객체 x는 const 관점의 Type T를 참조합니다.
T 타입을 const 관점으로 바라보기 때문에 값을 수정할 수 없습니다.

const 관점의 Type T를 참조하는 객체 x

 

T &const x

위의 문장을 해석하면 const 관점의 참조가 Type T 객체를 참조한다 라고 해석할 수 있습니다.

C++ 문법에서 T &const x와 같은 형태는 존재하지 않습니다.
왜냐하면 참조의 경우는 한 번 초기화되면 다른 변수를 참조할 수 없기 때문에 참조 자체에 const를 사용하는 것은 의미가 없습니다.

 

const T &const x

위의 문장을 해석하면 const 관점의 참조가 const 관점의 Type T 객체를 참조한다 라고 해석할 수 있습니다.

위의 T &const x와 같은 이유로 c++ 문법에서 이와 같은 형태는 존재하지 않습니다.
참조의 경우는 한 번 초기화되면 다른 변수를 참조할 수 없기 때문에 참조 자체에 const를 사용하는 것은 의미가 없습니다.

 

3. 멤버 함수 에서의 사용

멤버 함수에서 사용하는 경우 함수의 오른쪽에 const가 붙습니다.
const가 붙은 멤버 함수는 객체의 상태 변경이 불가능해집니다.
const가 붙은 멤버 함수의 경우 일반 객체, 상수 객체 양쪽에서 모두 호출이 가능합니다.
const가 붙지 않은 멤버 함수의 경우는 일반 객체에서만 호출이 가능합니다.

class MyClass {
public:
    void modifyData() {
        // 일반 멤버 함수: 객체의 상태 변경 가능
        data = 100;
    }

    void readData() const {
        // 상수 멤버 함수: 객체의 상태 변경 불가능, 읽기만 가능
        // data = 100;  // 컴파일 에러: 상태 변경 시도
        int value = data;  // 읽기는 가능
    }

private:
    int data;
};

int main() {
    const MyClass obj1;  // 상수 객체
    MyClass obj2;        // 일반 객체

    obj1.readData();  // const 멤버 함수 호출 가능
    // obj1.modifyData();  // 컴파일 에러: 상수 객체에서는 상태 변경 불가

    obj2.readData();    // const 멤버 함수 호출 가능
    obj2.modifyData();  // 일반 멤버 함수 호출 가능
}

 

 

참고

https://isocpp.org/wiki/faq/const-correctness#const-and-type-safety

 

Standard C++

 

isocpp.org

 

https://tsi.kr/entry/C%EC%9D%98-Const-%EA%B5%90%EC%A0%95%EC%9E%90-Correctness

 

C++의 Const 교정자 (Correctness)

‘const’ 키워드는 해당 객체가 변형될 수 없는 것을 가리킴. 객체가 const 포인터 또는 레퍼런스에 담겼을 경우, const 멤버 함수만 호출할 수 있음. 비 const 멤버 함수를 호출하려고 하면 컴파일 에

tsi.kr

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/epic-cplusplus-coding-standard-for-unreal-engine

 

언리얼 엔진을 위한 에픽 C++ 코딩 표준

기존에 확립된 표준 및 모범 사례를 준수하여 유지보수 가능한 코드를 작성합니다.

dev.epicgames.com

 

'C++' 카테고리의 다른 글

C++ 클래스  (0) 2024.05.12
C++ 동적할당  (0) 2024.05.04
C++ 컴파일 과정  (0) 2024.04.21
C++ 연산자  (0) 2024.02.28
C++ 자료형  (0) 2024.02.27