[C++] 중괄호 초기화 { }

👻 중괄호 초기화

이번 시간에는 변수 및 함수 초기화 시 중괄호를 이용한 초기화 방법에 대해 알아보자.

중괄호는 { }이다.

int a{ 0 };
Knight k{ k2 };
vector<int> v{ 1, 2, 3, 4 };

이렇게 변수명 바로 뒤에 중괄호를 사용해 초기화 할 값을 세팅해주면 쉽게 사용할 수 있다.


🌱 장점

중괄호 초기화도 C+11 이후에 나온 개념이며 해당 초기화 방법을 사용함으로써 생기는 장점 몇 가지가 존재한다.

  • 초기화 문법의 일치화
    어떠한 타입의 변수든 중괄호를 이용하여 작성하면 되기 때문에 중구난방이던 초기화 문법이 통일된다.

  • 축소 변환 방지

int x = 0;
double y{ x };

위와 같은 코드가 있다고 가정했을 때 데이터 손실이 생기는 축소 변환을 우려하여 프로젝트가 실행되지 않는다. 오버플로우 등을 방지할 수 있다는 장점이 있다.

  • vector 등의 컨테이너와 잘 어울린다.
    중괄호를 사용하면 컨테이너도 아주 간단하게 초기화할 수 있다.

🌱 단점

물론 단점도 존재한다. 기사 클래스에 초기화 리스트를 인자로 받는 생성자를 추가해보도록 하자.

class Knight {
public:
    Knight() {

    }

    Knight(int a, int b) {
        cout << "Knight(int, int)" << endl;
    }

    // 우선순위 짱
    Knight(initializer_list<int> li) {
        cout << "Knight(initializer_list)" << endl;
    }
};

이렇게 된다면 int 타입의 인자를 두 개 받는 기사 클래스 선언부가 있다고 했을 때 어떤 생성자를 호출해야 할지 애매해진다는 단점이 있다.

Knight k{ 1, 2 };

중괄호를 사용하게 되면 무조건 초기화 리스트를 인자로 받는 생성자가 호출된다. 우선순위가 가장 높기 때문이다. int 타입의 인자 두 개를 받는 생성자를 호출하고 싶으면 일반 괄호를 사용해야 한다.

💡 initializer_list<int> li를 인자로 받는 생성자를 통해 초기화 리스트에 접근할 수 있다.


🌱 괄호와 중괄호

괄호의 종류에 따라 코드 스타일을 두 가지로 나눌 수 있다.

  • 괄호 초기화 ( ) 를 기본으로 간다.
    • 전통적인 C++ 문법이라 거부감이 없다.
    • vector 등 특이한 케이스에 대해서만 중괄호 초기화를 사용하면 편리하다.
  • 중괄호 초기화 { } 를 기본으로 간다.
    • 초기화 문법을 일치화할 수 있다.
    • 축소 변환을 방지해준다.

어떤 기준을 잡냐에 따라 개개인의 코드 스타일이 달라진다. 구글링을 좀 해보니 아무래도 현대 문법인 중괄호를 사용하여 예상 못한 버그를 미리 방지하는 식으로 생각하여 중괄호 초기화를 좀 더 선호하는 것 같다. 참고만 하자!!


👻 글을 마치며

이번 시간에는 중괄호 초기화에 대해 알아보았다. 예전부터 있었던 문법인 줄 알았는데 이 문법도 모던 C++ 문법인 걸 알고 새삼 신기했다. 아까 축소 변환이라는 말이 이해가 안 돼서 1시간 정도 헤맸던 것 같은데 결국 이해해서 기분이 좋다. 😋


소스코드 보러가기


출처
인프런 Rookies님 강의

Categories:

Updated:

Leave a comment