티스토리 뷰

C++

멤버 초기화 리스트란?

고졸 공돌이 2019. 11. 3. 21:18

출처 :  Effective C++

 

이 글을 읽기에 앞서 한 가지 법칙만 알고 가면 좋을 것 같습니다.

대입(assignment)과 초기화(initialization)은 서로 다른 개념이라는 것입니다.

예제1) 아래 코드는 string 객체를 초기화한 후, 대입합니다.

std::string str;       // 생성자 호출(초기화)
str = "Hello World!";  // 복사 대입 연산자 호출(대입)


예제2) 반면 아래 코드는 string 객체에 대해서 초기화만 진행합니다.

std::string str("Hello World!");  // 생성자 호출(초기화)


물론 위 두 과정 모두 결과는 똑같이 str 안에 "Hello World!"라는 스트링이 담겨있습니다.

 

예제 1같은 경우 생성자를 호출하고 대입까지 진행하기 때문에 작업이 2번에 걸쳐 수행됩니다.

반면, 예제 2는 생성자 호출만으로 같은 결과를 가져옵니다.

둘 다 같은 결과를 낸다면, 당연히 비용이 더 적은 예제 2가 좋은 방법일 것입니다.

C++ 규칙에 의하면, 어떤 객체이든 그 객체의 데이터 멤버는 생성자 본문이 실행되기 전에 초기화되어야 합니다.

아래와 같은 코드는 name에 대해서 대입까지 수행됩니다.

class Foo
{
public:
  Foo(std::string& str);
  
private:
  std::string name;
}

Foo::Foo(std::string& str)
{
  name = str;  // 초기화가 아니라 대입!!
}


객체의 데이터 멤버에 대한 초기화는 이미 생성자 본문(중괄호로 둘러싸인 부분)에 들어가기 전에 수행되는 것입니다.

name은 생성자 본문에 들어가기 전에 이미 string 생성자가 호출되어 초기화가 진행되었습니다.
결국 위와 같이 코드를 작성했다면, 데이터 멤버 객체에 대하여 초기화를 수행하고 대입까지 해버리는 즉, 작업을 2번이나 수행해버리는 꼴이 된 것입니다.

그럼 작업을 2번이나 하는 것이 아니꼽다면 어떻게 한 번으로 깔끔하게 해결할 수 있을까요?

바로 멤버 초기화 리스트를 사용하면 됩니다.

멤버 초기화 리스트를 사용하면 굳이 대입을 사용할 필요가 없습니다.

아래와 같이 코드를 깔끔하게 바꿀 수 있습니다.

class Foo
{
public:
  Foo(std::string& str);
  
private:
  std::string name;
}

Foo::Foo(std::string& str) : 
  name(str) // 초기화만으로 str 값을 name 안에 넣게 될 수 있습니다.
{
}

이렇게 쓰면 name에 대한 기본 생성자를 호출하고, 복사 대입 연산자를 호출하던 것을 단순히 한번의 복사 생성자 호출만으로 해결할 수 있게 됩니다.

또한 물론, 2번의 함수 호출을 1번으로 줄였으니 비용적으로도 더욱 효율적이겠죠.

 

하지만 여기서 주의할 점은, 멤버를 초기화 리스트에 넣는다고 해서 반드시 복사 생성자를 호출하는 것은 아닙니다.
멤버 뒤에 소괄호 부분에 들어가는 내용은 생성자의 인자입니다.

위 코드는 name에 대해 생성자를 호출할 때 인자(str)가 같은 타입인 string이므로 당연히 복사 생성자가 호출됩니다.
만약, 기본 생성자를 호출하여 초기화하고 싶다! 그러면 아래와 같이 쓰면 됩니다.

Foo::Foo(std::string& str) : 
  name() // 기본 생성자 호출
{
}

 

이렇게 멤버 초기화 리스트를 사용한다면, 기존의 방식(초기화 + 대입)보다 비용적으로 효율적이며 코드를 볼 때도 더욱 깔끔합니다.
데이터 멤버를 멤버 초기화 리스트를 통해 초기화하는 습관을 가지는 것이 더욱 깔끔한 코드를 만들어 내는데 도움이 될 것입니다.

'C++' 카테고리의 다른 글

멤버 초기화 리스트를 사용해야 하는 이유  (0) 2019.11.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함