more effective c++ 3주차

18
More Effective C++ 정정

Upload: injae-lee

Post on 29-Jul-2015

66 views

Category:

Education


4 download

TRANSCRIPT

Page 1: More effective c++ 3주차

More Effective C++ 정리

Page 2: More effective c++ 3주차

유용하고 재미있는 프로그래밍 기법들

• C++ 프로그래밍 가이드라인에 관련되어 있음

• C++ 프로그래머들이 공통적으로 겪는 고민에 대한 해결책을 ‘검증된 방법’으로 선사

• 기법 , 관용어법 , 또는 패턴이라고 부름

Page 3: More effective c++ 3주차

생성자 함수와 비멤버 함수를 가상함수처럼 만드는 방법

• 가상 생성자라는 말은 모호함

• 의미는 모호하지만 상당히 쓸모 있음

• 런타임에 디스크에서 읽은 정보에 따라 다른 타입의 객체를 만들기 때문에 이 함수를 가상 생성자라고 부를 수 있음

• 가상 생성자란 자신이 받은 입력데이터에 의존하여 다른 타입의 객체를 생성하는 함수를 말함

Page 4: More effective c++ 3주차

가상 복사 생성자• 가상 복사 생성자는 이것을 호출한 객체를 그대로 본 뜬 사본의

포인터를 반환

• 가상 복사 생성자는 해당 클래스의 진짜 복사 생성자를 호출하는 것

• 진짜 복사 생성자가 하는 복사가 얕은 복사 이면 가상 복사 생성자도 얕은 복사

• 진짜 복사 생성자가 하는 복사가 깊은 복사를 하면 , 가상 복사 생성자도 깊은 복사

Page 5: More effective c++ 3주차

클래스 인스턴스의 개수를 의도대로 제한하는 방법

• 객체를 생성시 바로 생성자가 호출

• 특정한 클래스의 객체가 만들어지지 않게 하는 갖아 쉬운 방법은 그 클래스의 생성자를 private 로 선언

• 비멤버 함수에 있어 inline 은 “이 함수는 내부 연결을 가진다“ 라는 뜻• 정적 객체를 선언한 비멤버 함수는 절대로 inline 으로 선언하면 안

된다 .

Page 6: More effective c++ 3주차

객체 생성이 이루어지는 세 가지 상황

• 자체로 생성 될 때

• 파생된 객체의 기본 클래스 부분으로 만들어질 때

• 다른 객체의 클래스 멤버로서 만들어질 때

Page 7: More effective c++ 3주차

인스턴스 기능을 가진 기본 클래스

• 인스턴스 카운팅 기능을 캡슐화해서 하나의 클래스에 넣어둘 방법이 필요

• 인스턴스 카운트값 자체를 건드리는 기능도 함께 고려

Page 8: More effective c++ 3주차

객체가 힙에만 생성되게 하기

• new 이외의 방법으로는 객체를 생성할 수 없도록 해야함

• 소멸자만 private 로 하고 생성자는 public 으로 만든 후 진짜 소멸자를 호출하는 유사 소멸자를 만드는 것 ( 객체를 소멸시킬 때에는 유사 소멸자를 호출 )

• 이 클래스를 상속하거나 이 클래스 인스턴스를 다른 객체의 멤버로 넣는 일은 한꺼번에 할 수 없음

Page 9: More effective c++ 3주차

어떤 객체가 힙에 생성되었는지 , 그렇지 않은지를 알아내는 방법

• new 이외의 방법으로는 객체를 생성할 수 없도록 해야함

• 소멸자만 private 로 하고 생성자는 public 으로 만든 후 진짜 소멸자를 호출하는 유사 소멸자를 만드는 것 ( 객체를 소멸시킬 때에는 유사 소멸자를 호출 )

• 이 클래스를 상속하거나 이 클래스 인스턴스를 다른 객체의 멤버로 넣는 일은 한꺼번에 할 수 없음

Page 10: More effective c++ 3주차

프로그램의 주소공간

• 스택은 아래로 자라고 ( 상위주소 )

• 힙은 위로자란다 ( 하위주소 )

• 정적 객체는 대게 힙의 아래쪽에 둠

