SlideShare a Scribd company logo
Effective C++_2
131043 양현찬
NHN NEXT
빌려 썼으면 돌려주자
• malloc, new
• File descriptor
• Mutex lock
• Gui
• Font, Brush
• Data base connect
• Socket port
• etc….
빌린 돈 갚을 땐 객체를 이용하자
문제점
소멸자에 넣거나 스마트 포인터를 이용하자
• Createinvestment로 얻은 힙의 주소값을 객체로 넘겨주고 있다. ( RAII )
• 객체의 소멸자에서 자신이 관리하는 힙의 주소값을 해제해주면 객체의 소멸과 함께 자동으
로 소멸자가 실행된다.
• 한 주소값에 여러 개의 스마트 포인터가 참조해선 안된다. (여러 번 해제된다.)
• 스마트포인터를 복사할 경우 원본은 자동으로 null이 된다.
• 정상적인 복사를 요구하는 상황에서는 사용할 수 없다.
앙된다면, RCSP를 사용하자
• 참조 카운팅 방식 스마트 포인터
• 가비지 컬렉션과 같은 동작원리
• 어? 어디선가 본 것 같다 -> windows handle
• 서로 참조하는 상황을 피해야 한다
지금까지 마치 동적할당도 된다는 듯 이야기 했지만….
동적할당은 불가능하다!!!(컴파일러도 모른다!!)
delete와 delete[]는 다르다.
vector나 string으로 대처하자.
자원관리 클래스에게 진지해지자
스마트 포인터를 만들어보자
• auto_ptr와 shared_ptr 는 왠만하면 힙에 할당된 자원관리에 사용
하자
• Mutex타입 등의 힙에 할당되지 않는 자원 관리는 직접 만들어야
할 때가 많다
• auto_ptr와 shared_ptr 는 더 이상 참조하지 않을 경우 delete 해
버린다. 이 경우는 unlock을 해야 하는 상황과는 일치 하지 않는
다.
이럴 땐 어떻게 하지;;
1.복사를 금지한다
복사 방지 클래스를 통한 복사 방지
2.참조 카운팅을 수행(shared_ptr)
Shared_ptr 역시 참조가 풀리면 delete를 수행한다.
하지만 shared_ptr은 삭제자라는 것을 지원한다.
위와 같이 두번째 인자로 원하는 호출할 함수를 넣어준다.
3.그냥 복사해버리자
• 자원 관리 객체를 복사하면 그 자원까지 복사해버리자
• 깊은 복사라고 한다
• String타입의 경우 복사 시 사본은 새로운 힙 메모리를 가리키는
것을 볼 수 있다.
4.자원의 소유권을 옮긴다(auto_ptr)
• auto_ptr의 동작을 참고하자
자원은 외부에서 접근이 가능하도록 하자
Effective c++ 2
세상이 만만하지 않은 경우
만만하지 않은 세상을 이겨낼 방법
•명시적 변환
•암시적 변환
명시적 변환
암시적 변환
명시적 변환이 귀찮을 때도
대신 font를 원할 때는 사용할 수 없습니다. 쓰지 맙시다.
new 와 delete는 형태를 맞춰야 한다
잘못된 예
앞서 auto_ptr을 생각합시다.
delete 연산자는 ‘소멸자가 호출되는 횟수’만큼 적용됩니다
배열의 크기정보
[]를 붙여 delete연산자에 배열의 크기정보가 있음을 알려주자
주의합시다
스마트포인터를 사용하는 코드는 한 문장으로
뭐라는겨?
이렇게 쓰지 맙시다
(생성자가 explicit으로 선언되어 있어서 명시적인 변환이 필요합니다)
인자를 평가하는 부분
컴파일러마다 다르다!
• C++컴파일러는 매개변수 평가순서가 상당히 자유롭다.
• 만약 priority호출과정에서 예외가 발생했을 경우 new했던 포인
터를 유실한다.
• 자바나 C#의 경우 매개변수 평가순서가 정해져 있다.
올바른 사용
쓰기는 쉽게 엉터리로 쓰기는 어렵게
최대한 컴파일러가 알려줄 수 있도록
이걸 이렇게->
더 안전하게 하고 싶다면
우리가 잘 아는 const
Operator*의 반환값이 const로 되어있으면 컴파일 에러가 난다
int같이 쓸 수 있도록 만들자
사용자의 실수를 봉쇄하자
애초에 스마트 포인터를 반환하여 강제로 스마트 포인터를 사용하도록 하고 있다.
shared_ptr을 통해 극복하자
Shared_ptr에 null을 넣고 싶은데 두 번째 인자도 함께 쓰고 싶을 때(하지만 바로 생성자에 넘깁시다.)
교차 dll 문제를 피할 수 있다.(생성한 dll과 다른 dll에서 소멸할 때 생기는 런타임 에러현상)
a.dll에서 위 shared_ptr을 받았다고 해도 어느 dll들 사이를 이리저리 넘겨도 상관이 없다.
하지만 내부 동적 할당이 붙어있고 원시 포인터보다 느리다.
클래스설계는 타입설계이다
고려하자
• 객체 생성 및 소멸은 어떻게 이루어져야 하는가?
• 객체 초기화와 대입은 어떻게 구분할 것인가?
• 값에 의한 전달(복사 생성자)는 어떤 의미인가?
• 객체(타입)이 가질 적합한 값이란 무엇인가?
• 상속할 것인가? 어떤 함수를 가상함수로 할 것인가?
• 어떤 종류의 타입변환을 허용할 것인가? 명시적? 암시적?
• 어떤 연산자와 함수를 둘 것인가?
• 표준함수들 중 어떤 것을 허용하지 않을 것인가?
• 접근권한을 어떻게 줄 것인가?(public? protected? private?)
• 무엇을 보장하는 객체(타입)인가?
• 정말로 필요한가?
• 얼마나 일반적인가? 다른 타입과 비교해보자 (int 등)
‘값에 의한 전달’ 보다 ‘상수객체 참조자에 의한 전달’
이렇게 쓰지 맙시다
어? 이 형태 어디서 본 것 같은데;;
리션협이의 NN프레임워크
비용이 많이 들기 때문
• 우선 매개변수로 초기화 시키기 위한 복사 생성자
• 내부에 멤버 객체가 있다면 그들의 생성을 위한 생성자
• 상속받았다면 부모의 값을 읽어오기 위한 부모 생성자
• 또 부모의 내부에 멤버 객체가 있다면 그들의 생성을 위한 생…
• 무한반복
• 마지막으로 함수가 끝날 때 생성한 만큼의 소멸자들
복사손실도 일어난다
우리가 원하는 자식의 기능이 아닌 부모의 기능만 생성된다.(당연합니다.)
해결방안
Const가 중요하다.
앞서 값에 의한 전달의 경우 복사본이 생성되기 때문에 원본은 변하지 않는다.
Const를 명시하여 원본을 보호하자.
예외사항들
• 기본제공타입
• stl 반복자(iter)
• stl 함수 객체 타입(함수처럼 쓰는 객체를 stl에서 제공)
함수에서 객체의 참조자를 반환하지 말자
Rational&로 반환하지 않고 Rational로 반환하면 복사해야 해서 느려지지 않을까?
당신 일이나 걱정하시죠
지역변수의 참조자를 반환하고있다…;;
누가 delete해줄래?
(a*b) == (c*d)
멤버가 선언될 곳은 private
Effective c++ 2
Effective c++ 2
멤버 함수보다는 비멤버 비프렌드 함수
Effective c++ 2
비멤버 버전을 사용합시다
비멤버가 아니라도 namespace를 통해 해당하는 객체에 속하게 만들 수 있다
이렇게 되면 namespace에 속한 다른 객체의 함수까지도 clearBrowser함수에 포함할 수 있다
즉 자유도와 융통성을 확보하였다
Namespace활용
표준 c++ 라이브러리가 이러
한 구조이다
비프렌드 버전을 사용합시다
• friend 함수는 해당 클래스의 멤버함수와 같은 접근권한
을 갖는다
• 결국 캡슐화에 대한 영향은 멤버함수와 같다
타입변환이 모든 매개변수에 대해 적용된다면 비멤버 함수를 선언하자
이건 또 뭐야?
숫자타입의 객체를 만들 경우
숫자타입의 암시적 변환은 허용할 수 있다(explicit을 붙이지 않았다)
일단 만들어 보자
자신이 선언한 operator*연산만 되는
반쪽짜리 연산이 되고 말았다
해결방안
swap
Effective c++ 2
완전 템플릿 특수화
컴파일러에게 widget타입일 때 임을 알려주고 있다.
std안의 내용을 함부로 바꾸면 안되지만 아래 경우는 허용된다.
클래스 템플릿인 경우
둘 다 쓰고 싶은 경우
Effective c++ 2
Effective c++ 2

