[ Effective C++ ] 항목 15 : 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자!

Minsu._.Lighting·2023년 11월 22일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" RAII 클래스는 애초에 데이터 은닉이 목적이 아니므로 자원 관리만 실수 없이 이루어진다면 OK! "

  • 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 직접 만들 때는 관리하는 자원을 얻을 수 있게 방법을 구현 하자!
  • 자원 접근은 명시적·암시적 변환을 통해 가능! 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 고객 편의성을 놓고 보면 암시적 변환도 괜찮음!

💡 자원 관리 클래스는 듬직한 보호벽!

  • 자원 관리 클래스는 실수로 발생할 수 있는 자원 누출을 막아준다!


💡 자원 관리 클래스의 보호를 받는 자원을 직접 참조..?

  • 실제로 많은 코드에서 자원을 직접 참조하는 API들이 많다!
[직접 참조 코드]
shared_ptr<Investment>pInv(createInvestment());

int daysHeld(const Investment *pi);

int days = daysHeld(pInv);				// 에러!

📢 위 문제는 auto_ptr, shared_ptr과 같은 RAII 클래스는 명시적, 암시적 변환으로 해결 가능!

📌 auto_ptr, shared_ptr의 명시적 변환

  • get() 멤버 함수를 이용하자!
    - 스마트 포인터에 들어있는 실제 포인터의 사본을 얻어낼 수 있음.
    int days = daysHeld(pInv.get());

📌 auto_ptr, shared_ptr의 암시적 변환

  • 제대로 만들어진 스마트 포인터 클래스라면 포인터 역참조 연산자(operator->, *)도 오버로딩 되어있음.
[암시적 변환 코드]
class Investment
{
public:
	bool isTaxFree() const;
    ...
};

Investment* createInvestment();

shared_ptr<Investment>pi1(createInvestment());

bool taxable1 = !(pi1->isTaxFree());			// operator-> 이용

auto_ptr<Investment>pi2(createInvestment());

bool taxable2 = !((*pi2).isTaxFree());			// operator* 이용

📌 직접 설계한 RAII 클래스 에서는..?**

  • RAII 클래스의 get 함수와 같은 기능을 하는 명시적 함수 구현
  • 사용할 때 마다 명시적 함수를 호출하는게 번거롭다면 암시적 함수를 구현
    📢 의도치 않게 마음대로 바뀔 수 있으니 사용에 주의 필요!
profile
오코완~😤😤

0개의 댓글

관련 채용 정보