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에 대한 핸들을 계속해서 갖고있기 때문에 '무효참조 핸들' 이 되어버린다.
결국 내부에서 사용되는 객체/변수 의 핸들을 반환하는 것 자체가 값 변경 여부를 떠나, 지양해야 할 행동임을 인지하고 캡슐화 정도를 높여야 하며, 객체의 상수성을 유지한 채 동작할 수 있도록 함으로써 무효참조 핸들이 발생하는 일이 없도록 해야 될 것이다.
'C++' 카테고리의 다른 글
[C++/STL] vector의 크기, length 를 구하는 방법 (0) | 2021.11.29 |
---|---|
C++ 에서 구조체를 초기화 하는 여러가지 방법 (0) | 2021.07.29 |
[Effective C++] 상속받은 비가상 함수를 파생클래스에서 재정의 하지 말자 (0) | 2021.06.11 |
[Effective C++] public 상속 모형은 반드시 "is-a" 를 따른다. (0) | 2021.06.05 |
[Effective C++] 변수의 정의는 최대한 늦추자 (0) | 2021.06.01 |