전체 글 147

[Effective C++] Item19_클래스 설계는 타입 설계와 똑같이 취급하자

Item19_클래스 설계는 타입 설계와 똑같이 취급하자챕터 핵심 내용클래스 설계는 타입 설계이다.- 클래스 설계는 타입 설계이다.좋은 타입은 문법이 자연스럽고, 의미구조가 직관적이며, 효율적인 구현이 한 가지 이상 가능해야 한다.신경 써야 하는 질문들새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가?답에 따라 생성자 및 소멸자, 메모리 할당 함수 설계가 바뀐다.객체 초기화는 객체 대입과 어떻게 달라야 하는가?초기화와 대입을 헷갈리지 말자.새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가?값에 의한 전달은 복사 생성자가 구현한다.새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가?클래스의 불변속성(invariant)을 잘 파악하고, 클래스..

카테고리 없음 2018.02.01

[Effective C++] Item18_인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자

Item18_인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자챕터 핵심 내용좋은 인터페이스는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵다.인터페이스의 올바른 사용을 이끄는 방법으로는 인터페이스 사이의 일관성 잡아주기, 그리고 기본제공 타입과의 동작 호환성 유지하기가 있다.사용자의 실수를 방지하는 방법으로는 새로운 타입 만들기, 타입에 대한 연산을 제한하기, 객체의 값에 대해 제약 걸기, 자원 관리 작업을 사용자 책임으로 놓지 않기가 있다.tr1::shared_ptr은 사용자 정의 삭제자를 지원한다. 이 특징 때문에 교차 DLL 문제를 막아 주며, 뮤텍스 등을 자동으로 잠금 해제하는 데 쓸 수 있다.- 좋은 인터페이스는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵다.사용자 쪽에서 뭔가를 외..

카테고리 없음 2018.02.01

[Effective C++] Item17_new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자

Item17_new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자챕터 핵심 내용new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자. 이것이 안 되어 있다면, 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될 수 있다.- new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자. 이것이 안 되어 있다면, 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될 수 있다.tr1::shared_ptr의 생성자는 명시적으로 선언되야 한다.함수 호출에 필요한 연산을 만들어 내는 코드는 실행되는 순서가 컴파일러 제작사마다 다르다.후기(postscript)C++11부터는 tr1에 있던 shared_ptr이 표준으로 들어왔다. 또한 위에 해당..

카테고리 없음 2018.01.31

[Effective C++] Item16_new 및 delete를 사용할 때는 형태를 반드시 맞추자

Item16_new 및 delete를 사용할 때는 형태를 반드시 맞추자챕터 핵심 내용new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 한다. 마찬가지로 []를 쓰지 않았다면, delete에도 []를 쓰지 말아야 한다.- new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 한다. 마찬가지로 []를 쓰지 않았다면, delete에도 []를 쓰지 말아야 한다.짝이 맞지 않는다면 미정의 동작을 일으킨다.new의 작동 원리메모리 할당할당된 메모리에 대해 한 개 이상의 생성자 호출delete의 작동 원리할당된 메모리에 대해 한 개 이상의 소멸자 호출메모리 해제힙에 만들어지는 단일 객체 메모리 레이아웃과 객체 배열의 메모리 레이아웃은 다르다.객체 배열의 메모리에는 배..

카테고리 없음 2018.01.31

영어 공부를 미루기로 했다.

