SlideShare a Scribd company logo
1 of 23
More Effective C++ 정리
131054 이인재
프록시 클래스
1. 어떤 객체를 대신하여 동작하게 하는 장치
2. 어떤 특정한 동작 원리 몇 가지를 아주 쉽
게 구현
3. 대표적인 예로는 다차원 배열, 좌항값/우항
값 구분(operator[]), 암시적 타입변환
프록시 클래스의 단점
1. 함수로부터 반환되는 프록시 객체는 임시객체
이기 때문에, 객체 생성 및 소멸 과정이 저절로
수반되어야 함
2. 객체를 생성하고 소멸시키는데 드는 비용이 있
음
3. 프록시 클래스를 사용한 프로그램은 더 복잡
4. 클래스가 몇 개 더 추가되기 때문에 설계, 구
현, 파악 유지보수 등에 관한 작업이 어려움
함수를 두 개 이상의 객체에 대해 가
상 함수처럼 동작하도록 만들기
1. 이중 디스패치 기법이라고 한다
2. C++은 이중 디스패치 기능을 직접 지원하
지 않음
3. C++컴파일러가 가상함수를 구현할 때 하
는 일을 프로그래머가 직접 만들어 내야 함
4. 결코 쉽지 않음
가상 함수와 RTTI를 사용하여 구
현하는 이중 디스패치
1. 이 방법은 가장 흔한 방법이면서도 지저분
한 방법
2. if then else 를 줄줄이 엮어 가상 함수를 흉
내
3. 먼저 진짜 타입을 알아낸 후 , 그 타입에 대
해 생길 수 있는 모든 가능성을 조사
4. 캡슐화를 무시, 프로그램의 유지보수에 어
려운이 많음
가상 함수만 사용하여 구현하는
이중 디스패치
1. RTTI와 기본적으로는 유사
2. 이중 디스패치를 단일 디스패치 두 개로 구
현함
3. 독립된 가상 함수 두 개를 호출
4. 첫 번째 가상함수는 첫 번째 객체의 동적
타입 결정
5. 두 번째 가상 함수는 두 번 째 객체의 동적
타입을 결정
가상 함수만 사용하여 구현하는
이중 디스패치의특징
1. RTTI의 방법보다 훨씬 깔끔
2. if-then-else의 남용도 없음
3. 모든 클래스가 다른 형제 클래스에 대해 알
고 있어야한다는 문제가 있음
가상 함수 테이블의 유사구현을
통한 이중패치
1. 컴파일러는 함수 포인터의 배열(vtbl)로
C++ 가상 함수 호출장치를 만들어 놓고,
가상 함수가 호출될 때 그 배열을 인덱싱
2. 컴파일러는 vtbl을 사용하기 때문에 if-
then-else같은 연산을 하지 않아도 됨
3. vtbl내의 인덱스를 결정하고, 해당되는 인
덱스에 위치한 함수 포인터를 써서 가상 함
수 호출
미래 지향적인 프로그래머가 되자
1. 변화를 받아들이고 변화애 대비하는 것
2. 라이브러리에 함수가 추가될 수 있고, 오버
로딩도 추가될 수 있다는 사실을 인식
3. 특정 함수의 호출환경이 달라질 수 있다는
사실 등을 인지하는 것
C++에서의 미래지향적 방법1
1. 대입과 복사 생성은 모든 클래스에 대해 처
리해 두어야 함
2. 다른 사름들이 자연스럽게 사용할 수 있는
문법과 직관적인 의미 구조를 갖도록 해야
함
3. 맞게 사용하기에는 쉽고, 틀리게 사용하기
에는 어렵도록 클래스 구현
C++에서의 미래지향적 방법2
1. 코드의 이식성을 최대한 신경써야 함
2. 변경이 필요할 때 그 변경의 영향이 제한된
부분에만 미치도록 코드를 설계
3. 최대한 캡슐화를 하고, 구현에 관련된 상세
한 부분은 외부에 노출하지 말것
4. 자주 사용하는 기능은 모두 포함.
5. 부분대입 현상을 막아야 함
상속 관계의 말단에 있지 않은 클래
스는 반드시 추상 클래스로 만들자
1. 부분 대입현상 -> 대입연산 시 멤버 전체가
바뀌지 않고 멤버의 일부분만 바뀌는 현상
2. 부분 대입현상이 일어나게 클래스를 짜면
안됨
3. 하지만 흔히할 수 있는 실수
부분 대입 현상 해결방법
1. 대입 연산자를 가상 함수로 만드는 것
2. 가상 함수의 매개변수 타입만은 기본 클래
스의 것을 그대로 쓸 수 밖에 없음->주의해
야 함
3. 타입 불일치 대입 현상이 일어날 수 있음
4. 컴파일은 되지만 의도치 않게 실행이 되는
경우가 많음
순수 가상 함수를 구현
1. 클래스는 추상 클래스
2. 이 클래스로부터 파생된 모든 구체 클래스
는 순수 가상 함수로 선언된 이 함수를 “ 보
통의” 가상 함수( 즉, “=0” 이 없는 함수) 로
구현
3. 순수 가상 소멸자는 구현을 해야 함
일반적인 법칙
1. 상속 관계의 말단에 있지 않은 클래스는 반
드시 추상 클래스
2. 외부 라이브러리를 사용하는 경우에는 예
외가 있을 수 있음
3. 신뢰성, 견고성, 이해도 , 확장성을 지킬 수
있음
네임 맹글링
1. 함수 이름 뒤섞기.
2. C에서는 함수 오버로딩을 할 수 없음, C++
은 물론 가능
3. 오버로딩된 함수는 링커를 통과할 때 문제
를 일으킬 수 있음
4. 링커는 같은 이름을 가진 여러개의 함수를
구분하지 못하기 때문이다
네임 맹글링
1. 즉 네임 맹글링은 링커를 위해 필요한 것
2. C 는 오버로딩 할 수 없으므로, C함수를 호
호출할 코드에 대해서는 네임 맹글링을 수
행하지 않도록 해야 함.
3. 네임 맹클링을 막는 수단은 extern “C”지시
자
정적 데이터 초기화
1. main의 몸체가 실행되기 전에 정적 클래스
객체와 전역 객체, 네임스페이스와 파일 범
위에 있는 객체의 생성자가 실행
2. 이 과정을 가리켜 정적 데이터 초기화라고
부름
3. 정적 데이터 소멸은 main의 실행이 끝난
후에 발생
main은 C++로
1. 되도록이면 main은 C++로 짜는 것이 좋다
2. C++ 라이브러리에 들어 있을지 모르는 정
적 객체의 생성자와 소멸자를 이식성 있게
호출할 방법이 없기 때문이다
3. 거의 모든 제작사들이 정적 데이터 초기화
및 소멸을 마탕주는 별도의 매커니즘을 언
어 외적으로 제공
동적 메모리 할당
1. C++에서는 new와 delete 사용
2. C에서는 malloc과 free사용
3. 이것의 짝을 반드시 지켜주어야 함
4. 메모리 누수에 주의
자료구조의 호환성
1. C와 C++ 컴파일러가 호환성 있는 코드를 만들
어 낸다면, 두 언어로 만든 함수 사이에 객체의
포인터가 오가거나 비멤버 함수나 정적 함수에
대한 포인터가 오가는 데에는 별 문제 없음
2. 기본 제공 타입 역시 자유롭게 교환 가능
3. 하지만 가상함수가 추가되면 문제를 일으킴
4. 가상 함수 테이블에 관련된 숨겨진 데이터 멤
버로 인한 C++구조체의 메모리 배열 구조가
바뀌기 때문
자료구조의 호환성
1. C++와 C에서 동시에 컴파일 되는 자료구
조는 C++와 C로 만든 함수에 자유롭게 전
달 할 수 있음
2. C++구조체의 경우 비가상 멤버 함수를 추
가하는 것까지는 호환성 문제를 일으키지
않지만, 이외의 다른 변경이 가해지면 C와
호환 불가능
C++언어의 최신 표준안과 표준
라이브러리에 대해 익숙해지자
1. 표준 C라이브러리를 그대로 지원함
2. 문자열을 지원함
3. 지역화를 지원함
4. 입출력 스트림 라이브러리가 약간 변경됨
5. 숫자 조작을 돕는 데이터 타입이 지원됨
6. 타입에 상관없이 쓸 수 있는 일반 용도의
컨테이너와 알고리듬이 지원됨

