논리적 상수성

보물창고·2022년 2월 27일
0
  • 멤버 변수의 값을 string 으로 만들어서 출력하는 기능을 만든다고 한다면
    이런식의 클래스를 구현할 수 있음.

    -> 하지만, 지역변수를 반환하는 것이므로 쓰레기값이 나옴을 확인할 수 있음.
    --> 그래서 static으로 변경함.
  • 이전 시간에 배웠지만, 함수 내에서 변경되는 데이터가 없다면 const 함수에 대한 필요성을 공부함.

    반드시 필요한 순간에 대해서도 공부함.
    -> 상수 객체를 위해서라도!

    -> 상수 객체는 상수 함수만 호출할 수 있다는 특징이 있음.

  • sprintf 함수가 성능에 오버헤드가 크다고 하다면?
    두 번, 동일한 값으로 호출하면 성능이 좋지 않음.
    -> 캐시를 도입하자.

  • 이런식으로 작성이 가능함.

    -> 하지만 const 함수에서는 값 변경이 불가능한 성질이 있음.

그래서... const 성을 제거하는 mutable이 사용됨.

변하는 것과 변하지 않는 것을 분리하자. (소프트웨어 특성)

  • mutable을 사용하지 않고도 위의 성질을 이용해 클래스를 만들자.

최종 코드

#include <iostream>

using namespace std;

//변하는 것을 변경되지 않는 클래스에서 분리함.
struct SCache
{
	char cache_[16];
	bool cacheValid_ = false;
};

class Point
{
public : 
	Point(int _x, int _y) : x_(_x), y_(_y) { pCache_ = new SCache; }

	const char * ToString()  const
	{
		if (pCache_->cacheValid_ == false)
		{
			sprintf(pCache_->cache_, "%d %d", x_, y_);
			pCache_->cacheValid_ = true;
		}
		return pCache_->cache_;
	}

private  :
	int x_, y_;
	SCache *pCache_;
};

int main(void)
{
	const Point p(1, 2);
	cout << p.ToString() << endl;
	cout << p.ToString() << endl;
}
profile
🔥🔥🔥

0개의 댓글