SlideShare uma empresa Scribd logo
1 de 12
Baixar para ler offline
항목 30 : 프록시 클래스
프록시 클래스는 어떤 작업을 수행함에 있어서 중개자 역할을 하는 클래스
실제 활용은 다차원 배열을 만들어서 [ ][ ] 연산자를 사용할 수 있게 하거나
[ ] 연산자의 읽기 또는 쓰기 용도를 파악하거나
암시적 형변환을 막는데 이용될 수 있다.
하지만 모든 것에는 비용이 있듯이 프록시 객체도 하나의 객체이므로 생성 소멸의 비용이 필요하다.
그리고 주어진 작업을 프록시 객체를 통해서 처리하게 되므로 작업과정이 더 복잡해지게 된다는 단점이 있다.
항목 31 : 함수를 두 개 이상의 객체(타입)에 대해 가상 함수처럼 동작하도록 만들기
함수 호출을 담당하는 map을 만든다.
이 맵의 키는 객체의 타입이다. 만약 어떤 함수를 처리하는데 필요한 객체가 둘이면 두 객체의 타입의 조합을 사용한다.
맵의 값은 주어진 키에 적합한 함수 포인터이다.
실제 사용할 때 함수를 호출하게 되면 우선 인자로 사용되는 객체의 타입을 확인한다.
객체 타입의 확인은 typeid().name을 통해서 처리하며,
타입들을 확인한 후에 이미 생성한 함수 테이블 map에서 적합한 함수 포인터를 얻는다.
이렇게 얻는 함수 포인터에 앞서 객체 타입을 확인했던 실제 객체들을 인자로 넣어서 함수를 실행시킨다.
항목 31 : 미래 지향적인 프로그래머가 되자
코드에 있어서 제약이 있다면 주석이나 문서와 같은 간접적인 방법이 아닌 프로그램 언어 차원에서 강제하도록 구현할 것
불필요하게 미리부터 복잡하게 만들 필요는 없다. 필요해지면 그때 구현할 것
대입과 복사 생성자는 모든 클래스에 대해서 정의
보편적으로 기대하는 결과에 맞춰서 프로그래밍 – int가 작동하는 방식을 참조하는 것이 한 방법
맞게 사용하기에는 쉽게, 틀리게 사용하는 어렵게 만들 것
이식성도 고려 할 것
unnamed namespace를 사용하거나 file-scope의 정적 변수나 함수를 선언함으로써 변경이 필요할 때 수정 범위를 줄일 수 있게 할 것
항목 32 : 상속관계 말단에 있지 않은 클래스는 반드시 추상 클래스로 만들자
구체 클래스를 상속시켜서 파생 클래스를 만들기 보다는 공통적인 부분을 추출해서 순수 가상 클래스를 각각 상속받는 것이 좋다
순수 가상 클래스는 보통 소멸자를 순수 가상함수로 만들어서 구현하는데, 순수 가상함수로 만들더라도 구현은 필요하다.
하지만 모든 것을 순수 가상 클래스로 만드는 것도 낭비이다. 결국 적당한 선을 찾는 것이 중요
항목 33 : 한 프로그램에서 C++와 C를 함께 사용하는 방법을 이해하자
네임 맹글링
C++는 가상함수라는 존재가 있다는 것이 C와 큰 차이점이다.
여기서 비롯되는 문제가 있는데 C++는 코드에서 정한 함수 이름(symbol)을 컴파일러가 바꾼다는 것이다.
즉 C++코드에서 C 라이브러리 함수를 호출했음에도 컴파일러가 함수 이름을 수정하게 되면 제대로 작동하지 않게 된다.
이를 방지하기 위해서 extern “C”를 사용한다. 이름없는 네임스페이스를 이용해 동시에 여러 함수를 지정할 수 있는 이 키워드는
컴파일러가 네임 맹글링을 하지 못하게 한다.
컴파일러에 따라서 이를 다르게 적용하고 싶다면 C++ 컴파일러에만 __cplusplus가 선언 되어 있는 점을 이용해서 #ifdef로 구현한다
정적 데이터 초기화
C++은 정적 데이터 초기화와 해제를 위해서 main()함수의 앞 뒤에 해당 작업을 하는 함수를 끼워 넣는 개념의 작업을 수행한다.
그러므로 main() 함수를 C++로 만드는 것이 좋으며, 만약 main()이 C로 되어 있다면 이를 호출하는 C++ main()을 두어서 문제를 해결
동적 메모리 할당
같은 동적 메모리 할당인 new / delete 와 malloc / free 이지만 엄연히 다르므로 구분해서 쌍을 맞춰서 사용한다
자료구조의 호환성
C와 C++ 사이에 데이터를 주고 받아야 한다면 C에서 컴파일 될 수 있는 객체 타입을 이용한다.
POD라고 부르는 이 자료구조는 가상함수를 가질 수 없다.
항목 35 : C++ 언어의 최신 표준안과 표준 라이브러리에 대해 익숙해지자
책의 출판 시기상 지금과는 거리가 먼 이야기가 많아서 생략합니다.

