19. C++ 변수 초기화 방식

C++ 변수 초기화 방식 (복사, 직접, uniform {})

1. 개요

1.1 문서 개요

이 문서는 C++에서 사용되는 변수 초기화 방식인 복사 초기화(Copy Initialization), 직접 초기화(Direct Initialization), Uniform 초기화(Brace Initialization 또는 List Initialization)에 대해 설명합니다. 초기화 방식은 객체 생성 시 초기값을 할당하는 구문으로, C++의 타입 안정성, 성능, 코드 일관성 등에 영향을 미치는 핵심 요소입니다.

2. 내용

2.1 복사 초기화 (Copy Initialization)

2.1.1 개념

복사 초기화는 대입 연산자 =를 사용하여 변수를 초기화하는 방식입니다. 내부적으로는 생성자에 인자를 전달하고 복사하는 형태로 작동할 수 있습니다.

int a = 10;  // 복사 초기화
std::string s = "hello";  // std::string(const char*) 생성자 호출 후 복사

2.1.2 특징

  • 명시적 변환 생성자가 있는 경우 호출되지 않음
  • 암시적 형 변환이 가능
  • 일부 상황에서 임시 객체를 생성할 수 있음

2.2 직접 초기화 (Direct Initialization)

2.2.1 개념

괄호 ()를 사용하여 객체를 직접 생성하는 방식입니다. 생성자 호출 시 인자를 직접 전달하는 방식으로 이해할 수 있습니다.

int a(10);  // 직접 초기화
std::string s("hello");

2.2.2 특징

  • 명시적 생성자를 호출 가능
  • 함수 호출 구문과 유사하여 애매모호한 구문이 발생할 수 있음 (예: Most Vexing Parse)

2.3 Uniform 초기화 (Brace Initialization)

2.3.1 개념

중괄호 {}를 사용하여 객체를 초기화하는 방식입니다. C++11 이후 도입되었으며, 일관성 있고 안정적인 초기화를 제공합니다.

int a{10};  // uniform 초기화
std::string s{"hello"};
std::vector<int> v{1, 2, 3};

2.3.2 특징

  • 암시적 형 변환을 허용하지 않음 (narrowing 방지)
  • initializer_list를 사용하는 생성자 우선 호출
  • 클래스 멤버 초기화에도 사용 가능
2.3.2.1 Narrowing 방지 예시
int a{2.5};  // 컴파일 오류 (double -> int narrowing)

3. 마무리

C++에서 변수 초기화 방식은 코드의 의미 전달, 타입 안정성, 성능에 영향을 미칩니다. 복사, 직접, uniform 초기화는 문법적으로 다르며, 각각 고유한 특징과 제약 조건이 존재합니다. 특히 C++11 이후에는 uniform 초기화를 사용하여 명확성과 타입 안정성을 확보할 수 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!
위로 스크롤