const

·2024년 12월 16일
0

C++

목록 보기
23/26

낌새만 보이면 const를 들이대 보자

const

어떤 값이 불변이어야 하는 제작자의 의도를 컴파일러 및 다른 프로그래머와 나눌 수 있는 수단

const 키워드가 * 보다 왼쪽에 있으면 포인터가 가리키는 대상이 상수임
* 보다 오른쪽에 있으면 포인터 자체가 상수임

char greeting[] = "Hello";
char* p = greeting;             // 비상수 포인터, 비상수 데이터 (값, 주소 변경 가능)

const char* p = greeting;       // 비상수 포인터, 상수 데이터 (주소 변경 가능)

char* const p = greeting;       // 상수 포인터, 비상수 데이터 (값 변경 가능)

const char* const p = greeting; // 상수 포인터, 상수 데이터

포인터가 가리키는 대상을 상수로 만들 때 두 가지 방법이 있지만 의미적인 차이는 전혀 없음

void f1(const Widget *pw); // (1)
void f2(Widget const *pw); // (2)

상수 멤버 함수

멤버 함수에 붙는 const는 해당 멤버 함수가 상수 객체에 대해 호출될 함수임을 알려줌

상수 멤버 함수를 사용하는 이유

  • 클래스로 만들어진 객체를 변경할 수 있는 함수와 변경할 수 없는 함수를 사용자 측에 알려줌

물리적 상수성, 논리적 상수성

  • 물리적 상수성
    어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 함 (정적 멤버 제외)
    즉, 그 객체를 구상하는 비트들 중 어떤 것도 바꾸면 안 됨

  • 논리적 상수성
    상수 멤버 함수라고 해서 객체의 한 비트도 수정할 수 없는 것이 아니라 일부 몇 비트 정도는 바꿀 수 있되, 그것을 사용자 측에서 알아채지 못하게만 하면 상수 멤버 자격이 있음
    -> 컴파일러가 물리적 상수성을 요구하는 경우 mutable 키워드를 사용하여 논리적 상수성만 지킬 수 있음

비상수 멤버 함수와 상수 멤버 함수의 구현부가 동일한 경우

비상수 멤버 함수를 캐스팅해서 상수 멤버 함수를 호출하면 됨
반대의 경우는 상수성을 제거하고 비상수 멤버를 호출하게 되는 것이므로 안정성에 문제가 있음

class TextBlock
{
public:
	const char& operator[](std::size_t position) const
	{
		return text[position];
	}

	const char& operator[](std::size_t position)
	{
		return const_cast<char&>(
			static_cast<const TextBlock&>
			(*this)[position]
            );
	}
};
  • const를 붙이는 캐스팅은 안전한 타입 변환(비상수 객체 -> 상수 객체)이므로 static_cast 사용
  • const를 제거하는 캐스팅은 const_cast 사용

정리

  • const를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는 데 도움을 줌
  • const는 어떤 유효범위에 있는 객체에도 붙을 수 있으며, 함수 매개변수, 반환 타입, 멤버 함수에도 붙을 수 있음
  • 컴파일러 쪽에서 보면 비트 수준 상수성을 지켜야 하지만, 논리적인 상수성을 이용해서 프로그래밍 해야함
  • 상수 멤버 및 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에는 코드 중복을 피하는 것이 좋은데, 이때 비상수 버전이 상수 버전을 호출하도록 만들어야 함

추가 학습

mutable 쓸거면 그냥 const 안 쓰면 되는 거 아니야?

단순히 const를 쓰지 않으면 객체의 상태 변경이 자유롭게 이루어지기 때문에 객체의 상태가 예기치 않게 변할 수 있음
const를 사용하는 목적은 객체의 외부에서 값이 바뀌지 않도록 보호하기 위해서임
mutableconst로 선언된 객체 내부에서 특정 멤버만 수정할 수 있도록 허용하기 때문에 외부에서는 불변성을 유지하면서도 내부적으로 필요한 수정을 허용할 수 있음

0개의 댓글

관련 채용 정보