본문 바로가기
C++

[Effective C++] 내부에서 사용하는 객체에 대한 핸들은 반환하지 말자

by Warehaus 2021. 6. 2.

C++ 에서 객체를 다룰 때 내부에서 private으로 선언 된 멤버변수에 대한 핸들을 밖으로 반환하지 않는 것이 좋다.

코드를 보면 이런 동작이 왜 위험한 지 이해하기 쉬울 것이다.

class Apple
{
private:
    int brix;
public :
	void setBrix(int v); // brix 값을 설정한다.
    const int& getBrix(); // brix 수정을 막기위해 const 로 선언한다.
}

위의 코드를 보면 getBrix 멤버함수를 통해 Apple의 brix 값을 밖으로 가져올 수 있게된다. 그런데 여기서 문제는 가져오는 값이 복사 값이 아니라 참조자라는 것이다.

참조자를 반환하기 때문에 사실 상 Apple에서 getBrix를 호출한다는 것은 밖에서 brix 에 접근이 가능하게 되므로 private 성질을 유지하지 못하게 된다.

외부에서 참조자를 통한 수정을 막기 위해서 const를 붙임으로써 밖에서 참조자를 통한 값 수정을 막을 수는 있지만, 다른 문제가 또 있다.

Apple* a = new Apple();
a->setBrix(10);

auto b = a->getBrix();

delete a;

cout << b << endl; // ???

Apple을 생성해서 brix값을 설정하고 b는 a 의 brix 참조자를 가지고 있다. 그런데 a 객체가 사라지게 되는 경우에 b는 brix에 대한 핸들을 계속해서 갖고있기 때문에 '무효참조 핸들' 이 되어버린다.

결국 내부에서 사용되는 객체/변수 의 핸들을 반환하는 것 자체가 값 변경 여부를 떠나, 지양해야 할 행동임을 인지하고 캡슐화 정도를 높여야 하며, 객체의 상수성을 유지한 채 동작할 수 있도록 함으로써 무효참조 핸들이 발생하는 일이 없도록 해야 될 것이다.