자원관리 클래스의 자원은 접근 가능하게(effective c++ 15)

2015. 8. 20. 09:49프로그래밍/Effective C++

728x90
728x90

형변환을 통한 외부 접근

타입 불일치

- 실수 없이 자원을 관리하기 위해서는 스마트 포인터를 활용하는 방법이 소개되었다.

- 그러나 API 함수를 비롯한 표준 함수들은 원시 포인터(native pointer)를 원한다.


원시 포인터, 스마트 포인터

- 원시 포인터

int* pa;

- 스마트 포인터

std::tr1::shared_ptr<int> ps;


형변환 필요성

- 스마트 포인터는 해당 타입을 감싸고 있는 하나의 객체로 원시 포인터와는 엄연히 다른 타입이다.

- 원시 포인터를 필요로 하는 함수가 있을 경우 이를 형변환해주어야 컴파일 에러를 피할 수 있다.


스마트 포인터

get 함수

- 해당 타입의 원시 포인터 사본을 반환하는 멤버 함수이다.

- auto_ptr과 shared_ptr 모두 사용 가능하다.

- 반환값 : 해당 타입의 원시 포인터

- 시그니쳐 : void


operator->

- 오버로딩을 통해 원시 포인터의 -> 연산자와 같은 기능을 수행한다.


oprator*

- 오버로딩을 통해 원시 포인터의 * 연산자와 같은 기능을 수행한다.


명시적 변환


암시적 변환

매번 get() 함수를 통해 접근하는 것이 번거롭다면 암시적 변환이 가능한 자원 관리 클래스를 만들 수도 있다.

나는 명시적으로 호출 하겠다!


주의
- 암시적 변환을 허용한다면 항상 따라다니는 위험성이 존재한다.
- 개발자의 의도와 다르게 컴파일러가 형변환을 허용하여 문제가 생길 수 있다.

추천사항
- 일반적으로 명시적 형변환만 허용하는 것이 안전성이 더 높고 명확하지만,
암시적 변환을 허용하는 경우 코드가 자연스럽다.

정리

- 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에,

RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어주어야 한다.

- 자원 접근은 명시전 변환 혹은 암시적 변환을 통해 가능하다. 안정성을 따지면 명시적 변환이 대체적으로 더 낫지만,

고객 편의성을 놓고 보면 암시적 변환이 괜찮다.



728x90
반응형