전체 글
-
[Effective C++] 20. 매개변수는 상수 객체 참조자를 선호하자C++/Effective C++ 2026. 2. 12. 11:25
원제목 : Prefer pass-by-reference-to-const to pass-by-value ('값에 의한 전달'보다는 '상수객체 참조자에 의한 전달'방식을 택하는 편이 대개 낫다) 함수에 매개변수가 전달될 때 사용할 수 있는 방법은 크게 두 가지 입니다.값에 의한 전달과, 참조에 의한 전달이 그것으로, 상황에 따라 적절한 방법을 선택해야 합니다.하지만 대부분의 경우에는 참조에 의한 전달을 택하는 편이 좋습니다. 이번 글에서는 함수에 객체를 전달할 때, 참조에 의한 전달을 선택하는 것이 좋은 이유들을 살펴보도록 하겠습니다. 1. 효율 문제 더보기예제로 사용할 클래스와 함수를 살펴보도록 하겠습니다.// Classclass Person{public: Person(); virtual ~Perso..
-
[Effective C++] 19. 클래스 설계는 타입 설계와 똑같이 취급하자C++/Effective C++ 2026. 2. 11. 15:40
원제목 : Treat class design as type design (클래스 설계는 타입 설계와 똑같이 취급하자) 클래스를 설계하면서 하는 일은 함수와 연산자의 오버로드, 메모리 할당 및 해제, 객체의 초기화와 소멸처리 등이 있습니다.좋은 클래스를 설계한다는 것은 사용 문법이 자연스럽고, 구조가 직관적이며, 효율적이어야 합니다.그리고 이것들은 기본 제공 타입이 설계될 때 고려되고 수행되는 일과 동일합니다. 이번 글에서는 클래스를 설계할 때 생각해야 할 고려사항들을 알아보도록 하겠습니다. 1. 생성 및 소멸은 어떻게 이루어지나요? 객체의 생명주기에 관해 고민해야 합니다. 생성 시 파일 IO를 이용하거나, 팩토리 함수를 호출하거나, 어느 메모리 공간을 이용할지 결정해야 합니다.소멸 시에는 어떤 데이터를..
-
[Effective C++] 18. 인터페이스는 잘 쓰기 쉽게, 못 쓰기 어렵게 만들자C++/Effective C++ 2026. 2. 4. 15:34
원제목 : Make interfaces easy to use correctly and hard to use incorrectly (인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자) 인터페이스는 함수, 클래스, 템플릿 등 사용자와 개발자를 이어주는 모든 것을 의미합니다.이 인터페이스를 어떻게 설계하여 어떻게 사용되도록 하는지에 따라, 사용자 측에서의 안정성이 달라집니다. 이번 글에서는 인터페이스 설계 시 고려해야 할 구체적인 예시들을 몇 가지 살펴보도록 하겠습니다. 1. 구체적인 데이터 타입 명시하기 더보기날짜를 나타내는 클래스를 가정해보겠습니다.class Date{public: Date(int month, int day, int year); ...};이 클래스는 다음과 같이 잘못..
-
[Effective C++] 17. new와 스마트 포인터와 메모리 누수C++/Effective C++ 2026. 1. 27. 14:04
원제목 : Store newed objects in smart pointers in standalone statements (new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자) 객체를 스마트 포인터로 래핑하는 코드는 다음과 같습니다.shared_ptr sPtr(new Widget);더 적절한 방법이 있지만 이는 후술하도록 하겠습니다.비슷한 용례로 다음과 같은 함수 원형과 호출 방법을 생각해볼 수 있습니다.// Functionint priority();void processWidget(shared_ptr pw, int priority);// CallprocessWidget(shared_ptr(new Widget), priority());이번 글에서 다룰 내용은 위와 같이 함..
-
[Effective C++] 16. new와 delete의 짝맞추기C++/Effective C++ 2026. 1. 26. 16:43
원제목 : Use the same form in corresponding uses of new and delete (new 및 delete를 사용할 때는 형태를 반드시 맞추자) new와 delete는 동적 객체를 할당, 해제하는 연산자입니다.이 연산자는 단일 객체에 적용할 수도, []를 사용해 배열에 사용할 수도 있습니다.이와 같이 두 가지의 사용법이 있기 때문에, 경우에 따라 알맞는 연산자를 사용해야 합니다. 이번 글에서는 new와 delete 연산자의 배열 사용에 대해 살펴보겠습니다. 0. 문제 상황 우선 코드를 보겠습니다.string *stringArray = new string[100];...delete stringArray;new는 []를 사용해 배열로 할당했지만, delete는 []를 사용하..
-
[Effective C++] 15. 자원 관리 클래스의 캡슐화C++/Effective C++ 2026. 1. 22. 16:11
원제목 : Provide access to raw resources in resource-managing classes (자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자) 자원 관리 클래스는 이름 그대로 자원을 관리하는 클래스입니다.이는 해당 자원을 사용하는 측에서만 필요한 행동이기 때문에, 외부의 특정 기능을 이용할 때에는 자원 관리 클래스 내부의 자원에 직접 접근해야 할 수 있습니다.// Resource managingclass MyResource { ... };shared_ptr sPrt(...);// Use librariesvoid DoSomething(const MyResource* res) { ... }DoSomething(sPtr); // Error!이와 같은 상황입니다..
-
[Effective C++] 14. 자원 관리 클래스의 복사 동작C++/Effective C++ 2026. 1. 14. 16:45
원제목 : Think carefully about copying behavior in resource-managing classes (자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자) 이전 글([Effective C++] 13.객체를 통해 자원을 관리하는 방법) 에서 RAII 클래스에 대해 알아보았습니다.힙 객체를 포함한 여러 종류의 자원들을 그들을 감싸는 스택 객체를 통해 관리하자는 내용이었습니다. 이번 글에서는 이와 같은 스택 객체 (이하 RAII객체)가 복사될 때, 내부의 자원을 어떻게 처리해야 하는지에 대해 살펴보도록 하겠습니다. 1. 복사를 금지하기 더보기더보기의미론적으로, 특정 자원에 대한 복사는 의미가 없는 경우가 많습니다.내부의 자원이 복사되는 것이 무의미하므로, 이것을 관리하는 ..
-
[Effective C++] 13. 객체를 통해 자원을 관리하는 방법C++/Effective C++ 2026. 1. 14. 16:17
원제목 : Use objects to manage resources (자원 관리에는 객체가 그만!) 자원이란 사용 후 시스템에 돌려주어야 하는 모든 것을 의미합니다.기본적으로 동적 할당된 메모리를 들 수 있지만, 그 외에도 뮤택스, 파일 서술자, DB 커넥터, 네트워크 소켓 등도 자원에 해당합니다.이들 자원은 획득하는 것보다 반환하는 것이 더 중요합니다. 이번 글에서는 객체를 통해 자원을 관리하는 경우를 살펴보도록 하겠습니다. 0. 객체를 사용하지 않으면? 사용자 지정 클래스 하나, 그리고 그 객체를 생성하는 팩토리 함수를 가정하도록 하겠습니다.class Investment { ... };Investment* createInvestment();팩토리 함수는 객체를 동적 할당하고, 그 객체의 포인터를 반..