swap 함수는 무엇일까?
.. 뭐 다들 알겠고, 중요한건 이 함수를 이용하여, "교체" 를 할수 있다는것이다.
왜 이 함수가 중요한것인가?
STL에 이 함수가 포함된 이래, 예외 안전성 프로그래밍에선 없어선 안 될 감초 역활로써, 자기 대입 현상의 가능성에 대처하기 위한 대표적인 매커니즘으로서 널리 사랑받아 왔다다고 저자는 설명한다;
이쁘면 얼굴값 한다고, 이 swap 함수에도 말들이 많다. 그것은 바로 효율 때문이다. 기본적으로 복사하는데에 대한 비용은 지불해야 겠지만, 지불하지 않아도 되는 경우가 있기 때문인데, 그것이 바로 다른 타입의 실제 데이터를 가리키는 포인터가 주성분인 타입의 객체(pimpl(pointer to implementation))의 swap 이다!
어떻게 하면, 이런 객체 전용의 swap 함수를 만들수 있을까?
쉽게 간다면, std에 그 객체에 대한 전용 함수를 정의 하는 방법이 있겠지만, 이 방법은 ... 절대로 하지 말라고 저자는 강요하고 있다.
그렇다면 어떻게 객체의 swap 전용 함수를 만들수 있을까?
1. 표준에서 제공하는 swap이 우리의 클래스 및 클래스 템플릿에 대해 납득할 만한 효율을 보인다면, 아무것도 하지 말라.
2. 표쥰 swap의 효율이 기대한 만큼 충분하지 않다면, 다음과 같이 해라.
2-1 객체의 맴버 함수에 swap 이라는 이름을 만들고, 이 것을 public 멤버 함수로 두며, 예외를 던지지 말라.
2-2 우리가 정의한 클래스 및 템플릿이 들어 있는 네임스페이스와 같은 네임스페이스에 비멤버 swap을 만들어 넣고, 멤버 함수의 swap 함수를 호출 하여 처리 하도록 한다.
2-3 새로운 클래스를 만들고 있다면, 그 클래스에 대한 std::swap의 특수화 버전을 준비해두고, 이것도 swap 멤버 함수를 호출하도록 만든다.
3. 사용자 입장에서 swap을 호출할 때, swap을 호출하는 함수가 std::swap을 볼 수 있도록 using 선언을 반드시 포함시킨다. 그 다음에 swap을 호출하되 네임스페이스 한정자를 붙이지 않도록 해라.
이 함수를 만들때 주의해야 할점은 무엇인가?
swap을 진짜 쓸모 있게 응용하는 방법들 중에 클래스가 강력한 예외 안전성 보장을 제공하도록 도움을 주는 방법이 있기 때문인데, 그 전제로 swap이 예외를 던지지 않아야 한다는 가정을 깔고 있다. <=- 왜 이런지 이해가 되지 않는다;
이것만은 잊지 말자!
1. std::swap()이 여러분의 타입에 대해 느리게 동작할 여지가 있따면 swap 멤버 함수를 제공하고, 예외를 던지지 않도록 만든다.
2. 멤버 swap을 제공했으면, 이 멤버를 호출하는 비멤버 swap도 제공한다. 클래스에 대해서는 std::swap도 특수화해 둔다.
3. 사용자 입장에서 swap을 호출할 때는, std::swap에 대한 using 선언을 넣어 준후에 네임스페이스 한정 없이 swap을 호출한다.
4. 사용자 정의 타입에 대한 std 템플릿을 완전 특수화하는 것은 가능하다. 그러나 std에 어떤 것이라도 새로 추가하려고 들지 말자.
관련링크 - swap에 대한 속도에 대해서는 이 링크를 보면서 자신에게 맞는 것을 선택 하는것이 좋을듯 싶다.
http://jangyeol.springnote.com/pages/348598
http://madchick.tistory.com/16
http://cakel.tistory.com/entry/%EC%84%9C%EB%A1%9C-%EB%8B%A4%EB%A5%B8-SWAP-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-3%EA%B0%80%EC%A7%80
.. 뭐 다들 알겠고, 중요한건 이 함수를 이용하여, "교체" 를 할수 있다는것이다.
왜 이 함수가 중요한것인가?
STL에 이 함수가 포함된 이래, 예외 안전성 프로그래밍에선 없어선 안 될 감초 역활로써, 자기 대입 현상의 가능성에 대처하기 위한 대표적인 매커니즘으로서 널리 사랑받아 왔다다고 저자는 설명한다;
이쁘면 얼굴값 한다고, 이 swap 함수에도 말들이 많다. 그것은 바로 효율 때문이다. 기본적으로 복사하는데에 대한 비용은 지불해야 겠지만, 지불하지 않아도 되는 경우가 있기 때문인데, 그것이 바로 다른 타입의 실제 데이터를 가리키는 포인터가 주성분인 타입의 객체(pimpl(pointer to implementation))의 swap 이다!
어떻게 하면, 이런 객체 전용의 swap 함수를 만들수 있을까?
쉽게 간다면, std에 그 객체에 대한 전용 함수를 정의 하는 방법이 있겠지만, 이 방법은 ... 절대로 하지 말라고 저자는 강요하고 있다.
그렇다면 어떻게 객체의 swap 전용 함수를 만들수 있을까?
1. 표준에서 제공하는 swap이 우리의 클래스 및 클래스 템플릿에 대해 납득할 만한 효율을 보인다면, 아무것도 하지 말라.
2. 표쥰 swap의 효율이 기대한 만큼 충분하지 않다면, 다음과 같이 해라.
2-1 객체의 맴버 함수에 swap 이라는 이름을 만들고, 이 것을 public 멤버 함수로 두며, 예외를 던지지 말라.
2-2 우리가 정의한 클래스 및 템플릿이 들어 있는 네임스페이스와 같은 네임스페이스에 비멤버 swap을 만들어 넣고, 멤버 함수의 swap 함수를 호출 하여 처리 하도록 한다.
2-3 새로운 클래스를 만들고 있다면, 그 클래스에 대한 std::swap의 특수화 버전을 준비해두고, 이것도 swap 멤버 함수를 호출하도록 만든다.
3. 사용자 입장에서 swap을 호출할 때, swap을 호출하는 함수가 std::swap을 볼 수 있도록 using 선언을 반드시 포함시킨다. 그 다음에 swap을 호출하되 네임스페이스 한정자를 붙이지 않도록 해라.
이 함수를 만들때 주의해야 할점은 무엇인가?
swap을 진짜 쓸모 있게 응용하는 방법들 중에 클래스가 강력한 예외 안전성 보장을 제공하도록 도움을 주는 방법이 있기 때문인데, 그 전제로 swap이 예외를 던지지 않아야 한다는 가정을 깔고 있다. <=- 왜 이런지 이해가 되지 않는다;
이것만은 잊지 말자!
1. std::swap()이 여러분의 타입에 대해 느리게 동작할 여지가 있따면 swap 멤버 함수를 제공하고, 예외를 던지지 않도록 만든다.
2. 멤버 swap을 제공했으면, 이 멤버를 호출하는 비멤버 swap도 제공한다. 클래스에 대해서는 std::swap도 특수화해 둔다.
3. 사용자 입장에서 swap을 호출할 때는, std::swap에 대한 using 선언을 넣어 준후에 네임스페이스 한정 없이 swap을 호출한다.
4. 사용자 정의 타입에 대한 std 템플릿을 완전 특수화하는 것은 가능하다. 그러나 std에 어떤 것이라도 새로 추가하려고 들지 말자.
관련링크 - swap에 대한 속도에 대해서는 이 링크를 보면서 자신에게 맞는 것을 선택 하는것이 좋을듯 싶다.
http://jangyeol.springnote.com/pages/348598
http://madchick.tistory.com/16
http://cakel.tistory.com/entry/%EC%84%9C%EB%A1%9C-%EB%8B%A4%EB%A5%B8-SWAP-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-3%EA%B0%80%EC%A7%80
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
항목 30: 인라인 함수는 미주알고주알 따져서 이해해 두자 (0) | 2008.07.01 |
---|---|
항목 29: 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! (0) | 2008.07.01 |
항목 28: 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자. (0) | 2008.06.28 |
항목 27: 캐스팅은 절약, 또 절약! 잊지 말자. (0) | 2008.06.26 |
항목 26: 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자. (0) | 2008.06.25 |
항목 24: 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멘버 함수를 선언하자 (0) | 2008.06.15 |
항목 23: 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자. (0) | 2008.06.07 |
항목 22: 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 (0) | 2008.06.07 |
항목 21: 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자. (0) | 2008.06.07 |
항목 20: '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달'방식을 택하는 편이 대개 낫다. (0) | 2008.06.06 |
최근댓글