프로그래밍 기초
-
[Effective C++] new와 delete를 내 맘대로프로그래밍 기초/C++ 2022. 8. 30. 07:20
new와 delete를 내 맘대로 new 처리자의 동작 원리를 제대로 이해하자예외 발생 시 호출되는 함수 C++에는 예외 발생 시 사용자의 함수를 호출해주는 예외 지정이라는 기능이 존재한다.void outOfMem(){ std::cerr std::abort();}int main(){ std::set_new_handler(outOfMem);} 이러한 함수를 구현할 때는 다음 중 하나의 동작이 반드시 이뤄져야 한다.사용할 수 있는 메모리를 더 많이 확보한다.다른 new 처리자를 설치한다.new 처리자의 설치를 제거한다.예외를 던진다.복귀하지 않고 프로그램을 종료한다. new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자new, delete를 바꾸는 이유일반적으로 다음과 같..
-
[Effective C++] 템플릿과 일반화 프로그래밍프로그래밍 기초/C++ 2022. 8. 25. 08:05
템플릿과 일반화 프로그래밍 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 명시적 인터페이스와 암시적 인터페이스 기본적으로 소스 코드에서 명시되어 있는 인터페이스를 명시적 인터페이스라고 하고 표현식에서 지원해야 하는 인터페이스를 암시적 인터페이스라고 한다. 다음 코드에서 명시적 인터페이스와 암시적 인터페이스의 예를 확인할 수 있다. template void doProcessing(T& w) { // T는 operator.!=로 someNastyWidget과 비교할 수 있는 연산을 암시적으로 지원하고 // "w.size() > 10 && w != someNastyWidget"의 결과가 bool 이라는 것을 암시적으로 지원한다. if (w.size() > 10 && w != someN..
-
[Effective C++] 상속, 그리고 객체 지향 설계프로그래밍 기초/C++ 2022. 8. 10. 10:56
상속, 그리고 객체 지향 설계 public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자 public 상속의 is-a 관계 모든 사람은 학생이 아니지만 학생은 사람이다. 이 것의 관계가 public 상속이라고 할 수 있다. 이를 코드로 만들면 다음과 같다. class Person { ... void eat() { ... } }; class Student : public Person { ... void study() { ... } }; 사람의 일종인 학생은 사람이 할 수 있는 모든 것을 하지만 모든 사람이 공부하지는 않는다. 그런데 이러한 설계가 잘못되면 문제가 생길 수 있다. 모든 새는 난다고 가정해서 Bird 클래스에 fly 함수를 만들었다면 날지 못하는 새인 펭귄은 B..
-
[Effective C++] 구현프로그래밍 기초/C++ 2022. 7. 27. 07:28
구현 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 변수 사용 비용과 문제가 되는 부분 객체는 생성될 때와 범위를 벗어나 소멸될 때 각각 생성자와 소멸자를 호출하는 비용이 고정적으로 발생한다. 따라서 다음과 같은 경우에는 사용하지도 않을 객체의 생성, 소멸 비용을 지불하고 있게 된다. std::string encryptPassword(const std::string& password) { using namespace std; string encrypted; // encrypted를 사용하기도 전에 함수를 벗어날 가능성이 존재한다. if (password.length() < MinimumPasswordLength) { throw logic_error("Pssword is too short"); ..
-
[Effective C++] 설계 및 선언프로그래밍 기초/C++ 2022. 7. 13. 07:51
설계 및 선언 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 새로운 타입을 만들어 실수 막기 인터페이스에서 요구하는 특정한 타입이 존재하는 경우 사용자가 실수하더라도 쉽게 그 실수를 인지할 수 있게 된다. class Date { public: Date(int month, int day, int year); // 단순히 int를 사용하는 경우 }; Date(13, 2, 2022); // 입력 순서를 틀리거나 Date(2, 40, 2022); // 존재하지 않는 값을 넘기게 될 수 있다. 위와 같은 경우를 다음과 같이 년, 월, 일을 나타내는 타입을 도입하면 막을 수 있게 된다. struct Day; struct Month; struct Year; class Date { public: ..
-
[Effective C++] 자원관리프로그래밍 기초/C++ 2022. 6. 17. 07:30
자원관리 자원 관리에는 객체가 그만! 자원을 안전하게 사용할 수 있는 조건 자원 관리를 수동으로 하게 되면 예상하지 못한 시점에 함수가 반환되거나 예외가 발생하는 경우 처리가 어려워지게 된다. 이 것을 막기 위해 자원을 특정 객체에 넘기고 객체가 소멸될 때 자원을 삭제하도록 하면 안전하게 처리가 가능하다. 이 자원 관리 객체는 다음의 조건을 만족해야 한다. 자원을 획득한 후에 자원 관리 객체에게 넘긴다. 자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실하게 해제되도록 한다. 자원 관리 객체의 예와 주의 사항 대표적인 자원 관리 객체에는 스마트 포인터가 있다. 그런데 스마트 포인터는 객체의 제거 시 delete를 사용하기 때문에 배열을 동적 생성했을 때 안전하게 삭제해 줄 수 없다. 이러한 이유는 대..
-
[Effective C++] 생성자, 소멸자 및 대입 연산자프로그래밍 기초/C++ 2022. 6. 11. 14:46
생성자, 소멸자 및 대입 연산자 C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 기본적으로 생성되는 멤버 함수 개발자가 따로 생성하지 않으면 컴파일러에서 기본적인 모양으로 만드는 멤버 함수들이 존재한다. 생성자 인자가 없는 기본 생성자를 생성한다. 소멸자 아무 기능 없는 소멸자를 생성한다. 복사 생성자 복사가 가능한 경우 복사 생성자를 생성한다. 멤버가 참조형이거나 상수인 경우 복사가 불가능하다. 복사 대입 연산자 기본 클래스에서 복사 대입 연산자를 private으로 하지 않은 경우 복사 대입 연산자를 생성한다. ※ 복사 생성자와 복사 대입 연산자의 경우 생성이 불가능할 경우 컴파일 에러가 발생한다. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 private으로..
-
[Effective C++] C++에 왔으면 C++의 법을 따릅시다프로그래밍 기초/C++ 2022. 6. 1. 10:31
C++에 왔으면 C++의 법을 따릅시다 #define을 쓰려거든 const, enum, inline을 떠올리자 클래스 범위에 상수 정의 클래스 범위에만 상수를 적용할 때는 정적(static) 멤버로 만드는 게 좋다. 이때, 헤더(.h 파일)에는 선언만 존재해야 하고 정의는 구현(.cpp 파일)에 들어가야 한다. ※ 클래스 컴파일 시 상수 값이 필요한 경우는 예외로 둔다. // CostEstimate.h class CostEstimate { static const double FudgeFactor; } // CostEstimate.cpp const double CostEstimate::FudgeFactor = 1.35; 나열자 둔갑술(enum hack) 클래스 컴파일 시 상수 값이 필요한 경우 상수 대신 ..