SlideShare une entreprise Scribd logo
1  sur  37
EC++ 3,4 summary
NHN NEXT 남세현
EC++ 3,4 summary
NHN NEXT 남세현
자원 관리
• 자원, 가장 중요한 것은?
– “가져다 썼으면 해제해야 한다”
• 객체에 기반하여 자원을 관리하는 방법을
알아보자.
스마트 포인터
• 스마트 포인터(auto_ptr)
– 소멸자가 자동으로 delete를 실행해 줌
• 예시
Character* pCh = createCharacter();
VS
std::auto_ptr<Character>pCh(createCharacter()
);
• 단, 복사가 자유롭지 못하다
– 다음장…
스마트 포인터
• 단, 복사가 자유롭지 못하다
– 복사하는 객체만 해당 자원의 유일한 소유권을 가
질 수 있다.
– 원래 포인터는 NULL을 가리키게 된다.
• ex)
pCh1가 캐릭터를 가리키고 있다면
std::auto_ptr<Character>pCh2(pCh1);
// pCh1는 null이 됨. pCh2는 pCh1이 가리키던 객체
를 가리킴
pCh1 = pCh2; // 다시 pCh2는 null이 됨. pCh1은
pCh2가 가리키던 객체를 가리킴
참조 카운팅 방식 스마트 포인터
• 몇 명이 참조하고 있는지 숫자를 셈
• 0명이 참조하고 있으면 자동으로
객체 삭제해주는 스마트 포인터
– 가비지 컬렉션과 비슷함.
• std::tr1::shared_ptr
• 사용방법 auto_ptr와 동일
• 단, 위 스마트 포인터들은 배열 객체에게는
사용하지 말 것! 배열 삭제 지원 안함.
참조 카운팅 방식 스마트 포인터
• 몇 명이 참조하고 있는지 숫자를 셈
• 0명이 참조하고 있으면 자동으로
객체 삭제해주는 스마트 포인터
– 가비지 컬렉션과 비슷함.
• std::tr1::shared_ptr
• 사용방법 auto_ptr와 동일
• 단, 위 스마트 포인터들은 배열 객체에게는
사용하지 말 것! 배열 삭제 지원 안함.
RAII같은 객체 만들어보기
• 객체를 복사하면 어떻게 해야하나..?
– 어떤 동작이 이루어져야 하는지 혼돈의카오스
1. 복사를 금지한다.
– 복사 연산을 private 멤버로 만듬.
2. 관리하는 자원에 대해 shared_ptr 사용
3. 아예 깊은 복사를 해줘라
4. 소유권을 아예 넘겨줘라(auto_ptr처럼)
RAII같은 객체 만들어보기
• 객체를 복사하면 어떻게 해야하나..?
– 어떤 동작이 이루어져야 하는지 혼돈의카오스
1. 복사를 금지한다.
– 복사 연산을 private 멤버로 만듬.
2. 관리하는 자원에 대해 shared_ptr 사용
3. 아예 깊은 복사를 해줘라
4. 소유권을 아예 넘겨줘라(auto_ptr처럼)
RAII같은 객체 만들어보기
• 난 이렇게 호출하고 싶은데요?
– int hp = GetHP(pCh);
– 에러! pCh는 Character*가 아니라
tr1::shared_ptr<Character> 타입이라서…
• Get이라는 멤버 함수 하나 만들자!
– Character* GetHP() { return hp_; }
• 혹은 암시적 변환 함수를 사용하자
– Operator Character() const { return ch; }
Ex ) LevelUpCharacter(pCh, 22);
New, Delete
• delete와 delete[ ] 는 다르다!
– std::string *stringPtr1 = new std::string;
– std::string *stringPtr2 = new std::string[9];
– delete stringPtr1;
– delete [] stringPtr2;
• 대개 배열 원소의 개수가 힙 메모리에 들어
가기 때문!
• 그냥 vector 사용합시다…
조심!
• New로 생성한 객체를 스마트 포인터에 넣는 코드
는 별도의 한 문장으로 합시다!
• processSomething(std::tr1:::shared_ptr<Character
>(new Character), createSomething());
이런거 하지 말자구요!
• 이유 : 컴파일러 제조사마다 param func의 호출 순
서가 다름.
디버깅 무지무지 힘들어짐.
• So,
std::tr1:::shared_ptr<Character> pCh(new Character);
processSomething( pch, createSomething() );
인터페이스
• „제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵
게!‟
• Class … Date(int month, int day, int year)
– Date d(30, 3, 1995);
– Date d(3, 40, 1995);
– 둘 다 그래선 안되는데… 에러는 안남!
• Struct Day, Month, Year
– Date d(Month(3), Day(30), Year(1995));
• 사람이 실수 하지 않도록 도와주자.
실수, 실수, 실수! 줄여보자!!
• Investment* createInvestment();
• 가능한 실수
– 포인터 삭제를 잊어버리거나
– Delete를 두 번 이상 해버리거나
• 스마트 포인터를 반환시켜보자
• std::tr1:shared_ptr<Investment> createInvestment();
• 삭제하는것을 깜빡해도 불상사 X
자원 삭제하는 함수는 어떄?
• getRidOfInvestment 라는 함수
• 깔끔해 보이지만…
– 저 함수가 있다는 것을 까먹고 delete쓰면..?
• getRid…ment 와 tr1::shared_ptr를 묶자!
• std::tr1::shared_ptr<Investment>
pInv( static_cast<Investment*>(0), getRidOfInvestment );
• 저 함수를 createInvestment에서 실행!
tr1::shared_ptr의 장점
• 교차 DLL 문제
– 객체 생성시 DLL의 new를 사용했는데
다른 DLL의 delete를 쓸 경우
• tr1::shared_ptr은 new를 사용한 DLL의
delete를 사용하도록 구현되어 있음.
• DLL 꼬이는 문제 걱정 끝~!
잊지 말자
• 좋은 인터페이스란?
– 제대로 쓰기엔 편하고
– 엉터리로 쓰기엔 어렵게!
• 사용자 실수를 방지해주자!
– 더이상 자원 관리 작업을 사용자 책임으로
내몰지 말자!
클래스 설계를 타입 설계 하듯
• 좋은 클래스의 조건 3
1. 문법이 자연스럽고
2. 의미구조가 직관적이며
3. 효율적인 구현
객체 설계,
하나 하나 따져가면서 신경써보자
1. 객체 생성 및 소멸은 어떻게 이뤄져야 하
는가?
2. 객체 초기화는 객체 대입과 어떻게 다른
가?
– 초기화랑 대입을 헷갈리지 말자!
3. 값에 의한 전달은 어떤 것을 의미하는가?
– 값에 의한 전달을 구현하는 쪽은 복사 생성자
객체 설계,
하나 하나 따져가면서 신경써보자
4. 값들에 대한 제약을 무엇으로 둘 것인가?
– 데이터 멤버의 몇 가지 조합 값만은 반드시 유
효해야 함!
5. 기존 클래스 상속 계통에 맞출 것인가?
– 상속할 것인가, 멤버 함수가 가상인가 비가상
인가...
6. 어떤 종류의 타입 변환을 허용할 것인가?
– 필요하면 타입 변환 함수나 비명시호출 등을
구현해놓자.
객체 설계,
하나 하나 따져가면서 신경써보자
7. 어떤 연산자, 함수를 두어야 할까?
8. 표준 함수들 중 어떤걸 허용하지 말까?
– 무엇을 private로 선언해야 할까?
9. 접근 권한을 어느 쪽에 줄 것인가?
– public, private, protected...
객체 설계,
하나 하나 따져가면서 신경써보자
10. 비선언 인터페이스로는 뭘 둘 것인가?
11. 얼마나 일반적인가?
– 혹시 새로운 클래스를 정의하는게 아니라
새로운 클래스 템플릿을 정의해야 하는건 아닌
가?
12. 정말로 필요한가?
– 기존 클래스 기능 아쉬워서 파생 클래스 만들
고 있진 않은가? 그렇다면 그냥 비멤버 함수
를 만들자.
상수객체 참조자에 의한 전달
• 값에 의한 전달
– 실제 인자의 „사본‟이 전달됨
– 은근 고비용의 연산
– 복사 생성자 한 번, 소멸자 한 번!
– 멤버 변수들의 생성자들도... 소멸자들도!!!
• 상수객체 참조자가 출동한다면!?
– void func(const Student& s);
– 생성자, 소멸자 전혀 호출 안됨.
– 복사에 의한 손실 문제도 없어짐.
상수객체 참조자에 의한 전달
• 기본 제공 타입들은 값으로 전달해도 좋아
– 크기도 작고... 뭐 딱히 문제는 없잖아?
• 크기가 작은 객체들을 값으로 넘겨도..좋
아?
– 안됨.
– 생각보다 복사 생성자가 비쌀 수 있거든.
• 그럼 크기도 작고 복사 생성자도 작다면?
– 어떤 컴파일러에서는 기본 제공 타입은 레지스
터에 들어가지만 객체는 전혀 안들어가기도
함. 그냥 하지마 좀!!
참조자를 반환하려고 하진 마!
const A& func(param)
• 객체 생성, 소멸에 드는 비용은 어찌하나?
– 그래? 참조자를 반환하면 비용 부담이 없지 않
을까??
• 그럼 그 참조할 객체는 누가 만들건데...
참조자를 반환하려고 하진 마!
const A& func(param){
A res(param);
return res;
}
• 생성자 부르는거 싫어서 시작한 일인데?
– 아직도 생성자가 있음.
• res는 지역객체인데?
– 함수 끝나면 사라짐.
참조자를 반환하려고 하진 마!
const A func(param){
A *res = new A(param);
return res;
}
• 생성자 부르는거 싫다니깐!
• 그리고 누가 delete 시켜줄건데?
참조자를 반환하려고 하진 마!
const A func(param){
static A res;
res = ...
return res;
}
• 스레드 안전성 문제
• func(p1) == func(p2)는 항상 참이오. 헐...
참조자를 반환하려고 하진 마!
그냥 새로운 객체를 반환시키자
inline const A func(param){
return A(param);
}
• 생성자... 쓰는 비용이 싫다매?
– 어쩔 수 없어. 최소한의 비용이야.
• 게다가 대부분 컴파일러에서 이런 부분은 최적화
되어있음
• 제대로 돌아가게 만드는데 신경 쓰자.
• 참조가 좋다고 해서
무조건 다 참조로만 하려곤 하지 말고!
DATA MEMBER
SHOULD BE in PRIVATE
• 왜 Public에다가 두면 안되죠?
– 문법적으로. 죄다 함수로 접근하게 하면 ()같은
거 써야하는지 안써야하는지 안헛갈려~
– 접근성에 대한 정교한 제어 가능
– 캡슐화.
– 로그찍기도 편하고
– 그 멤버변수를 변경하기가 매우 힘들어진다
• 그렇다고 protected는 된다는건 아니야!
– 똑같어... 잘 생각해바!
비멤버 비프렌드 Func
• 상식적으로
– 데이터와 그 데이터 이용하는 함수는 붙어있어
야해!
– 정말... 그렇다고 생각하나요?
• 캡슐화를 한다는 것
– 바깥에서 볼 수 없다는 것
– 해당 기능을 바꿀 때 유연성이 증가
비멤버 비프렌드 Func
• 멤버 함수들은
– 내부 private 함수들, 프렌드 함수들 등등 사용
가능해
• 비멤버 비프렌드 함수들은
– 당연히 내부 private 함수 전혀 불가능해!
– 어떻게 보면 더 캡슐화 된거 아니겠어?
• 그렇다고 다른 클래스의 멤버도 아닐 필요
는 없어!
– 그것은 딱히 캡슐화에 영향을 주지 않기 때문.
비멤버 비프렌드 Func
• 그 비멤버 함수들을 어떻게 쉽게 관리하지?
– 해당 클래스와 같은 네임스페이스 안에 두는
것도 좋은 방법
• 컴파일 의존성이 고민된다면
– 네임 스페이스만 공유하고
– 서로 다른 .h 파일에서 작업해도 되지!
매개변수, 타입 변환 해야하면
그 함수는 100% 비멤버
class A { .... operator * (const A& rhs) } }
...
A a, b;
A c = a * b; ---- OK
int i
A d = a * i; ---- OK
A e = i * a; ---- NO
매개변수, 타입 변환 해야하면
그 함수는 100% 비멤버
int i;
A d = a * i; ---- OK
A e = i * a; ---- NO
• 왜 d는 되는 것일까?
– 컴파일러님은 알고계신대!
• A가 와야하는데 int형이 온 경우, 컴파일러가 알아채고
혹시 A의 생성자 중에 int형으로 가능한 게 있으면 그것
으로 암시적 타입 변환을 함.
– 물론 명시적 생성자를 만들면 에러~!
매개변수, 타입 변환 해야하면
그 함수는 100% 비멤버
int i;
A d = a * i; ---- OK
A e = i * a; ---- NO
• 왜 d는 되는 것일까?
– 컴파일러님은 알고계신대!
• A가 와야하는데 int형이 온 경우, 컴파일러가 알아채고
혹시 A의 생성자 중에 int형으로 가능한 게 있으면 그것
으로 암시적 타입 변환을 함.
– 물론 명시적 생성자를 만들면 에러~!
매개변수, 타입 변환 해야하면
그 함수는 100% 비멤버
class A { .... operator * (const A& rhs) } }
const A operator* ( const A& lhs, const A& rhs)
{..};
int i;
A d = a * i; ---- OK
A e = i * a; ---- OK
• 비멤버 함수로 만들어 놓으면 가능하지롱!
– lhs, rhs 둘다 암시적 타입 변환 수행하도록 냅둬!

