클래스에 있어, 그 클래스 타입에 대한 복사가 이루어 질 경우가 반드시 있게 된다. 이런 복사는 초기에 생선자 호출에서 갖었던 모든 위험성을 다시 한번 더 반복해야 하는 비용을 물어야 한다. 이것은 클래스 설계에 있어 심한 문제 중에 한가지 이다.

이번 항목은 어떠한 클래스라도 복사 할당자(복사 할당 연산자)를 보다 더 견고하게 설계하는 방법을 찾아 가 본다. 이미 이 방법을 아는 사람이 많으므로 자세히 설명하기 보단 요점만 짚고 넘어 가는게 좋겠다.


질문 1

예외 안전성의 일반적인 세 가지 레벨에 대해서 설명하라


질문 2

예외 안전성이 높은 복사 할당자의 표준적인 형태는 무엇인가?


질문 3

다음 클래스에서 T1 이나 T2 연산 중 아무거나 예외를 발생시킬 수 있다면, 이 클래스의 구조를 바꾸지 않고, 복사 할당자를 작성할 수 있는가?


질문 4

어떠한 클래스라도 복사 할당자가 높은 예외 안전성을 제공할 수 있는 간단한 변환 작업을 설명하고 작성하라, 또한 이 변환 작업이 어디에 사용 되었는지 본적이 있는가?


해설

질문 1

일전에 정리했던 http://ikpil.tistory.com/467 참조


질문 2.

임시 객체 생성하여 거기에 작업하고, 그 내용과 본래에 작업해야 할 객체와 교체한다. 

http://ikpil.tistory.com/693 : 간결한 복사 할당자 참조 


질문 3.

T1 과 T2 객체가 예외에 안전하지 않는 이상 .. 불가능하다. ... 왜냐하면 복사 할당을 하려 해도 T1 과 T2에서 예외가 발생하면, 포장한 Widget 역시 예외에 안전하지 못하기 때문이다.


질문 4.

pimpl 이디엄을 사용하면 되는데, http://ikpil.tistory.com/709 차례에서, 26 ~ 30항목에 걸쳐 설명하고 있다. 또한 이것은 http://ikpil.tistory.com/709 차례의 12 항목에서 어떻게 사용하는지 설명되고, 이것으로 얻을 수 있는 장점을 볼 수 있을 것이다.


총평

저번 항목과 많이 중첩되는 것으로 보아 그 만큼 중요하다고 강조 하는것 같다. 다시 요점을 정리 하자면, 기본 연산은 완벽하게 예외에 안전하다. 이 때, 객체의 전체적인 값이 한개의 포인터로 바뀔수 있다면, 복사 하는것 자체가 완벽한 예외 안전성을 제공하는것과 같다.

그래서 클래스의 멤버들을 전부 한개의 포인터로 관련 짖고, 이 포인터만을 바꾸어 버리면, 객체가 다른 객체로 매우 빠르고 완벽하게 바뀌게 된다. 그래서 pimpl 이디엄이 그 대안으로 써 먹히는 것이다.

물론 pimpl 로 묶은것 에서도 객체를 담고 있다면, 별도로 정의해 줘야 한다. 사용 방법은 링크타고 들어가면 자세히 나오듯이

1. 임시객체를 만든다.

2. 임시객체에 작업 한다.

3. 본래 객체와 임시객체를 예외에 안전하게 교체 한다.

.. 이것은 copy-to-swap 인데, 프로그래밍 전반에 걸치 매우 빈번히 생각되어야 할 주제이며, 사용되는 주제이다. 그러므로 익히고 넘어가는것이 좀 편하다.



posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요