전체 글

초보 개발자의 공부 기록
C++/Effective C++

[Effective C++] Chapter 6: Inheritance and Object-Oriented Design(1)

Item 32 : Make sure public inheritance models "is-a" Object-Oriented programming의 가장 중요한 규칙은 public inheritance가 "is-a"를 의미한다는 것이다. 만약 Base class를 public으로 상속하는 Derived class가 있다고 가정하자. 모든 Derived class type의 객체는 Base class type의 객체가 되지만, 반대는 틀리다. Base class는 Derived class보다 더 일반적인 개념을, Derived class는 Base class보다 더 specialized된 개념을 ㅍ현한다. 객체의 타입이 Base class인 객체가 사용되는 어떤 곳이든 Derived class 타입의 객체를..

C++/Effective C++

[Effective C++] Chapter 5: Implementations(2)

Item 29 : Strive for exception-safe code 아래의 코드를 살펴보자. void PrettyMenu::ChangeBackground(std::istream& imgSrc) { lock(&mutex); delete dbImage; ++ImageChanges; bgImage = new Image(imgSrc); unlock(&mutex); } 예외 안전성의 측면에서, 이 함수는 나쁘다. 예외가 발생한 경우, exception safe 함수는 다음과 같은 사항을 만족해야 한다. 1. Leak no resources 위 함수는 new Image(imgSrc)에서 예외가 발생하면, unclock함수가 절대 호출되지 않는다. 따라서 nutex를 영원히 가지게 된다. 2. Don't all..

C++/Effective C++

[Effective C++] Chapter 5: Implementations(1)

Item 26 : Postpone variable definitions as long as possible 변수의 정의를 변수를 바로 사용해야할 때 직전에 해야할 뿐만 아니라, 변수를 위한 초기화 값을 가지기 전까지 변수 정의를 연기해야 한다. 이렇게 함으로써, 불필요한 객체에 대한 생성자와 소멸자가 호출되는 것을 피하고, 의미가 명확한 상황에서 변수를 초기화하여 변수의 목적을 문서화하는데 도움이 된다. loop를 사용하는 경우, 변수를 loop문 안에 정의하거나, 밖에 정의할 수 있다. 할당이 생성자-소멸자보다 비용이 적고, 코드의 성능에 민감한 부분을 처리하지 않는 한 기본적으로 변수를 안에 정의해야한다. Item 27 : Minimize casting 캐스팅은 type system을 파괴하며 모든 ..

C++/Effective C++

[Effective C++] Chapter 4: Design and Declarations(2)

Item 22 : Declare data members private 왜 data member가 public이어야 하는가? 1. syntax consistency 만약 멤버 데이터가 public이 아니라면, 클라이언트에 객체에 접근할 수 있는 유일한 방법은 멤버 함수 뿐이다. 모든 public interface가 function이면, 모든 것이 함수이기 때문에 클라이언트는 자연스럽게 함수를 사용할 수 있다. 2. access control 멤버 데이터가 public이 아니라면, 멤버 데이터에 대한 접근 권한이 없는 경우, 읽기 전용, 읽고 쓰기 가능 등 다양한 접근 권한에 대한 구현이 가능하다. 그러나 멤버 데이터가 public이면, 모든 멤버 데이터를 읽고 쓸 수 있다. 모든 데이터 멤버가 hidden..

Information

[Unreal & Perforce] 아마존 AWS EC2를 사용한 언리얼 퍼포스 연동(Windows)

Unreal에서 협업을 할 때 Perforce를 사용하면 편하다. 팀원 한 명의 컴퓨터에서 Perforce 서버를 구동시키는 것은 불편하기 때문에, 보통은 AWS에 서버를 두고 작업하게 된다. AWS에서 Perforce 서버를 어떻게 구동하고, 사용하는지 알아보자. 프로그램 설치 먼저 필요한 프로그램들을 설치해야 한다. 아래에 적혀있는 프로그램들을 모두 다운받자. Putty 윈도우에서 리눅스나 유닉스 계열의 서버로 원격 접속하기 위해 사용하는 프로그램이다. SSH 프로토콜을 사용하는데, 자세한 것은 몰라도 된다. Putty를 사용하여 우리가 EC2를 통해 만들어 놓은 서버에 접속하고 관리할 수 있다. Putty 다운로드 링크 : https://www.chiark.greenend.org.uk/~sgtath..

C++/Effective C++

[Effective C++] Chapter 4: Design and Declarations(1)

Item 18 : Make interfaces easy to use correctly and hard to use incorrectly 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 만들자. 좋은 인터페이스는 올바르게 사용하기엔 쉽고 잘 못 사용하기엔 어려워야 한다. 모든 인터페이스에서 이러한 특성을 만족시켜야 한다. 인터페이스가 올바르게 사용되기 위해, 인터페이스는 일관되고 built-in-type과 호환되는 동작을 포함해야 한다. 에러 방지를 위한 방법에는 새로운 type 만들기, type에 대한 operation 제한, object value 제한, 클라이언트의 리소스 관리 책임 제거가 있다. shared_ptr은 custom deleters를 지원한다. 이것은 교차 DLL문제를 방..

C++/Effective C++

[Effective C++] Chapter 3: Resource Management

리소스의 종류에 상관없이, 리소스는 사용이 끝나면 항상 release해야 한다. Item 13 : Use objects to manage resources. 자원 관리에는 객체가 그만. 아래 코드를 살펴보자. Investment* createInvestment();//return ptr to dynamically allocated void f() { Investment *pInv = createInvestment(); ... delete pInv; } 이 코드는 괜찮아 보이지만, 함수 f는 createInvestment 함수를 통해 얻은 오브젝트를 delete하는데 실패할 수 있다. 함수의 중간에 return문이 위치하면 delete가 실행되지 않고, 메모리 누수 문제가 발생한다. 따라서, 함수 f가 d..

C++/Effective C++

[Effective C++] Chapter 2: Constructors, Destructors, and Assignment Operators(2)

Item 9 : Never call virtual functions during construction or destruction 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 않는다. 다음과 같은 코드를 살펴보자. class Transaction{ public: Transaction(); virtual void logTransaction() const = 0; ... }; Transaction::Transaction() { ... logTransaction(); } class BuyTransaction: public Transaction{ public: virtual void logTransaction() const; ... }; class SellTransaction: public Tr..

Tuesberry
공부 노트