More Related Content

What's hot

Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1
현찬 양
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
destinycs
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2
현찬 양
 

What's hot (20)

Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 C
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
javascript01
javascript01javascript01
javascript01
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6
 
클래스의 추가 지식
클래스의 추가 지식클래스의 추가 지식
클래스의 추가 지식
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩
 

Similar to More Effective C++ 4주차

Chapter5 ~ 6
Chapter5 ~ 6Chapter5 ~ 6
Chapter5 ~ 6
Injae Lee
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
문익 장
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
jinho park
 
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
해강
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
KyeongWon Koo
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
문익 장
 

Similar to More Effective C++ 4주차 (20)

Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4ppt
 
Tcpl 12장 파생클래스
Tcpl 12장 파생클래스Tcpl 12장 파생클래스
Tcpl 12장 파생클래스
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
 
Effective C++ Chapter 1 Summary
Effective C++ Chapter 1 SummaryEffective C++ Chapter 1 Summary
Effective C++ Chapter 1 Summary
 
Chapter5 ~ 6
Chapter5 ~ 6Chapter5 ~ 6
Chapter5 ~ 6
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
 
C++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxC++ 코딩의 정석.pptx
C++ 코딩의 정석.pptx
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 
More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지
 
Mec 56
Mec 56Mec 56
Mec 56
 

