방프리

16.07.20. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목4) 본문

C++/Effective C++

16.07.20. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목4)

방프리 2020. 1. 4. 02:11

항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화 하자!!

 

객체(또는 변수)를 선언 시 초기화를 하지 않을 경우 알 수 없는 곳에서 터지기 마련이다.

 

이를 방지하려면 항상 객체를 선언 시 초기화 하는 것을 잊지 말아야 한다.

 

특히 class의 경우 생성자 부분에서 대입으로 하는 것이 아닌 초기화 리스트를

 

사용하여 반드시 초기화를 시켜주어야 한다. 

(초기화 리스트를 작성 시 멤버 변수 선언 순으로 초기화를 해준다면 당신은 굿 코더)

 

만약 멤버변수의 양이 너무 많아 초기화 리스트가 보기 싫다면 대입으로도 오류를 막을 수 있는

 

변수를 따로 모아 Default값으로 넣어주어도 괜찮다.

 

But, 주의해야할 사항 한 가지 바로 비지역 정적 객체의 초기화 순서는 개별 번역 단위에서 정해진다는

 

사실이다.

 

책의 예제에서는 FileSystem과 Directory를 이용하여 설명하였는데 쉽게 설명하자면 

 

초기화 되지 않은 객체를 무작정 사용하려고 든다면 분명 오류를 발생시킬 것이라는 소리다.

 

우리는 항상 객체 선언 = 초기화 라는 사실을 머리 속에 박고 살아야 한다는 뜻이다.

 

선언 하되 초기화 하지 않은 객체를 눈독 들이지도!! 사용하지도 말아야 한다!!

 

(* 이 현상에 직면하게 되었고 문제를 해결해야 한다면 Singleton 방식을 참조하면 좋다)

 

이것만은 잊지 말자!

 

* 기본제공 타입의 객체는 직접 손으로 초기화를 한다. 경우에 따라 저절로 되기도 하고 안되기도 

  하기 때문이다.

 

* 생성자에서는, 데이터 멤버에 대한 대입문을 생성자 본문 내부에 넣는 방법으로 멤버를 초기화하지  

 말고 멤버 초기화 리스트를 줄겨 사용해야 한다. 그리고 초기화 리스트에 데이터 멤버를 나열할 때는

 클래스에 각 데이터 멤버가 선언된 순서와 똑같이 나열해야 한다.

 

* 여러 번역 단위에 있는 비지역 정적 객체들의 초기화 순서 문제는 피해서 설계해야 한다.

  비지역 정적 객체를 지역 정적 객체로 바꾸면 된다.( Singleton 사용)

Comments