본문 바로가기
C++ STL, 알고리즘

const

by wanna_dev 2024. 10. 2.

클래스의 데이터 멤버를 const로 선언하면, 생성 시점에 초깃값을 부여한 다음 더는 값을 변경할 수 없게 된다. 그런데 객체 수준에서 상숫값을 보유하는 것은 대부분은 메모리 낭비이다.

이때는 static const 멤버를 이용해서 객체간에 상숫값을 공유하도록 할 수 있다.

예를 들어 스프레드 시트가 가질수 있는 가로 / 세로 최대크기를 관리해야한다면 당므과 같이 static const 멤버로 선언하여 사용자가 최댓값이상으로 스프레드 시트를 키우려고 할 때 최댓값 까지만 설정되도록 강제할 수 있다.

class Spreadsheet 
{
public :
	static const int kMaxHeight = 100;
	static const int kMaxWidth = 100; 
}

상수값들은 다음처럼 생성자에서도 이용될 수 있다.

Spreadsheet::Spreadsheet(int inWidth, in inHeight)
	:mWidth(inWidth < kMaxWidth ? inWidth : kMaxWidth),
	mHeight(inHeight < kMaxHeight ? inHeight : kMaxHeight){
 mId = sCounter++;
 mCells = new SpreadsheetCell*[mWidth];
 for(int i=0; i<mWidth; i++){
	 mCells[i] = new SpreadsheetCell[mHeight];
 }	
}

참조형 데이터 멤버는 보통의 참조형 변수와 마찬가지로 const 객체를 참조할 수 있다.

예를 들어 Spreadsheet 객체가 어플리케이션 객체를 const 타입으로 참조해야만 한다면 다음처럼 mTheApp 변수를 cosnt로 선언하기만 하면 된다.

class Spreadsheet 
{
public:
	Spreadsheet(int inWidth, int inHeight, const SpreadsheetApplication& theApp);
protected:
	const SpreadsheetApplication& mTheApp;
}

참조형 변수가 const 타입이나 아니냐에 따라 큰 차이가 있다.

const 참조형 변수로 참조된 SpreadsheetApplication 객체에 대해서 const메서드만 이용할 수 있다.

만약 const 참조된 객체에서 const가 아닌 메서드를 호출하려 하면 컴파일 에러가 발생한다.

static 참조형 멤버나 static const 참조형 멤버도 선언할 수 있다.

const 메서드

그 값이 절대 바뀔 수 없는 객체를 const 객체라고 한다. 객체에 대한 참조나 포인터 변수를 const로 선언하고 객체의 메서드를 호출하면 해당 메서드가 객체의 데이터 값을 바꾸지 않는다는 보증이 있어야만 컴파일러가 정상적으로 컴파일을 진행한다. 이때 메서드가 객체의 데이터 값을 바꾸지 않는다는 선언이 바로 const이다.

class SpreadsheetCell{
	public: 
		double getValue() const;
		string getString() const;
}

const 제한자는 메서드 원형 선언에 포함되기 때문에 구현부에서도 똑같이 적용해야한다.

double SpreadsheetCell::getValue() const{
	return mValue;
}
string SpreadsheetCell::getString() const{
	return mString;
}

const 객체에 대해서는 const 메서드만 호출할 수 있다.

 

출처 : 전문가를 위한 C++

'C++ STL, 알고리즘' 카테고리의 다른 글

memory leak detection  (0) 2024.10.02
C++ 상속  (3) 2024.10.02
C++ 생성자  (0) 2024.10.02
OOP  (0) 2024.10.02
C++ 알쓸신잡  (0) 2024.10.02