More Effective C++ 4주차

  • 1. More Effective C++ 정리 131054 이인재
  • 2. 프록시 클래스 1. 어떤 객체를 대신하여 동작하게 하는 장치 2. 어떤 특정한 동작 원리 몇 가지를 아주 쉽 게 구현 3. 대표적인 예로는 다차원 배열, 좌항값/우항 값 구분(operator[]), 암시적 타입변환
  • 3. 프록시 클래스의 단점 1. 함수로부터 반환되는 프록시 객체는 임시객체 이기 때문에, 객체 생성 및 소멸 과정이 저절로 수반되어야 함 2. 객체를 생성하고 소멸시키는데 드는 비용이 있 음 3. 프록시 클래스를 사용한 프로그램은 더 복잡 4. 클래스가 몇 개 더 추가되기 때문에 설계, 구 현, 파악 유지보수 등에 관한 작업이 어려움
  • 4. 함수를 두 개 이상의 객체에 대해 가 상 함수처럼 동작하도록 만들기 1. 이중 디스패치 기법이라고 한다 2. C++은 이중 디스패치 기능을 직접 지원하 지 않음 3. C++컴파일러가 가상함수를 구현할 때 하 는 일을 프로그래머가 직접 만들어 내야 함 4. 결코 쉽지 않음
  • 5. 가상 함수와 RTTI를 사용하여 구 현하는 이중 디스패치 1. 이 방법은 가장 흔한 방법이면서도 지저분 한 방법 2. if then else 를 줄줄이 엮어 가상 함수를 흉 내 3. 먼저 진짜 타입을 알아낸 후 , 그 타입에 대 해 생길 수 있는 모든 가능성을 조사 4. 캡슐화를 무시, 프로그램의 유지보수에 어 려운이 많음
  • 6. 가상 함수만 사용하여 구현하는 이중 디스패치 1. RTTI와 기본적으로는 유사 2. 이중 디스패치를 단일 디스패치 두 개로 구 현함 3. 독립된 가상 함수 두 개를 호출 4. 첫 번째 가상함수는 첫 번째 객체의 동적 타입 결정 5. 두 번째 가상 함수는 두 번 째 객체의 동적 타입을 결정
  • 7. 가상 함수만 사용하여 구현하는 이중 디스패치의특징 1. RTTI의 방법보다 훨씬 깔끔 2. if-then-else의 남용도 없음 3. 모든 클래스가 다른 형제 클래스에 대해 알 고 있어야한다는 문제가 있음
  • 8. 가상 함수 테이블의 유사구현을 통한 이중패치 1. 컴파일러는 함수 포인터의 배열(vtbl)로 C++ 가상 함수 호출장치를 만들어 놓고, 가상 함수가 호출될 때 그 배열을 인덱싱 2. 컴파일러는 vtbl을 사용하기 때문에 if- then-else같은 연산을 하지 않아도 됨 3. vtbl내의 인덱스를 결정하고, 해당되는 인 덱스에 위치한 함수 포인터를 써서 가상 함 수 호출
  • 9. 미래 지향적인 프로그래머가 되자 1. 변화를 받아들이고 변화애 대비하는 것 2. 라이브러리에 함수가 추가될 수 있고, 오버 로딩도 추가될 수 있다는 사실을 인식 3. 특정 함수의 호출환경이 달라질 수 있다는 사실 등을 인지하는 것
  • 10. C++에서의 미래지향적 방법1 1. 대입과 복사 생성은 모든 클래스에 대해 처 리해 두어야 함 2. 다른 사름들이 자연스럽게 사용할 수 있는 문법과 직관적인 의미 구조를 갖도록 해야 함 3. 맞게 사용하기에는 쉽고, 틀리게 사용하기 에는 어렵도록 클래스 구현
  • 11. C++에서의 미래지향적 방법2 1. 코드의 이식성을 최대한 신경써야 함 2. 변경이 필요할 때 그 변경의 영향이 제한된 부분에만 미치도록 코드를 설계 3. 최대한 캡슐화를 하고, 구현에 관련된 상세 한 부분은 외부에 노출하지 말것 4. 자주 사용하는 기능은 모두 포함. 5. 부분대입 현상을 막아야 함
  • 12. 상속 관계의 말단에 있지 않은 클래 스는 반드시 추상 클래스로 만들자 1. 부분 대입현상 -> 대입연산 시 멤버 전체가 바뀌지 않고 멤버의 일부분만 바뀌는 현상 2. 부분 대입현상이 일어나게 클래스를 짜면 안됨 3. 하지만 흔히할 수 있는 실수
  • 13. 부분 대입 현상 해결방법 1. 대입 연산자를 가상 함수로 만드는 것 2. 가상 함수의 매개변수 타입만은 기본 클래 스의 것을 그대로 쓸 수 밖에 없음->주의해 야 함 3. 타입 불일치 대입 현상이 일어날 수 있음 4. 컴파일은 되지만 의도치 않게 실행이 되는 경우가 많음
  • 14. 순수 가상 함수를 구현 1. 클래스는 추상 클래스 2. 이 클래스로부터 파생된 모든 구체 클래스 는 순수 가상 함수로 선언된 이 함수를 “ 보 통의” 가상 함수( 즉, “=0” 이 없는 함수) 로 구현 3. 순수 가상 소멸자는 구현을 해야 함
  • 15. 일반적인 법칙 1. 상속 관계의 말단에 있지 않은 클래스는 반 드시 추상 클래스 2. 외부 라이브러리를 사용하는 경우에는 예 외가 있을 수 있음 3. 신뢰성, 견고성, 이해도 , 확장성을 지킬 수 있음
  • 16. 네임 맹글링 1. 함수 이름 뒤섞기. 2. C에서는 함수 오버로딩을 할 수 없음, C++ 은 물론 가능 3. 오버로딩된 함수는 링커를 통과할 때 문제 를 일으킬 수 있음 4. 링커는 같은 이름을 가진 여러개의 함수를 구분하지 못하기 때문이다
  • 17. 네임 맹글링 1. 즉 네임 맹글링은 링커를 위해 필요한 것 2. C 는 오버로딩 할 수 없으므로, C함수를 호 호출할 코드에 대해서는 네임 맹글링을 수 행하지 않도록 해야 함. 3. 네임 맹클링을 막는 수단은 extern “C”지시 자
  • 18. 정적 데이터 초기화 1. main의 몸체가 실행되기 전에 정적 클래스 객체와 전역 객체, 네임스페이스와 파일 범 위에 있는 객체의 생성자가 실행 2. 이 과정을 가리켜 정적 데이터 초기화라고 부름 3. 정적 데이터 소멸은 main의 실행이 끝난 후에 발생
  • 19. main은 C++로 1. 되도록이면 main은 C++로 짜는 것이 좋다 2. C++ 라이브러리에 들어 있을지 모르는 정 적 객체의 생성자와 소멸자를 이식성 있게 호출할 방법이 없기 때문이다 3. 거의 모든 제작사들이 정적 데이터 초기화 및 소멸을 마탕주는 별도의 매커니즘을 언 어 외적으로 제공
  • 20. 동적 메모리 할당 1. C++에서는 new와 delete 사용 2. C에서는 malloc과 free사용 3. 이것의 짝을 반드시 지켜주어야 함 4. 메모리 누수에 주의
  • 21. 자료구조의 호환성 1. C와 C++ 컴파일러가 호환성 있는 코드를 만들 어 낸다면, 두 언어로 만든 함수 사이에 객체의 포인터가 오가거나 비멤버 함수나 정적 함수에 대한 포인터가 오가는 데에는 별 문제 없음 2. 기본 제공 타입 역시 자유롭게 교환 가능 3. 하지만 가상함수가 추가되면 문제를 일으킴 4. 가상 함수 테이블에 관련된 숨겨진 데이터 멤 버로 인한 C++구조체의 메모리 배열 구조가 바뀌기 때문
  • 22. 자료구조의 호환성 1. C++와 C에서 동시에 컴파일 되는 자료구 조는 C++와 C로 만든 함수에 자유롭게 전 달 할 수 있음 2. C++구조체의 경우 비가상 멤버 함수를 추 가하는 것까지는 호환성 문제를 일으키지 않지만, 이외의 다른 변경이 가해지면 C와 호환 불가능
  • 23. C++언어의 최신 표준안과 표준 라이브러리에 대해 익숙해지자 1. 표준 C라이브러리를 그대로 지원함 2. 문자열을 지원함 3. 지역화를 지원함 4. 입출력 스트림 라이브러리가 약간 변경됨 5. 숫자 조작을 돕는 데이터 타입이 지원됨 6. 타입에 상관없이 쓸 수 있는 일반 용도의 컨테이너와 알고리듬이 지원됨