방프리

17.07.14. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목15) 본문

C++/Effective C++

17.07.14. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목15)

방프리 2020. 1. 8. 18:45

항목 15 : 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자.

 

RAII방식으로 구현된 객체의 경우에 자원의 관리에 중점을 두었기 때문에 특성상 여러 군데에서

사용할 수 있어야 합니다.

또한 그 안에 있는 데이터도 접근이 가능해야 하죠. 그렇다 보니 RAII 클래스의 객체를 그 객체가 감싸고 있는

실제 자원으로 변환할 방법이 필요해집니다.

변환하는 방법은 보편적으로 명시적 변환과 암시적 변환 두 가지로 나뉘게 됩니다.

명시적 변환의 경우 get() 함수를 통해 자원의 상태를 반환하며, set() 함수를 통해 데이터의 조작을 이루어지게 합니다.

즉, 특정 함수를 통해 자원의 참조자를 얻고 얻은 데이터를 통해 조작이 이루어지게 하는 것이죠.

암시적 호출방식은 operator T()를 이용해 구현합니다. 

필자는 두 가지 방법 중 RAII 객체를 어떻게 사용하느냐에 따라 명시적으로 사용할 것인지 암시적으로

사용할 것인지 판단하여 사용하라고 하지만 대부분의 사람들은 명시적으로 사용할 것을 권장합니다.

그 이유는 이 방식을 사용함으로써 이미 객체지향 요소 중 하나인 캡슐화는 물 건너 가버렸기 때문에 데이터 조작이

어디에서 일어나는지라도 쉽게 파악할 수 있어야 디버깅이 좀 더 빨리 이루어지기 때문입니다.

 

이것만은 잊지 말자!

 

* 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는

자원을 얻을 수 있는 방법을 열어 주어야 합니다.

* 자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능합니다. 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 고객 편의성을 놓고 보면 암시적 변환이 괜찮습니다.

Comments