객체를 사용하기 전에 반드시 그 객체를 초기화하자

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <string>

class Item3 { 
public:
 //기본타입 객체는 경우에 따라 저절로 초기화가 되기도 하고 그렇지 않기도 한다.
 int x = 0; //직접 초기화
 const char * text = "A C-style string"; //포인터의 직접 초기화

 void DoSomething() {
  double d;
  std::cin >> d; //입력 스트림에서 읽으면서 초기화
 }

 Item3(int val, bool) {
  x = val; //이 구문은 초기화가 아니라 대입. 
     //정확히는 초기화가 이루어진 변수에 값을 대입시키는 것
 }
 Item3(int val) : x(val) {} //제대로 된 초기화

 Item3() :   //생성자 호출
  theName(),  //string 생성자 호출
  theAddress(), //마찬가지
  Numbers(),  //마찬가지
  numTimesConsulted(0) //0으로 초기화
 {}

private:
 std::string theName;
 std::string theAddress;
 std::vector<int> Numbers;
 int numTimesConsulted;
};


  • C++ 에서의 객체 초기화에는 규칙이 가지 있다.
  1. 어떤 컴파일러를 막론하고, 기본 클래스는 파생 클래스보다 먼저 초기화
  2. 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화(위의 Item3 예시에서는 theName 제일 먼저 초기화)

정적객체(static object) 자신이 생성된 시점부터 프로그램이 끝날 때까지 살아 있는 객체를 일컫는다.( 스택 기반 객체는 정적 객체가 없다)

  • 정적 객체의 범주에 들어가는 것들은 1. 전역 객체, 2. 네임스페이스 유효범위에서 정의된 객체, 3. 클래스 안에서 static 으로 선언된 객체, 4. 함수 안에서 static 으로 선언된 객체, 5. 그리고 파일 유효범위에서 static 으로 정의된 객체.
  • 이들 함수 안에 있는 정적 객체는 지역 정적 객체(local static object) - 함수에 대해 지역성을 가지므로, 나머지는 비지역 정적 객체(non-local static object) 라고 한다.
  • 정적 객체는 main() 함수가 실행 종료되고 프로그램이 끝날 소멸자가 호출된다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class FileSystem { //특정 라이브러리에 포함된 클래스라 가정.
public:
 std::size_t numDisks() const;

};

extern FileSystem tfs; //사용자가 쓰게 될 객체

class Directory { //라이브러리의 사용자가 만든 클래스라 가정
public:
 Directory() {
  std::size_t disks = tfs.numDisks(); //tfs 객체를 여기서 사용함.
           //하지만, tfs 를 사용할 시점에 tfs 가 초기화되지 않았을 수 있음.
           //다른 번역 단위에 정의된 비지역 정적 객체.
 }
};


//////////////////////////해결책////////
//싱글톤 패턴 활용
FileSystem& tfs2() {
 static FileSystem fs;
 return fs;
}
Directory& tempDir() {
 static Directory td = Directory();
 return td;
}


여러 번역 단위에 있는 비지역 정적 객체들의 초기화 순서 문제는 피해서 설계해야 한다. 비지역 정적 객체를 지역 객체(singleton) 바꾸면 된다.

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더