-
Effective C++...26일지 2022. 7. 18. 08:59
내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자
함수의 반환형에 의해 캡슐화 변동
기본적으로 멤버 변수를 private으로 선언했다고 하더라도 public함수가 해당 멤버 변수를 참조형 또는 포인터로 반환한다면 이 멤버 변수는 public으로 봐야 한다.
즉, 객체의 내부 요소는 함수의 핸들 반환 시에도 캡슐화의 정도가 달라지게 된다.
다음과 같이 사각형을 나타내는 클래스가 있을 때 사용자가 사각형의 정보를 볼 수 있게 하기 위해 참조형을 반환한다면 반환된 값을 통해 수정될 수 있는 위험이 있다.
struct RectData {
Point ulhc;
Point lrhc;
};
class Rectangle {
...
private:
std::tr1::shared_ptr<RectData> pData;
public:
Point& upperLeft() const { return pData->ulhc; }
Point& lowerRight() const { return pData->lrhc; }
};
※ 어떤 값을 읽기 전용으로 반환하고 싶으면 const를 붙이는 것을 잊지 말자.
핸들 반환 시 무효 참조 핸들이 되는 문제
반환된 핸들을 사용하려고 할 때 해당 핸들의 원본이 제거되어 있을 수 있다.
이 것은 const를 붙이든 붙이지 않든 동일하게 발생하는데, 반환된 핸들을 저장해 두고 사용하기 전에 객체 내부에서 해당 핸들이 참조하는 값이 제거되었을 때 외부에서는 손 쓸 방법이 없다.
따라서 핸들을 외부로 반환하는 것은 굉장히 조심스럽게 접근해야 한다.