득이공간
[Effective C++] 5장. 구현 본문
해당 게시물은 프로텍 미디어의 'Effective C++'를 읽고
학습한 내용을 개인적으로 요약한 글입니다.
📌 목차 - 5장. 구현
5-1. 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자
5-2. 캐스팅은 절약, 또 절약! 잊지 말자
5-3. 내부에서 사용하는 객체에 대한 “핸들”을 반환하는 코드는 되도록 피하자
5-4. 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자!
5-5. 인라인 함수는 미주알고주알 따져서 이해해 두자
5-6. 파일 사이의 컴파일 의존성을 최대로 줄이자
📌 5-1. 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자
- 변수 정의는 늦출 수 있는 데까지 늦추자. 프로그램이 더 깔끔해지며 효율도 좋아진다.
📌 5-2. 캐스팅은 절약, 또 절약! 잊지 말자
- 다른 방법이 가능하다면 캐스팅은 피하자. 특히 수행 성능에 민감한 코드에서 dynamic_cast는 몇 번이고 다시 생각하자. 설계 중에 캐스팅이 필요해졌다면, 캐스팅을 쓰지 않는 다른 방법을 시도해 보자.
- 캐스팅이 어쩔 수 없이 필요하다면, 함수 안에 숨길 수 있도록 해 보자. 이렇게 하면 최소한 사용자는 자신의 코드에 캐스팅을 넣지 않고 이 함수를 호출할 수 있게 된다.
- 구형 스타일의 캐스트를 쓰려거든 C++ 스타일의 캐스트를 선호하자. 발견하기도 쉽고, 설계자가 어떤 역할을 의도했는지가 더 자세하게 드러난다.
📌 5-3. 내부에서 사용하는 객체에 대한 “핸들”을 반환하는 코드는 되도록 피하자
- 어떤 객체의 내부요소에 대한 핸들(참조자, 포인터, 반복자)을 반환하는 것은 되도록 피하자. 캡슐화 정도를 높이고, 상수 멤버 함수가 객체의 상수성을 유지한 채로 동작할 수 있도록 하며, 무효참조 핸들이 생기는 경우를 최소화할 수 있다.
📌 5-4. 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자!
- 예외 안정성을 갖춘 함수는 실행 중 예외가 발생되더라도 자원을 누출시키지 않으며 자료구조를 더럽힌 채로 내버려 두지 않는다. 이런 함수들이 제공할 수 있는 예외 안전성 보장은 기본적인 보장, 강력한 보장, 예외 금지 보장이 있다.
- 강력한 예외 안전성 보장은 ‘복사-후-맞바꾸기’ 방법을 써서 구현할 수 있지만, 모든 함수에 대해 강력한 보장이 실용적인 것은 아니다.
- 어떤 함수가 제공하는 예외 안전성 보장의 강도는, 그 함수가 내부적으로 호출하는 함수들이 제공하는 가장 약한 보장을 넘지 않는다.
📌 5-5. 인라인 함수는 미주알고주알 따져서 이해해 두자
- 함수 인라인은 작고, 자주 호출되는 함수에 대해서만 하는 것으로 묶어두자. 이렇게 하면 디버깅 및 라이브러리의 바이너리 업그레이드가 용이해지고, 자칫 생길 수 잇는 코드 부풀림 현상이 최소화되며, 프로그램의 속력이 더 빨라질 수 있는 여지가 최고로 많아진다.
- 함수 템플릿이 대개 헤더 파일에 들어간다는 일반적인 부분만 생각해서 이들을 inline으로 선언하면 안된다.
📌 5-6. 파일 사이의 컴파일 의존성을 최대로 줄이자
- 컴파일 의존성을 최소화하는 작업의 배경이 되는 가장 기본적인 아이디어는 ‘정의’ 대신에 ‘선언’에 의존하게 만들자는 것이다. 이 아이디어에 기반한 두 가지 접근 방법은 핸들 클래스와 인터페이스 클래스다.
- 라이브러리 헤더는 그 자체로 모든 것을 갖추어야 하며 선언부만 갖고 있는 형태여야 한다. 이 규칙은 템플릿이 쓰이거나 쓰이지 않거나 동일하게 적용하자.
'PS > C++' 카테고리의 다른 글
[Effective C++] 6장. 상속, 그리고 객체 지향 설계 (0) | 2025.03.27 |
---|---|
[Effective C++] 4장. 설계 및 선언 (0) | 2025.03.05 |
[Effective C++] 3장. 자원 관리 (0) | 2024.11.27 |
[Effective C++] 2장. 생성자, 소멸자 및 대입 연산자 (0) | 2024.11.02 |
[Effective C++] 1장. C++에 왔으면 C++의 법을 따릅시다 (1) | 2024.10.21 |