Page 11: More effective c++ 3주차

스마트 포인터• C++ 언어에서 사용되는 보통의 포인터처럼 생김

• 포인터처럼 동작하고 , 많은 기능을 제공

• 리소스 관리 , 반복 코딩의 자동화 등의 다양한 용도에 사용

Page 12: More effective c++ 3주차

스마트 포인터의 사용 이유• 생성과 소멸작업을 조절할 수 있음

-> 스마트 포인터가 생성되고 소멸되는 시기를 결정가능

• 스마트 포인터는 생성될 때 기본값 NULL 을 가지기 때문에 , 값을 주지 않으면 초기화되지 않는 보통 포인터의 문제를 해결

• 객체를 가리키고 있던 최후의 포인터가 소멸될 때 자동으로 그 객체를 삭제하여 리소스 누수를 막아줌

Page 13: More effective c++ 3주차

스마트 포인터의 사용 이유• 복사와 대입 동작을 조절할 수 있음

• 스마트 포인터가 가리키고 있는 객체까지 자동으로 복사 , 대입하는 깊은 복사를 수행하도록 할 수 있음

• 포인터 자체만 복사하여 대입 할 수 있음

• 이런 동작을 전혀 이용하지 않을 수도 있음-> 프로그래머가 원하는대로 작동 가능

Page 14: More effective c++ 3주차

스마트 포인터의 사용 이유

• 역참조 동작을 조절할 수 있음

• 스마트포인터가 가리키는 객체를 가져오려고 할 때 어떤 기능을 할 것인지 결정할 수 있음

• 지연 방식의 데이터 / 명령어 가져오기를 구현하는데 스마트 포인터를 사용할 수 있음

Page 15: More effective c++ 3주차

스마트 포인터와 const

• 보통의 포인터는 const 키워드로는 포인터가 가리키는 것과 포인터 그 자체를 상수로 만들어 버리는 방법이 있음

• 스마트포인터는 약간 다르게 const 키워드를 놓을 수 있는 위치가 한 곳뿐

• 가리키는 객체가 아니라 포인터만 상수로 만들 수 있음

Page 16: More effective c++ 3주차

스마트 포인터 정리• 널 점검이나 , 일반 포인터로의 변환 , 상속 기반의 변환 , 상수 객체에 대한

포인터 지원 등의 상황에서는 스마트 포인터의 사용을 제한해야 함

• 스마트 포인터는 구현하기 까다롭고 , 이해하기도 쉽지 않으며 이후의 유지보수도 어려움

• 스마트 포인터를 사용한 코드는 , 일반 포인터에 비해 디버깅도 많이 어려움

• 일반 포인터를 완벽하게 대신할 수 있는 스마트 포인터의 구현은 불가능

• 즉 스마트 포인터는 적절한 경우에만 사용해야 함

Page 17: More effective c++ 3주차

참조 카운팅

• 참조 카운팅이란 여러 개의 객체들이 똑같은 값을 가졌으면 , 그 객체들로 하여금 그 값 나타내는 하나의 데이터를 공유하게 해서 데이터의 양을 절약하는 기법

• 힙 객체를 둘러싼 내부 정보를 유지하는 작업을 단순하게 하자는 동기

• 똑같은 값을 가지고 있는 객체들이 그 값을 하나씩 꿰어차도록 놔두는 것은 낭비 , 따라서 데이터는 하나만 공유하여 효율적으로 메모리관리 , 속도 관리 .

Page 18: More effective c++ 3주차

참조 카운팅

• 객체들이 공통된 값을 가지는 경향이 뚜렷한 경우에는 참조 카운팅을 통해 실행 시간과 메모리 공간을 절약 할 수 있음

• 값이 크고 그 값을 동시에 공유하는 객체가 많을수록 메모리 절약 효과는 커짐

• 객체 개수에 대한 값 개수의 비율이 클수록 참조 카운팅을 할 필요가 더 커짐

• 어떤 객체값을 생성하거나 소멸시키는데 많은 비용이 들거나 메모리 소모가 클 때 , 객체들이 값을 공유하지 않으면 참조 카운팅은 별 효과를 보이지 못함