일반성을 갖춘  코드를 짤 때, 주의 해야 할 것이 무엇인지 말하고자 하는 항목이다. 사실 나는 성능에 큰 영향을 미치지 않는다면,일반성을 갖추는게 더 효과적이라고 생각을 한다. 여러가지 이유가 있지만, 가장 큰 이유는 아마도, "다른 사람이 내 코드를 보았을 때, 무리가 없는게 제일 좋기 때문" 을 들 수가 있을 것이다.


허브 셔터는 이번 장에서, 이런 일반성을 갖추고자 할 때, 주의해야 하는것을 이 끌어 내기 위해서 다음과 같은 질문을 던졌다.


1. 다음 함수들에는 미묘한 일반성 함정이 존재한다. 그것이 무엇이며 가장 좋은 해결 방법은 무엇이가?

첫번째, destory 함수를 보면, 이것은 T형 포인터를 받아서, 소멸자를 호출 하는 구조를 갖고 있다. (이렇게 소멸자를 호출하는게 위험할지 아닐지는 우선 논하지 말자.) 

두번째, destory 함수를 보면, 두개의 반복자를 받아, 내부적으로 첫번째 destory 함수를 호출하여, 처리하고 있다.

여기서 주의해야 할게 바로 첫번째 destory 함수는 포인터 만을 받는다는 것이다. 그러므로 두번째 destory 함수가 텝플릿을 사용 해도, 템플릿 이점을 갖추지 못한다. .. 그러므로 자연적으로 일반성이 사라지게 된다.

그럼 여기서 문제가 첫번째 destory 일지 두번째 destory 일지 생각하게 된다. .... 그런데 나는 무엇이 더 문제인지를 모르겠다. 단지 변경하기 쉬운쪽으로 보자면, 두번째 destory 내부에서 첫번재 destory 호출 할 때. 다음 처럼 처리 하면 좋을 것이다.

&*first 가 실패 할 때가 있는데, operator& 를 다르게 정의 했을 때 이다. .. 이 다르게 정의된 operator& 가 있는게 잘못된 설계이지 않을까? 라고 말한다.

요약하지만, 상호작용을 충분히 이해 해야 한다는 것일 수 있다.


2. 다음 함수의 의미는 무엇이며, T에 대한 요구사항들로는 어떤 것이 있을까? 그 요구사항들 중 일부 또는 전체를 제거하는 것이 가능할까? 가능하다면 어떻게 할 수 있는지 예시하고, 그렇게 하는 게 좋은 생각인지 아닌지도 논하라.

요구 조건이라면, 이 두가지가 있을 것이다. 복사 생성자와, 대입 연산자가 제공 되어야 한다는 것. 이렇게 생각했더니 책에선 50점짜리 답이라고 한다. ㅠ_ㅠ

나머지 답은 바로 예외 안전성이라는 요구조건을 만족 시켜야 한다는 것이다. 여기서, 복사 생성자에서 예외 안전성을 갖추게 한다면, 다음 조건들을 생각해야 할 것이다.

1. T::operator=은 절대 예외를 발생시키지 않는다.

2. T::operator= 가 예외를 던진 다면. 거기에 맞는 조건을 다시 생각해 봐야 할 것이다.

.. 이렇게 요구 조건을 생각해 보았다. .. 발상을 좀 더 처음으로 끌어 간다면, swap 자체를 .. 재정의 할 수가 있을 것이다. swap 이 std 함수이다 보니, std 안에 넣을 수는 없다. 객체의 멤버 변수에 swap(인수 1개) 를 정의 해 두고, 외부에서 swap( 인수 1, 인수 2) 함수에서 멤버 swap을 호출하여 처리하는 방법이 있다.

이렇게 하면, operator = 의 요구 조건을 없앨 수 있다. .. 말만 하지 말고 코드를 봐 보자.

이렇게~ . 책에선 좀더 심화해서 몇가지 이야기가 나오지만, "기본에 충실히 한다" 라는 구절만 기억한다면, 넘어가도 될 듯 싶다.


총평

.. 책 보는 량이 점점 줄어 들고 있다. .. 좀 량을 늘여야지. 요점만 말한다면, 함수의 요구 조건을 최소화 하는 것이다. 음~

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

댓글을 달아 주세요