예제코드

이  코드는 StackImpl 코드의 /* ? ? ? ? */ 주석문이 protected를 나타낸다고 생각해 볼 때, private 기반 클래스로 StackImpl 을 사용하여 StackImple에 관한 구현이 되는 Stack 버전의 모든 멤버 함수를 구현한 코드이다.


Stack 의 멤버 함수들을 예외에 안전하고, 예외에 중립적으로 만들어 보자.


분석

기본 생성자 부터 보도록 하자.

초기 기본생성자의 호출로써 스택데이터의 초기 데이터를 생성 및 초기화를 해 주고 있다. 이것은 예외에 안전하다는 것인데, 왜냐하면, StackImpl 생성자 호출 시 예외가 발생 되더라도, Stack에 아무 영향도 주지 않기 때문이다. 이것은 항목 8에 자세히 나와 있다.

코드


소멸자

private 기반 상속으로 인하여 소멸자에서 별다른 작업을 하지 않아도 되는 장점을 지니게 된다. 물론 소멸자에선 어떠한 예외도 발생시키지 말아야 한다는 룰은 알고 있어야 할 듯 하다.


복사 생성자

Stack의 복사 생성자는 StackImpl 복사 생성자를 호출하지 않는다. 왜냐하면, StackImpl 에서 복사 생성자를 private 를 두었기 때문에, 내가 여기서 궁금해 하는것은 StackImpl 의 복사 생성자를 호출하여, StackImpl의 값을 생성하는 로직으로 하는것과 무엇이 차이가 있냐는 것 이다.

코드

여기서 construct 함수는 매개변수1 위치에 other.v_[vused]객체를 생성한다. 생성 할 때 placement new 를 사용 한다. 이것의 장점으으로는 각각 청소하는 코드를 포함하지 않고, 원하는 만큼 생성 할 수 있다는 것이다.( 그러니까 왜! 복사 생성자를 StackImpl 에서 구현을 막은거지...? )


간결한 복사 할당

이 기법은 무수히 봐왔기 때문에 생각한다. 자기 복사 대입에 대해서 완벽하고 심플하게 자체하는 기술이다.


나머지 멤버 변수들은 다 적기가 좀 귀찮다. 내용을 요약하자면, 임시개체 생성을 하고, 그것을 통해 작업 한 뒤에 교체해버리면, 예외에 안전하다는 것이다. 이것은 임시개체에 작업을 함으로써, 자신의 자료에 대해서 안전성을 확보해 두고, 다 끝나면, 예외에 안전한 swap 만을 호출하여, 교체해야 한다는 내용이다.


총평

간만에 봐서 그런지, 어리둥절했다. 마지막의 내용에서 예전 기억이 떠올랐다. 임시객체 가지고 작업하고 성능좋게 swap 시켜 버리는게 제일 이라는 것..


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기