Mais conteúdo relacionado

Mais procurados

More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
현찬 양
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
quxn6
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
현찬 양
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3
현찬 양
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
익성 조
 

Mais procurados (20)

More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
C++11 1
C++11 1C++11 1
C++11 1
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디
 
Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리
 
Flyweight
FlyweightFlyweight
Flyweight
 
여러 생성자
여러 생성자여러 생성자
여러 생성자
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩
 
예외 처리
예외 처리예외 처리
예외 처리
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3
 
C++11
C++11C++11
C++11
 
Hacosa js study 2주차
Hacosa js study 2주차Hacosa js study 2주차
Hacosa js study 2주차
 
[Swift] Extensions
[Swift] Extensions[Swift] Extensions
[Swift] Extensions
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
클래스의 추가 지식
클래스의 추가 지식클래스의 추가 지식
클래스의 추가 지식
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
5 6 1
5 6 15 6 1
5 6 1
 

Semelhante a Mec 56

Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
문익 장
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
흥배 최
 
More Effective C++ 4주차
More Effective C++ 4주차More Effective C++ 4주차
More Effective C++ 4주차
Injae Lee
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장
 

Semelhante a Mec 56 (20)

2014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #62014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #6
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 
[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩
 
이펙티브 C++ 789 공부
이펙티브 C++ 789 공부이펙티브 C++ 789 공부
이펙티브 C++ 789 공부
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
More Effective C++ 4주차
More Effective C++ 4주차More Effective C++ 4주차
More Effective C++ 4주차
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
 
3 Professional MFC
3 Professional MFC3 Professional MFC
3 Professional MFC
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7
 
MEC++ 5
MEC++ 5MEC++ 5
MEC++ 5
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 

Mais de Gyeongwook Choi (7)

MEC++ 3,4
MEC++ 3,4MEC++ 3,4
MEC++ 3,4
 
MEC++ 1, 2
MEC++ 1, 2MEC++ 1, 2
MEC++ 1, 2
 
EC 789
EC 789EC 789
EC 789
 
JSON with C++ & C#
JSON with C++ & C#JSON with C++ & C#
JSON with C++ & C#
 
approximation algorithm
approximation algorithmapproximation algorithm
approximation algorithm
 
introduction to dynamic programming and linear programming
introduction to dynamic programming and linear programmingintroduction to dynamic programming and linear programming
introduction to dynamic programming and linear programming
 
Postmortem d ao_c_최경욱
Postmortem d ao_c_최경욱Postmortem d ao_c_최경욱
Postmortem d ao_c_최경욱
 

Mec 56

  • 1. 항목 30 : 프록시 클래스
  • 2. 프록시 클래스는 어떤 작업을 수행함에 있어서 중개자 역할을 하는 클래스 실제 활용은 다차원 배열을 만들어서 [ ][ ] 연산자를 사용할 수 있게 하거나 [ ] 연산자의 읽기 또는 쓰기 용도를 파악하거나 암시적 형변환을 막는데 이용될 수 있다. 하지만 모든 것에는 비용이 있듯이 프록시 객체도 하나의 객체이므로 생성 소멸의 비용이 필요하다. 그리고 주어진 작업을 프록시 객체를 통해서 처리하게 되므로 작업과정이 더 복잡해지게 된다는 단점이 있다.
  • 3. 항목 31 : 함수를 두 개 이상의 객체(타입)에 대해 가상 함수처럼 동작하도록 만들기
  • 4. 함수 호출을 담당하는 map을 만든다. 이 맵의 키는 객체의 타입이다. 만약 어떤 함수를 처리하는데 필요한 객체가 둘이면 두 객체의 타입의 조합을 사용한다. 맵의 값은 주어진 키에 적합한 함수 포인터이다. 실제 사용할 때 함수를 호출하게 되면 우선 인자로 사용되는 객체의 타입을 확인한다. 객체 타입의 확인은 typeid().name을 통해서 처리하며, 타입들을 확인한 후에 이미 생성한 함수 테이블 map에서 적합한 함수 포인터를 얻는다. 이렇게 얻는 함수 포인터에 앞서 객체 타입을 확인했던 실제 객체들을 인자로 넣어서 함수를 실행시킨다.
  • 5. 항목 31 : 미래 지향적인 프로그래머가 되자
  • 6. 코드에 있어서 제약이 있다면 주석이나 문서와 같은 간접적인 방법이 아닌 프로그램 언어 차원에서 강제하도록 구현할 것 불필요하게 미리부터 복잡하게 만들 필요는 없다. 필요해지면 그때 구현할 것 대입과 복사 생성자는 모든 클래스에 대해서 정의 보편적으로 기대하는 결과에 맞춰서 프로그래밍 – int가 작동하는 방식을 참조하는 것이 한 방법 맞게 사용하기에는 쉽게, 틀리게 사용하는 어렵게 만들 것 이식성도 고려 할 것 unnamed namespace를 사용하거나 file-scope의 정적 변수나 함수를 선언함으로써 변경이 필요할 때 수정 범위를 줄일 수 있게 할 것
  • 7. 항목 32 : 상속관계 말단에 있지 않은 클래스는 반드시 추상 클래스로 만들자
  • 8. 구체 클래스를 상속시켜서 파생 클래스를 만들기 보다는 공통적인 부분을 추출해서 순수 가상 클래스를 각각 상속받는 것이 좋다 순수 가상 클래스는 보통 소멸자를 순수 가상함수로 만들어서 구현하는데, 순수 가상함수로 만들더라도 구현은 필요하다. 하지만 모든 것을 순수 가상 클래스로 만드는 것도 낭비이다. 결국 적당한 선을 찾는 것이 중요
  • 9. 항목 33 : 한 프로그램에서 C++와 C를 함께 사용하는 방법을 이해하자
  • 10. 네임 맹글링 C++는 가상함수라는 존재가 있다는 것이 C와 큰 차이점이다. 여기서 비롯되는 문제가 있는데 C++는 코드에서 정한 함수 이름(symbol)을 컴파일러가 바꾼다는 것이다. 즉 C++코드에서 C 라이브러리 함수를 호출했음에도 컴파일러가 함수 이름을 수정하게 되면 제대로 작동하지 않게 된다. 이를 방지하기 위해서 extern “C”를 사용한다. 이름없는 네임스페이스를 이용해 동시에 여러 함수를 지정할 수 있는 이 키워드는 컴파일러가 네임 맹글링을 하지 못하게 한다. 컴파일러에 따라서 이를 다르게 적용하고 싶다면 C++ 컴파일러에만 __cplusplus가 선언 되어 있는 점을 이용해서 #ifdef로 구현한다 정적 데이터 초기화 C++은 정적 데이터 초기화와 해제를 위해서 main()함수의 앞 뒤에 해당 작업을 하는 함수를 끼워 넣는 개념의 작업을 수행한다. 그러므로 main() 함수를 C++로 만드는 것이 좋으며, 만약 main()이 C로 되어 있다면 이를 호출하는 C++ main()을 두어서 문제를 해결 동적 메모리 할당 같은 동적 메모리 할당인 new / delete 와 malloc / free 이지만 엄연히 다르므로 구분해서 쌍을 맞춰서 사용한다 자료구조의 호환성 C와 C++ 사이에 데이터를 주고 받아야 한다면 C에서 컴파일 될 수 있는 객체 타입을 이용한다. POD라고 부르는 이 자료구조는 가상함수를 가질 수 없다.
  • 11. 항목 35 : C++ 언어의 최신 표준안과 표준 라이브러리에 대해 익숙해지자
  • 12. 책의 출판 시기상 지금과는 거리가 먼 이야기가 많아서 생략합니다.