Contenu connexe

Tendances

이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터Dong Chan Shin
 
You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2Kiwoong Kwon
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2현찬 양
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리Injae Lee
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2세빈 정
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1연우 김
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3현찬 양
 
M1 2 1
M1 2 1M1 2 1
M1 2 1nexthw
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1현찬 양
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리연우 김
 
Effective cpp
Effective cppEffective cpp
Effective cppTonyCms
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1현찬 양
 
M5 1 1
M5 1 1M5 1 1
M5 1 1nexthw
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6연우 김
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식TonyCms
 
자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스Lee Dong Wook
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2Injae Lee
 
Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3연우 김
 
비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5민태 김
 

Tendances (20)

이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2
 
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
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3
 
M1 2 1
M1 2 1M1 2 1
M1 2 1
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1
 
M5 1 1
M5 1 1M5 1 1
M5 1 1
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3
 
비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5
 

En vedette

Av foundation record
Av foundation recordAv foundation record
Av foundation recordEunjoo Im
 
iOS Auto Layout
iOS Auto LayoutiOS Auto Layout
iOS Auto LayoutEunjoo Im
 
블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]
블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]
블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]재영 천
 
stored procedure2 + jdbc
stored procedure2 + jdbcstored procedure2 + jdbc
stored procedure2 + jdbcHoyoung Jung
 
Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17Sehyeon Nam
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create TableHoyoung Jung
 