이전까지에는 영어 공부를 하고 있었다.방법은 [9등급 꼴찌, 1년 만에 통역사 된 비법]에나와있는 100LS 방법을 이용하고 있었다.간략하게 얘기하면 영화나 드라마를 100번 듣고 말하는(섀도잉) 것이었다.저자가 얘기하는 방법과 왜 이 방법이 효율적인지에 대한 근거를 듣고괜찮다고 생각되어 진행을 해왔었다. 결과적으로는 시간을 낭비했다고 본다.진행하다 중단되고 진행하다 중단되고.내 게으름이 문제였다.이럴 바에는 그 시간에 전공 공부를 하고,막학기 쯔음에 영어를 해두는 것이 더 효율적이겠다는 생각이 들었다.아직 내가 급박함, 절박함을 느끼진 못하는 것 같다. 모든 일은 충분한 '동기'가 있어야 제일 효율적으로 진행이 되는구나라는걸 깨달았다.좀 더 나의 동기가 충분히 여물었을 때, 다시 영어 공부를 진행해야겠다.

Diary 2018.01.30

[Effective C++] Item15_자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자

Item15_자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자챕터 핵심 내용실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어줘야 한다.자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능하다. 안전성만 따지면 명시적 변환이 대체적으로 낫지만, 고객 편의성을 놓고 보면 암시적 변환이 괜찮다.- 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어줘야 한다.- 자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능하다. 안전성만 따지면 명시적 변환이 대체적으로 낫지만, 고객 편의성을 놓고 보면 암시적..

카테고리 없음 2018.01.30

[Effective C++] Item14_자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자

Item14_자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자챕터 핵심 내용RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정된다.RAII 클래스에 구현하는 일반적인 복사 동작은 복사를 금지하거나 참조 카운팅을 해 주는 선으로 마무리하는 것이다. 하지만 이 외의 방법들도 가능하다.- RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정된다.- RAII 클래스에 구현하는 일반적인 복사 동작은 복사를 금지하거나 참조 카운팅을 해 주는 선으로 마무리하는 것이다. 하지만 이 외의 방법들도 가능하다.RAII 객체..

카테고리 없음 2018.01.30

[Effective C++] Item13_자원 관리에는 객체가 그만!

Item13_자원 관리에는 객체가 그만!챕터 핵심 내용자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII객체를 사용하자.- 자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII객체를 사용하자.자원 관리에 객체를 사용하는 방법의 두 가지 특징자원을 획득한 후 자원 관리 객체에게 넘긴다. RAII(Resouce Acquisition Is Initialization)자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 한다.자원 해제를 일일이 손으로 하다 보면 언젠가 잘못을 저지르고 만다.자원을 관리하는 객체를 만들어 자원을 관리하자.

카테고리 없음 2018.01.30

[Effective C++] Item12_객체의 모든 부분을 빠짐없이 복사하자

Item12_객체의 모든 부분을 빠짐없이 복사하자챕터 핵심 내용객체 복사 함수는 주어진 객체의 모든 데이터 멤버 및 모든 기본 클래스 부분을 빠뜨리지 말고 복사해야 한다.클래스의 복사 함수 두 개를 구현할 때, 한 쪽을 이용해서 다른 쪽을 구현하려는 시도는 하지 말자.- 객체 복사 함수는 주어진 객체의 모든 데이터 멤버 및 모든 기본 클래스 부분을 빠뜨리지 말고 복사해야 한다.객체 복사 함수(object copying function) : 복사 생성자, 복사 대입 연산자. 복사되는 객체가 갖고 있는 데이터를 빠짐없이 복사한다.부분 복사(partial copy)가 일어나도 컴파일러는 일언반구조차 하지 않는다.파생 클래스에 대한 복사 함수를 정의하겠다고 결심했다면, 기본 클래스 부분을 복사해서 빠뜨리지 않도..

카테고리 없음 2018.01.29

[Effective C++] Item11_operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자

Item11_operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자챕터 핵심 내용operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자.두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인하라.- operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자.자기 대입(self assignment)은 적법한 코드이며, 실수할 여지가 있다. 또한 눈에 잘 띠지도 않는다.a[i] = a[j]; // i와 j가 같다면? *px = *py; // px와 py가 같다면? 자기 대입이 생기는 이유는 중복참조(aliasing) 때문이다.대입 연산자는 자기 ..

카테고리 없음 2018.01.29