more effective c++ 4주차

23
More Effective C++ 정정 131054 정정정

Upload: injae-lee

Post on 29-Jul-2015

164 views

Category:

Education


3 download

TRANSCRIPT

Page 1: More Effective C++ 4주차

More Effective C++ 정리

131054 이인재

Page 2: More Effective C++ 4주차

프록시 클래스

1. 어떤 객체를 대신하여 동작하게 하는 장치

2. 어떤 특정한 동작 원리 몇 가지를 아주 쉽게 구현

3. 대표적인 예로는 다차원 배열 , 좌항값 /우항값 구분 (operator[]), 암시적 타입변환

Page 3: More Effective C++ 4주차

프록시 클래스의 단점1. 함수로부터 반환되는 프록시 객체는

임시객체이기 때문에 , 객체 생성 및 소멸 과정이 저절로 수반되어야 함

2. 객체를 생성하고 소멸시키는데 드는 비용이 있음

3. 프록시 클래스를 사용한 프로그램은 더 복잡

4. 클래스가 몇 개 더 추가되기 때문에 설계 , 구 현 , 파악 유지보수 등에 관한 작업이 어려움

Page 4: More Effective C++ 4주차

함수를 두 개 이상의 객체에 대해 가상 함수처럼 동작하도록 만들기

1. 이중 디스패치 기법이라고 한다

2. C++ 은 이중 디스패치 기능을 직접 지원하지 않음

3. C++ 컴파일러가 가상함수를 구현할 때 하는 일을 프로그래머가 직접 만들어 내야 함

4. 결코 쉽지 않음

Page 5: More Effective C++ 4주차

가상 함수와 RTTI 를 사용하여 구현하는 이중 디스패치

1. 이 방법은 가장 흔한 방법이면서도 지저분한 방법

2. if then else 를 줄줄이 엮어 가상 함수를 흉내

3. 먼저 진짜 타입을 알아낸 후 , 그 타입에 대해 생길 수 있는 모든 가능성을 조사

4. 캡슐화를 무시 , 프로그램의 유지보수에 어려운이 많음

Page 6: More Effective C++ 4주차

가상 함수만 사용하여 구현하는 이중 디스패치

1. RTTI 와 기본적으로는 유사

2. 이중 디스패치를 단일 디스패치 두 개로 구현함

3. 독립된 가상 함수 두 개를 호출

4. 첫 번째 가상함수는 첫 번째 객체의 동적 타입 결정

5. 두 번째 가상 함수는 두 번 째 객체의 동적 타입을 결정

Page 7: More Effective C++ 4주차

가상 함수만 사용하여 구현하는 이중 디스패치의특징

1. RTTI 의 방법보다 훨씬 깔끔

2. if-then-else 의 남용도 없음

3. 모든 클래스가 다른 형제 클래스에 대해 알고 있어야한다는 문제가 있음

Page 8: More Effective C++ 4주차

가상 함수 테이블의 유사구현을 통한 이중패치

1. 컴파일러는 함수 포인터의 배열 (vtbl) 로 C++ 가상 함수 호출장치를 만들어 놓고 , 가상 함수가 호출될 때 그 배열을 인덱싱

2. 컴파일러는 vtbl 을 사용하기 때문에 if-then-else 같은 연산을 하지 않아도 됨

3. vtbl 내의 인덱스를 결정하고 , 해당되는 인덱스에 위치한 함수 포인터를 써서 가상 함수 호출

Page 9: More Effective C++ 4주차

미래 지향적인 프로그래머가 되자

1. 변화를 받아들이고 변화애 대비하는 것

2. 라이브러리에 함수가 추가될 수 있고 , 오버로딩도 추가될 수 있다는 사실을 인식

3. 특정 함수의 호출환경이 달라질 수 있다는 사실 등을 인지하는 것

Page 10: More Effective C++ 4주차

C++ 에서의 미래지향적 방법 1

1. 대입과 복사 생성은 모든 클래스에 대해 처리해 두어야 함

2. 다른 사름들이 자연스럽게 사용할 수 있는 문법과 직관적인 의미 구조를 갖도록 해야함

3. 맞게 사용하기에는 쉽고 , 틀리게 사용하기에는 어렵도록 클래스 구현

Page 11: More Effective C++ 4주차

C++ 에서의 미래지향적 방법 2

1. 코드의 이식성을 최대한 신경써야 함

2. 변경이 필요할 때 그 변경의 영향이 제한된 부분에만 미치도록 코드를 설계

3. 최대한 캡슐화를 하고 , 구현에 관련된 상세한 부분은 외부에 노출하지 말것

4. 자주 사용하는 기능은 모두 포함 .

5. 부분대입 현상을 막아야 함

Page 12: More Effective C++ 4주차

상속 관계의 말단에 있지 않은 클래스는 반드시 추상 클래스로 만들자