The Summary Response Assignment
The Summary Response AssignmentThe Summary Response Assignment
The Summary Response Assignmentrlewitzki
 
iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)Theodore(Yongbin) Cha
 
Neural stream
Neural streamNeural stream
Neural streamMk Kim
 
C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법선협 이
 
[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기
[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기
[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기NAVER D2
 
iOS human interface guidelines(HIG)
iOS human interface guidelines(HIG)iOS human interface guidelines(HIG)
iOS human interface guidelines(HIG)Sun Jin Choi
 
데이터베이스 베이직 소개
데이터베이스 베이직 소개데이터베이스 베이직 소개
데이터베이스 베이직 소개Hoyoung Jung
 
Ppt색채학
Ppt색채학Ppt색채학
Ppt색채학michi96
 
[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로NAVER D2
 
Deview 2013 - 나는 왜 개발자인데 자신이 없을까?
Deview 2013 - 나는 왜 개발자인데자신이 없을까?Deview 2013 - 나는 왜 개발자인데자신이 없을까?
Deview 2013 - 나는 왜 개발자인데 자신이 없을까?Minsuk Lee
 
PSFK Future of Retail 2016 Summary Report
PSFK Future of Retail 2016 Summary ReportPSFK Future of Retail 2016 Summary Report
PSFK Future of Retail 2016 Summary ReportPSFK
 
사업계획서 작성법 (How to write a Business Plan)
사업계획서 작성법 (How to write a Business Plan)사업계획서 작성법 (How to write a Business Plan)
사업계획서 작성법 (How to write a Business Plan)Matthew Lee
 

En vedette (20)

Av foundation record
Av foundation recordAv foundation record
Av foundation record
 
D2 ppt
D2 pptD2 ppt
D2 ppt
 
iOS Auto Layout
iOS Auto LayoutiOS Auto Layout
iOS Auto Layout
 
블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]
블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]
블로그 상위 1% 특강 / SNS전문가 천재영 - 강남 토즈 강연 [온오프믹스 모임]
 
stored procedure2 + jdbc
stored procedure2 + jdbcstored procedure2 + jdbc
stored procedure2 + jdbc
 
Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create Table
 
The Summary Response Assignment
The Summary Response AssignmentThe Summary Response Assignment
The Summary Response Assignment
 
iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)
 
Neural stream
Neural streamNeural stream
Neural stream
 
C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법
 
[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기
[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기
[D2 campus seminar]진지할 수도 있는 자료구조와 알고리즘(듬) 이야기
 
iOS human interface guidelines(HIG)
iOS human interface guidelines(HIG)iOS human interface guidelines(HIG)
iOS human interface guidelines(HIG)
 
데이터베이스 베이직 소개
데이터베이스 베이직 소개데이터베이스 베이직 소개
데이터베이스 베이직 소개
 
Ppt색채학
Ppt색채학Ppt색채학
Ppt색채학
 
[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로
 
Deview 2013 - 나는 왜 개발자인데 자신이 없을까?
Deview 2013 - 나는 왜 개발자인데자신이 없을까?Deview 2013 - 나는 왜 개발자인데자신이 없을까?
Deview 2013 - 나는 왜 개발자인데 자신이 없을까?
 
Summary Writing
Summary WritingSummary Writing
Summary Writing
 
PSFK Future of Retail 2016 Summary Report
PSFK Future of Retail 2016 Summary ReportPSFK Future of Retail 2016 Summary Report
PSFK Future of Retail 2016 Summary Report
 
사업계획서 작성법 (How to write a Business Plan)
사업계획서 작성법 (How to write a Business Plan)사업계획서 작성법 (How to write a Business Plan)
사업계획서 작성법 (How to write a Business Plan)
 

Similaire à Ec++ 3,4 summary

함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍QooJuice
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2문익 장
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩수빈 박
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++Min-soo Park
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디quxn6
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디quxn6
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4문익 장
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL studySeo Dong-yu
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinDong Chan Shin
 
More effective c++ 3주차
More effective c++ 3주차More effective c++ 3주차
More effective c++ 3주차Injae Lee
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4Dong Chan Shin
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Dong Chan Shin
 
More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지Dong Chan Shin
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화QooJuice
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디quxn6
 

Similaire à Ec++ 3,4 summary (20)

함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
 
3 4 1
3 4 13 4 1
3 4 1
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL study
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
More effective c++ 3주차
More effective c++ 3주차More effective c++ 3주차
More effective c++ 3주차
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지
 
Boost
BoostBoost
Boost
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 

Plus de Sehyeon Nam

Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11Sehyeon Nam
 
Game programing gems 1.11
Game programing gems 1.11Game programing gems 1.11
Game programing gems 1.11Sehyeon Nam
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10Sehyeon Nam
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Sehyeon Nam
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuSehyeon Nam
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획Sehyeon Nam
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 Sehyeon Nam
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티Sehyeon Nam
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 Sehyeon Nam
 
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 Sehyeon Nam
 
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법Sehyeon Nam
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법Sehyeon Nam
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmarySehyeon Nam
 

Plus de Sehyeon Nam (13)

Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11
 
Game programing gems 1.11
Game programing gems 1.11Game programing gems 1.11
Game programing gems 1.11
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong Yu
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
 
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
 
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmary
 

Ec++ 3,4 summary

  • 1. EC++ 3,4 summary NHN NEXT 남세현
  • 2. EC++ 3,4 summary NHN NEXT 남세현
  • 3. 자원 관리 • 자원, 가장 중요한 것은? – “가져다 썼으면 해제해야 한다” • 객체에 기반하여 자원을 관리하는 방법을 알아보자.
  • 4. 스마트 포인터 • 스마트 포인터(auto_ptr) – 소멸자가 자동으로 delete를 실행해 줌 • 예시 Character* pCh = createCharacter(); VS std::auto_ptr<Character>pCh(createCharacter() ); • 단, 복사가 자유롭지 못하다 – 다음장…
  • 5. 스마트 포인터 • 단, 복사가 자유롭지 못하다 – 복사하는 객체만 해당 자원의 유일한 소유권을 가 질 수 있다. – 원래 포인터는 NULL을 가리키게 된다. • ex) pCh1가 캐릭터를 가리키고 있다면 std::auto_ptr<Character>pCh2(pCh1); // pCh1는 null이 됨. pCh2는 pCh1이 가리키던 객체 를 가리킴 pCh1 = pCh2; // 다시 pCh2는 null이 됨. pCh1은 pCh2가 가리키던 객체를 가리킴
  • 6. 참조 카운팅 방식 스마트 포인터 • 몇 명이 참조하고 있는지 숫자를 셈 • 0명이 참조하고 있으면 자동으로 객체 삭제해주는 스마트 포인터 – 가비지 컬렉션과 비슷함. • std::tr1::shared_ptr • 사용방법 auto_ptr와 동일 • 단, 위 스마트 포인터들은 배열 객체에게는 사용하지 말 것! 배열 삭제 지원 안함.
  • 7. 참조 카운팅 방식 스마트 포인터 • 몇 명이 참조하고 있는지 숫자를 셈 • 0명이 참조하고 있으면 자동으로 객체 삭제해주는 스마트 포인터 – 가비지 컬렉션과 비슷함. • std::tr1::shared_ptr • 사용방법 auto_ptr와 동일 • 단, 위 스마트 포인터들은 배열 객체에게는 사용하지 말 것! 배열 삭제 지원 안함.
  • 8. RAII같은 객체 만들어보기 • 객체를 복사하면 어떻게 해야하나..? – 어떤 동작이 이루어져야 하는지 혼돈의카오스 1. 복사를 금지한다. – 복사 연산을 private 멤버로 만듬. 2. 관리하는 자원에 대해 shared_ptr 사용 3. 아예 깊은 복사를 해줘라 4. 소유권을 아예 넘겨줘라(auto_ptr처럼)
  • 9. RAII같은 객체 만들어보기 • 객체를 복사하면 어떻게 해야하나..? – 어떤 동작이 이루어져야 하는지 혼돈의카오스 1. 복사를 금지한다. – 복사 연산을 private 멤버로 만듬. 2. 관리하는 자원에 대해 shared_ptr 사용 3. 아예 깊은 복사를 해줘라 4. 소유권을 아예 넘겨줘라(auto_ptr처럼)
  • 10. RAII같은 객체 만들어보기 • 난 이렇게 호출하고 싶은데요? – int hp = GetHP(pCh); – 에러! pCh는 Character*가 아니라 tr1::shared_ptr<Character> 타입이라서… • Get이라는 멤버 함수 하나 만들자! – Character* GetHP() { return hp_; } • 혹은 암시적 변환 함수를 사용하자 – Operator Character() const { return ch; } Ex ) LevelUpCharacter(pCh, 22);
  • 11. New, Delete • delete와 delete[ ] 는 다르다! – std::string *stringPtr1 = new std::string; – std::string *stringPtr2 = new std::string[9]; – delete stringPtr1; – delete [] stringPtr2; • 대개 배열 원소의 개수가 힙 메모리에 들어 가기 때문! • 그냥 vector 사용합시다…
  • 12. 조심! • New로 생성한 객체를 스마트 포인터에 넣는 코드 는 별도의 한 문장으로 합시다! • processSomething(std::tr1:::shared_ptr<Character >(new Character), createSomething()); 이런거 하지 말자구요! • 이유 : 컴파일러 제조사마다 param func의 호출 순 서가 다름. 디버깅 무지무지 힘들어짐. • So, std::tr1:::shared_ptr<Character> pCh(new Character); processSomething( pch, createSomething() );
  • 13. 인터페이스 • „제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵 게!‟ • Class … Date(int month, int day, int year) – Date d(30, 3, 1995); – Date d(3, 40, 1995); – 둘 다 그래선 안되는데… 에러는 안남! • Struct Day, Month, Year – Date d(Month(3), Day(30), Year(1995)); • 사람이 실수 하지 않도록 도와주자.
  • 14. 실수, 실수, 실수! 줄여보자!! • Investment* createInvestment(); • 가능한 실수 – 포인터 삭제를 잊어버리거나 – Delete를 두 번 이상 해버리거나 • 스마트 포인터를 반환시켜보자 • std::tr1:shared_ptr<Investment> createInvestment(); • 삭제하는것을 깜빡해도 불상사 X
  • 15. 자원 삭제하는 함수는 어떄? • getRidOfInvestment 라는 함수 • 깔끔해 보이지만… – 저 함수가 있다는 것을 까먹고 delete쓰면..? • getRid…ment 와 tr1::shared_ptr를 묶자! • std::tr1::shared_ptr<Investment> pInv( static_cast<Investment*>(0), getRidOfInvestment ); • 저 함수를 createInvestment에서 실행!
  • 16. tr1::shared_ptr의 장점 • 교차 DLL 문제 – 객체 생성시 DLL의 new를 사용했는데 다른 DLL의 delete를 쓸 경우 • tr1::shared_ptr은 new를 사용한 DLL의 delete를 사용하도록 구현되어 있음. • DLL 꼬이는 문제 걱정 끝~!
  • 17. 잊지 말자 • 좋은 인터페이스란? – 제대로 쓰기엔 편하고 – 엉터리로 쓰기엔 어렵게! • 사용자 실수를 방지해주자! – 더이상 자원 관리 작업을 사용자 책임으로 내몰지 말자!
  • 18. 클래스 설계를 타입 설계 하듯 • 좋은 클래스의 조건 3 1. 문법이 자연스럽고 2. 의미구조가 직관적이며 3. 효율적인 구현
  • 19. 객체 설계, 하나 하나 따져가면서 신경써보자 1. 객체 생성 및 소멸은 어떻게 이뤄져야 하 는가? 2. 객체 초기화는 객체 대입과 어떻게 다른 가? – 초기화랑 대입을 헷갈리지 말자! 3. 값에 의한 전달은 어떤 것을 의미하는가? – 값에 의한 전달을 구현하는 쪽은 복사 생성자
  • 20. 객체 설계, 하나 하나 따져가면서 신경써보자 4. 값들에 대한 제약을 무엇으로 둘 것인가? – 데이터 멤버의 몇 가지 조합 값만은 반드시 유 효해야 함! 5. 기존 클래스 상속 계통에 맞출 것인가? – 상속할 것인가, 멤버 함수가 가상인가 비가상 인가... 6. 어떤 종류의 타입 변환을 허용할 것인가? – 필요하면 타입 변환 함수나 비명시호출 등을 구현해놓자.
  • 21. 객체 설계, 하나 하나 따져가면서 신경써보자 7. 어떤 연산자, 함수를 두어야 할까? 8. 표준 함수들 중 어떤걸 허용하지 말까? – 무엇을 private로 선언해야 할까? 9. 접근 권한을 어느 쪽에 줄 것인가? – public, private, protected...
  • 22. 객체 설계, 하나 하나 따져가면서 신경써보자 10. 비선언 인터페이스로는 뭘 둘 것인가? 11. 얼마나 일반적인가? – 혹시 새로운 클래스를 정의하는게 아니라 새로운 클래스 템플릿을 정의해야 하는건 아닌 가? 12. 정말로 필요한가? – 기존 클래스 기능 아쉬워서 파생 클래스 만들 고 있진 않은가? 그렇다면 그냥 비멤버 함수 를 만들자.
  • 23. 상수객체 참조자에 의한 전달 • 값에 의한 전달 – 실제 인자의 „사본‟이 전달됨 – 은근 고비용의 연산 – 복사 생성자 한 번, 소멸자 한 번! – 멤버 변수들의 생성자들도... 소멸자들도!!! • 상수객체 참조자가 출동한다면!? – void func(const Student& s); – 생성자, 소멸자 전혀 호출 안됨. – 복사에 의한 손실 문제도 없어짐.
  • 24. 상수객체 참조자에 의한 전달 • 기본 제공 타입들은 값으로 전달해도 좋아 – 크기도 작고... 뭐 딱히 문제는 없잖아? • 크기가 작은 객체들을 값으로 넘겨도..좋 아? – 안됨. – 생각보다 복사 생성자가 비쌀 수 있거든. • 그럼 크기도 작고 복사 생성자도 작다면? – 어떤 컴파일러에서는 기본 제공 타입은 레지스 터에 들어가지만 객체는 전혀 안들어가기도 함. 그냥 하지마 좀!!
  • 25. 참조자를 반환하려고 하진 마! const A& func(param) • 객체 생성, 소멸에 드는 비용은 어찌하나? – 그래? 참조자를 반환하면 비용 부담이 없지 않 을까?? • 그럼 그 참조할 객체는 누가 만들건데...
  • 26. 참조자를 반환하려고 하진 마! const A& func(param){ A res(param); return res; } • 생성자 부르는거 싫어서 시작한 일인데? – 아직도 생성자가 있음. • res는 지역객체인데? – 함수 끝나면 사라짐.
  • 27. 참조자를 반환하려고 하진 마! const A func(param){ A *res = new A(param); return res; } • 생성자 부르는거 싫다니깐! • 그리고 누가 delete 시켜줄건데?
  • 28. 참조자를 반환하려고 하진 마! const A func(param){ static A res; res = ... return res; } • 스레드 안전성 문제 • func(p1) == func(p2)는 항상 참이오. 헐...
  • 29. 참조자를 반환하려고 하진 마! 그냥 새로운 객체를 반환시키자 inline const A func(param){ return A(param); } • 생성자... 쓰는 비용이 싫다매? – 어쩔 수 없어. 최소한의 비용이야. • 게다가 대부분 컴파일러에서 이런 부분은 최적화 되어있음 • 제대로 돌아가게 만드는데 신경 쓰자. • 참조가 좋다고 해서 무조건 다 참조로만 하려곤 하지 말고!
  • 30. DATA MEMBER SHOULD BE in PRIVATE • 왜 Public에다가 두면 안되죠? – 문법적으로. 죄다 함수로 접근하게 하면 ()같은 거 써야하는지 안써야하는지 안헛갈려~ – 접근성에 대한 정교한 제어 가능 – 캡슐화. – 로그찍기도 편하고 – 그 멤버변수를 변경하기가 매우 힘들어진다 • 그렇다고 protected는 된다는건 아니야! – 똑같어... 잘 생각해바!
  • 31. 비멤버 비프렌드 Func • 상식적으로 – 데이터와 그 데이터 이용하는 함수는 붙어있어 야해! – 정말... 그렇다고 생각하나요? • 캡슐화를 한다는 것 – 바깥에서 볼 수 없다는 것 – 해당 기능을 바꿀 때 유연성이 증가
  • 32. 비멤버 비프렌드 Func • 멤버 함수들은 – 내부 private 함수들, 프렌드 함수들 등등 사용 가능해 • 비멤버 비프렌드 함수들은 – 당연히 내부 private 함수 전혀 불가능해! – 어떻게 보면 더 캡슐화 된거 아니겠어? • 그렇다고 다른 클래스의 멤버도 아닐 필요 는 없어! – 그것은 딱히 캡슐화에 영향을 주지 않기 때문.
  • 33. 비멤버 비프렌드 Func • 그 비멤버 함수들을 어떻게 쉽게 관리하지? – 해당 클래스와 같은 네임스페이스 안에 두는 것도 좋은 방법 • 컴파일 의존성이 고민된다면 – 네임 스페이스만 공유하고 – 서로 다른 .h 파일에서 작업해도 되지!
  • 34. 매개변수, 타입 변환 해야하면 그 함수는 100% 비멤버 class A { .... operator * (const A& rhs) } } ... A a, b; A c = a * b; ---- OK int i A d = a * i; ---- OK A e = i * a; ---- NO
  • 35. 매개변수, 타입 변환 해야하면 그 함수는 100% 비멤버 int i; A d = a * i; ---- OK A e = i * a; ---- NO • 왜 d는 되는 것일까? – 컴파일러님은 알고계신대! • A가 와야하는데 int형이 온 경우, 컴파일러가 알아채고 혹시 A의 생성자 중에 int형으로 가능한 게 있으면 그것 으로 암시적 타입 변환을 함. – 물론 명시적 생성자를 만들면 에러~!
  • 36. 매개변수, 타입 변환 해야하면 그 함수는 100% 비멤버 int i; A d = a * i; ---- OK A e = i * a; ---- NO • 왜 d는 되는 것일까? – 컴파일러님은 알고계신대! • A가 와야하는데 int형이 온 경우, 컴파일러가 알아채고 혹시 A의 생성자 중에 int형으로 가능한 게 있으면 그것 으로 암시적 타입 변환을 함. – 물론 명시적 생성자를 만들면 에러~!
  • 37. 매개변수, 타입 변환 해야하면 그 함수는 100% 비멤버 class A { .... operator * (const A& rhs) } } const A operator* ( const A& lhs, const A& rhs) {..}; int i; A d = a * i; ---- OK A e = i * a; ---- OK • 비멤버 함수로 만들어 놓으면 가능하지롱! – lhs, rhs 둘다 암시적 타입 변환 수행하도록 냅둬!