More Related Content

PPTX
Effective c++ 1
PPTX
More effective c++ 3
PPTX
More effective c++ 1
PPTX
More effective c++ 2
PPTX
Effective c++ 4
PDF
More effective c++ chapter1 2_dcshin
PDF
More effective c++ 항목30부터
PPT
effective c++ chapter 3~4 정리
Effective c++ 1
More effective c++ 3
More effective c++ 1
More effective c++ 2
Effective c++ 4
More effective c++ chapter1 2_dcshin
More effective c++ 항목30부터
effective c++ chapter 3~4 정리

What's hot (20)

PDF
5 6 1
PDF
Effective c++ chapter3, 4 요약본
PPTX
Effective c++ 정리 1~2
PDF
Effective c++ chapter 1,2 요약
PPTX
이펙티브 C++ 공부
PPTX
Effective c++ 1,2
PPTX
Effective C++ Chaper 1
PPTX
이펙티브 C++ 스터디
PPTX
이펙티브 C++ (7~9)
PPTX
이펙티브 C++ 5,6 장 스터디
PDF
Effective C++ Chapter 1 Summary
PPTX
모어 이펙티브 c++ 1,2장 스터디
PDF
M1 2 1
PDF
[SwiftStudy 2016] 3장. 함수
PDF
[SwiftStudy 2016] 2장. Swift 타입 파트 1
PPTX
Effective c++ 챕터 2 정리
PPTX
More effective c++ 3주차
PPTX
Effective c++ 정리 chapter 6
PPTX
Effective c++chapter3
PPTX
Mec++ chapter3,4
5 6 1
Effective c++ chapter3, 4 요약본
Effective c++ 정리 1~2
Effective c++ chapter 1,2 요약
이펙티브 C++ 공부
Effective c++ 1,2
Effective C++ Chaper 1
이펙티브 C++ 스터디
이펙티브 C++ (7~9)
이펙티브 C++ 5,6 장 스터디
Effective C++ Chapter 1 Summary
모어 이펙티브 c++ 1,2장 스터디
M1 2 1
[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 2장. Swift 타입 파트 1
Effective c++ 챕터 2 정리
More effective c++ 3주차
Effective c++ 정리 chapter 6
Effective c++chapter3
Mec++ chapter3,4
Ad

Viewers also liked (6)

PPTX
Effective c++ 3
PPTX
쿼터니언
PPTX
Mesh slice 1
PPTX
실전프로젝트 정서경 양현찬
PPTX
초등학생도 하는 그냥 DB설치
PPTX
Open gl 시작하기
Effective c++ 3
쿼터니언
Mesh slice 1
실전프로젝트 정서경 양현찬
초등학생도 하는 그냥 DB설치
Open gl 시작하기
Ad

Similar to Effective c++ 2 (20)

PPTX
Ec++ 3,4 summary
PDF
M5 1 1
PPTX
Effective cpp
PDF
More effective c++ chapter4 이후 항목 29까지
PDF
1 2 1
PPTX
Effective c++ Chapter1,2
PDF
More effective c++ chapter3 4
PDF
3 4 1
PPTX
Effective c++ 1~8장
PPTX
More effective c++ chapter1,2
PPTX
연산자 오버로딩
PPTX
More effective c++ Chap1~2
PPTX
모어 이펙티브 c++ 5장 스터디
PDF
Direct x 12 초기화
PDF
Effective c++ chapter1 2_dcshin
PDF
Momenti Seminar - A Tour of Rust, Part 2
PDF
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
PPTX
Effective C++ 정리 chapter 3
PDF
임태현, MMO 서버 개발 포스트 모템, NDC2012
PPTX
모어이펙티브 C++ 3,4장 예외, 효율 스터디
Ec++ 3,4 summary
M5 1 1
Effective cpp
More effective c++ chapter4 이후 항목 29까지
1 2 1
Effective c++ Chapter1,2
More effective c++ chapter3 4
3 4 1
Effective c++ 1~8장
More effective c++ chapter1,2
연산자 오버로딩
More effective c++ Chap1~2
모어 이펙티브 c++ 5장 스터디
Direct x 12 초기화
Effective c++ chapter1 2_dcshin
Momenti Seminar - A Tour of Rust, Part 2
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Effective C++ 정리 chapter 3
임태현, MMO 서버 개발 포스트 모템, NDC2012
모어이펙티브 C++ 3,4장 예외, 효율 스터디

Effective c++ 2