프로그래밍
-
19. 클래스 설계는 타입 설계와 똑같이 취급하자프로그래밍/Effective c++ 2016. 3. 10. 13:59
클래스를 설계하는 것은 새로운 타입을 정의하는 것이다. 따라서 언어 제작자가 기본 타입들을 설계할 때 들인 노력만큼이나 많은 노력을 들여서 설계해야한다.좋은 클래스는 문법이 자연스럽고, 의미구조가 직관적이며, 효율적인 구현이 한가지 이상 가능해야 한다. 클래스 설계에서 신경 써야할 부분들은 다음과 같다.1. 새로정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가- 이에 따라 생성자와 소멸자의 설게가 바뀐다.2. 객체 초기화는 객체 대입과 어떻게 달라야 하는가- 생성자와 대입 연산자의 동작 및 둘 사이의 차이점을 결정짓는 요소이다.3. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가.- 클래스의 데이터 멤버끼리의 조합이 유효해야 한다. 이를 불변속성이라한다.4. 기존..
-
18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자.프로그래밍/Effective c++ 2016. 3. 10. 13:57
사용자가 인터페이스를 사용하면서 저지를 수 있는 실수들을 방지하기 위해서는 인터페이스 설계 차원에서 잘못 쓸수 없도록 막아야 한다.방법의 예로 다음 세가지가 있다.1. 부적절한 데이터를 매개변수로 넣는 것을 방지하기 위해 새로운 타입 시스템을 만든다.ex) 날짜 데이터를 저장하는 Date 클래스가 있다고 할 때, 생성자를 Date(int month, int day, int year)로 만들기보다는 다음과 같은 데이터 타입을 만들어서 Date(Month(int m), Day(int d), Year(int y))와 같은 방식으로 생성자를 만든다.class Month{public: static Month Jan() { return Month(1); } //반드시 지정된 값으로만 넣을 수 있도록 static M..
-
-
15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자프로그래밍/Effective c++ 2016. 3. 10. 13:55
자원 관리 클래스는 좋은 방법이지만, 수많은 api들이 자원을 직접 참조하도록 만들어져있어, 스마트포인터를 넘어 실제 자원을 직접 참조해야할 경우가 더러 있다. 이럴 경우 RAII클래스를 만들 때 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어주어야하는데, 이때 두가지 방식이 있다. 1. 명시적인 변환 함수를 제공.class Font {public : FontHandle get() const { return f; } private: FontHandle f;} 다음과 같은 함수를 사용하려면void changeFontSize( FontHandle f , int newSize) ; // 폰트 API 의 일부 이와같이 get함수로 Font f를 FontHandle로 변환하여 사용.Font f(getFon..
-
14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자프로그래밍/Effective c++ 2016. 3. 10. 13:54
항목 13에서 자원을 객체가 관리하게 해주는 법에 대해 알아 보았다. 하지만 힙에 할당되지 않는 자원은 스마트 포인터로 관리하기에 적절하지 않다. 이 경우 새로운 자원 관리 클래스를 만들어야 한다.(라고 하는데 사실은 힙과 상관 없이 그냥 새로운 관리 클래스만드는 것에 대한 것인듯) 이 경우 객체가 복사 될때 어떤 방식을 취해야 할지 결정해야 하는데 보통 다음 4가지로 귀결된다. Lock π11 (&m);Lock m12 (ml1) ; 1. 복사를 금지. 객체가 복사되는 것 자체가 말이 안되는 경우가 많다. 이 경우 복사 연산을 private멤버로 지정하여 복사를 막는다. 2. 관리하고 있는 자원에 대해 참조 카운팅을 수행한다. - shared_ptr을 이용한다. shared_ptr은 참조 수가 0이 되면..
-
13. 자원 관리에는 객체가 그만!프로그래밍/Effective c++ 2016. 3. 10. 13:54
쓰지 않는 자원은 반드시 메모리 할당을 해제 해 줘야한다.그런데 이것을 사용자가 하게 하면 자원 해제를 해주지 못할 확률이 매우 높다.그래서 자원을 객체 자체가 관리하게 해주는 것이 좋은데, 이 뜻은 delete를 사용자가 하게 하지 않고, 소멸자 안에서 delete를 호출하고,소멸자는 사용자가 아니라, 객체 자체가 자신의 참조를 인식해서 자동으로 해제해 주게 한다는 뜻이다.이것을 하는 방법으로서 스마트포인터의 일종인 std의 auto_ptr과 tr1의 shared_ptr 등이 있다. 1. std::auto_ptr은 자신이 가리키는 객체의 소멸자가 자동으로 호출되게 하며, 두개의 auto_ptr이 하나의 객체를 가리킬 수 없고, auto_ptr끼리 대입하면 대입 된 auto_ptr은 자동으로 null로 ..
-