인기 글
-
4. 설계 및 선언
항목 25: 예외를 던지지 않는 swap에 대한 지워도 생각해 보자.
swap : 예외 안전성 보장(항목 29) + 자기대입 방지(항목 11) => 중요한 만큼 구현을 잘하는 것이 중요함 어떻게 구현? => 기본적으로 표준 라이브러리에서 제공하는 swap 알고리즘을 사용한다. 보면 우리가 사용하는 것과 똑같이 구현되있음 한번 호출에 복사가 3번되는 것을 볼 수 있다. 하지만 타입에 따라서는 사본 없이 복사를 할 수 있는 경우도 있는데, 이때는 이 복사 3번이 매우 불필요할 수 있다. 대표적으로 복사하면 손해보는 타입은 다른 타입의 실제 데이터를 가르키는 포인터가 주성분인 타입들 이러한 개념을 설계로 이어나간 기법이 pimpl(pointer to implementation) 관용구(idiom) 이다. 예제를 바로 보자. ([C++] pImpl(pointer to implem..
-
1. 서론
1.3 디자인 패턴 기술하기
설계를 재사용하기 좋게 만들려면 설계를 하기까지의 다양한 결정, 대안, 장단점 등을 고려한 과정도 함께 적어주어야 합니다. -패턴 이름과 분류(Pattern Name and Classification) -의도(Intent) -다른 이름(Also Known As) -동기(Motivation) : 설계 문제를 제시하고, 패턴 안에서 클래스나 객체 구조가 어떻게 문제를 해결하는지 설명해 주는 일종의 시나리오 -활용성(Applicability) -구조(Structure) : 객체 모델링 기법(Object Modeling Technique: OMT)에 기반을 둔 표기법을 이용하여 해당 패턴에서 쓰는 클래스들을 시각적으로 나타냅니다. 또한, 객체 사이에 오가는 요청과 협력 관계의 순차를 표현하기 위해서 상호작용 다..
-
4. 설계 및 선언
항목 20: '값에 의한 전달'보다는 '상수 객체 참조자에 의한 전달' 방식을 택하는 편이 대개 낫다.
기본적으로 C++ : call by value 임 => 함수 매개변수는 실제 인자의 copy를 통해 초기화되며, 어떤 함수를 호출한 쪽은 그 함수가 반환한 값의 copy를 돌려받는다. copy => 복사 생성자로 만듬. 이 점 때문에 call by value == high cost 왜 high cost냐? 만약 Person이라는 base class를 상속받는 Student라는 dervied class가 있다고 생각했을 때, bool validateStduent(Student s); 이런 함수가 있다고 치자. 여기에 Student plato; bool platoIsStudent = validateStudent(plato); 여기서 매개변수 s를 초기화 하기 위해 s(plato) 이런식으로 Student의 ..
-
6. 상속, 그리고 객체 지향 설계
항목 39: private 상속은 심사숙고해서 구사하자
C++은 public 상속을 is-a 관계로 나타낸다.(항목 32 참고) Student가 Person으로부터 public 상속으로 파생된 형태의 클래스 계통이 주어졌다고 가정하면, 함수 호출을 성공시키기 위해 컴파일러가 Student를 Person으로 암시적 변환을 수행하는 예제를 통해 is-a 관계를 설명했었다. 이 예제를 private 상속으로 살짝 바꿔보자. private 상속은 분명 is-a 관계를 뜻하지 않는다. 그럼 뭘까? 일단 private 상속의 동작 규칙부터 알아보자. private 상속의 동작 규칙 파생 클래스 객체(Student)를 기본 클래스(Person)으로 변환하지 않는다. 기본 클래스로부터 물려받은 맴버는 파생 클래스에서 모조리 private 맴버가 된다. 즉 기본 클래스에서 ..
-
5. 구현
항목 27: 캐스팅은 절약, 또 절약! 잊지 말자
"어떤 일이 있어도 type error가 생기지 않도록 보장한다" => C++의 동작 규칙이다. 즉, 이론적으로는 컴파일만 잘 되면, 그 이후엔 어떤 객체에 대해서도 불완전한 연산, 말도 안되는 연산 등을 수행하지 않는다는 것이다. 하지만!!! cast 시스템 때문에, 이런 보장이 깨질 수 도 있다.. C++에서 cast는 항상 조심 또 조심 해야한다. 일단 C++에서 제공하는 casting 문법부터 정리하면 (T) expression T(expression) 여기까지가 구형 캐스트 이다. const_cast(expression) dynamic_cast(expression) reinterpret_cast(expression) static_cast(expression) 이 4개는 C++에서 독자적으로 제공..