1. 부분 대입현상 -> 대입연산 시 멤버 전체가 바뀌지 않고 멤버의 일부분만 바뀌는 현상

2. 부분 대입현상이 일어나게 클래스를 짜면 안됨

3. 하지만 흔히할 수 있는 실수

Page 13: More Effective C++ 4주차

부분 대입 현상 해결방법

1. 대입 연산자를 가상 함수로 만드는 것

2. 가상 함수의 매개변수 타입만은 기본 클래스의 것을 그대로 쓸 수 밖에 없음 -> 주의해야 함

3. 타입 불일치 대입 현상이 일어날 수 있음

4. 컴파일은 되지만 의도치 않게 실행이 되는 경우가 많음

Page 14: More Effective C++ 4주차

순수 가상 함수를 구현

1. 클래스는 추상 클래스

2. 이 클래스로부터 파생된 모든 구체 클래스는 순수 가상 함수로 선언된 이 함수를 “ 보통의” 가상 함수 ( 즉 , “=0” 이 없는 함수 ) 로 구현

3. 순수 가상 소멸자는 구현을 해야 함

Page 15: More Effective C++ 4주차

일반적인 법칙

1. 상속 관계의 말단에 있지 않은 클래스는 반드시 추상 클래스

2. 외부 라이브러리를 사용하는 경우에는 예외가 있을 수 있음

3. 신뢰성 , 견고성 , 이해도 , 확장성을 지킬 수 있음

Page 16: More Effective C++ 4주차

네임 맹글링

1. 함수 이름 뒤섞기 .

2. C 에서는 함수 오버로딩을 할 수 없음 , C++ 은 물론 가능

3. 오버로딩된 함수는 링커를 통과할 때 문제를 일으킬 수 있음

4. 링커는 같은 이름을 가진 여러개의 함수를 구분하지 못하기 때문이다

Page 17: More Effective C++ 4주차

네임 맹글링

1. 즉 네임 맹글링은 링커를 위해 필요한 것

2. C 는 오버로딩 할 수 없으므로 , C 함수를 호 호출할 코드에 대해서는 네임 맹글링을 수행하지 않도록 해야 함 .

3. 네임 맹클링을 막는 수단은 extern “C” 지시자

Page 18: More Effective C++ 4주차

정적 데이터 초기화

1. main 의 몸체가 실행되기 전에 정적 클래스 객체와 전역 객체 , 네임스페이스와 파일 범위에 있는 객체의 생성자가 실행

2. 이 과정을 가리켜 정적 데이터 초기화라고 부름

3. 정적 데이터 소멸은 main 의 실행이 끝난 후에 발생

Page 19: More Effective C++ 4주차

main 은 C++ 로

1. 되도록이면 main 은 C++ 로 짜는 것이 좋다

2. C++ 라이브러리에 들어 있을지 모르는 정적 객체의 생성자와 소멸자를 이식성 있게 호출할 방법이 없기 때문이다

3. 거의 모든 제작사들이 정적 데이터 초기화 및 소멸을 마탕주는 별도의 매커니즘을 언어 외적으로 제공

Page 20: More Effective C++ 4주차

동적 메모리 할당

1. C++ 에서는 new 와 delete 사용

2. C 에서는 malloc 과 free 사용

3. 이것의 짝을 반드시 지켜주어야 함

4. 메모리 누수에 주의

Page 21: More Effective C++ 4주차

자료구조의 호환성1. C 와 C++ 컴파일러가 호환성 있는 코드를

만들어 낸다면 , 두 언어로 만든 함수 사이에 객체의 포인터가 오가거나 비멤버 함수나 정적 함수에 대한 포인터가 오가는 데에는 별 문제 없음

2. 기본 제공 타입 역시 자유롭게 교환 가능

3. 하지만 가상함수가 추가되면 문제를 일으킴

4. 가상 함수 테이블에 관련된 숨겨진 데이터 멤버로 인한 C++ 구조체의 메모리 배열 구조가 바뀌기 때문

Page 22: More Effective C++ 4주차

자료구조의 호환성

1. C++ 와 C 에서 동시에 컴파일 되는 자료구조는 C++ 와 C 로 만든 함수에 자유롭게 전달 할 수 있음

2. C++ 구조체의 경우 비가상 멤버 함수를 추가하는 것까지는 호환성 문제를 일으키지 않지만 , 이외의 다른 변경이 가해지면 C 와 호환 불가능

Page 23: More Effective C++ 4주차

C++ 언어의 최신 표준안과 표준 라이브러리에 대해 익숙해지자

1. 표준 C 라이브러리를 그대로 지원함

2. 문자열을 지원함

3. 지역화를 지원함

4. 입출력 스트림 라이브러리가 약간 변경됨

5. 숫자 조작을 돕는 데이터 타입이 지원됨

6. 타입에 상관없이 쓸 수 있는 일반 용도의 컨테이너와 알고리듬이 지원됨