wellcome_공부일기

01.11. C++ | 변수 초기화 3가지 방법과 차이 본문

프로그래밍/C++

01.11. C++ | 변수 초기화 3가지 방법과 차이

ma_heroine 2020. 4. 30. 21:40

<목차>

1. Copy Initialization

2. Direct Initialization

3. Uniform Initialization ≒ Brace Initialization

4. 초기화 3가지 방법의 차이

 

 

 

Copy Initialization

복사 할당과 마찬가지로, 이것은 오른쪽에 있는 값을 왼쪽에 생성되는 변수와 복사한다.

int width = 5; // copy initialization of value 5 into variable width

 

 

 

Direct Initialization

단순한 데이터 유형(정수와 같은)의 경우 복사 및 직접 초기화는 본질적으로 동일하다. 그러나 일부 고급 유형의 경우 복사 초기화(Copy Initialization)보다 직접 초기화가 더 잘 수행될 수 있다. C++11 이전에는 성능 향상 때문에 대부분의 경우 복사 초기화보다 직접 초기화가 권장되었다. 객체지향에서 직접 만든 데이터 타입을 초기화할때 많이 사용한다.

int width( 5 ); // direct initialization of value 5 into variable width

 

 

Uniform Initialization

불행히도 괄호 기반 직접 초기화(Direct Initialization)는 모든 초기화 유형(예: 데이터 목록으로 개체를 초기화하는 것)에 사용할 수 없다.

보다 일관된 초기화 메커니즘을 제공하기 위한 시도로 C++11은 곱슬거림' { } '을 사용하는 Brace Initialization(일부 균일 초기화라고도 함)라는 새로운 구문을 추가했다.
브레이스 초기화는 두 가지 형태로 제공된다.

int width{ 5 }; // direct brace initialization of value 5 into variable width (preferred)
int height = { 6 }; // copy brace initialization of value 6 into variable height

 

이 두 가지 형태는 거의 동일하게 기능하지만, 일반적으로 직접적인 형태가 선호된다.
빈 교정기를 사용하여 변수를 초기화하면 초기화가 0을 나타낸다. Zero initialization(0 초기화)는 일반적으로 변수를 0으로 초기화한다(또는 지정된 유형에 더 적합한 경우 비어 있음).

int width{}; // zero initialization to value 0

 

Q: 어떤 방법으로 초기화시켜야 할까 { 0 } vs {}?

만약 실제로 그 값(value)를 사용하고 있다면 explicit initialization value를 사용하면 된다.  

int x { 0 }; // explicit initialization to value 0
std::cout << x; // we're using that zero value

만약 그 값(value)가 일시적이거나 곧 대체될 예정이라면 zero initialization을 사용하면 된다.

int x{}; // zero initialization
std::cin >> x; // we're immediately replacing that value

 

초기화 3가지 방법의 차이

C++에서 3가지 초기화 방법 중 컴파일러가 가장 엄격하게 다루는 것이 Uniform Initialization이다.

Uniform Initialization은 객체지향 시 중요하게 작용하기 때문이다. 

예를 들어, integer 데이터 타입에 초기화 값이 소수점인 상황이 있을 때 Copy Initialization와 Direct Initialization은 경고(warnings)가, Uniform Initialization은 오류(errors)가 뜨는 것을 확인할 수 있다. integer에 저장할 때, 소수점이 잘려나가서 컴파일러가 동작하면서 경고를 주지만 Uniform Initialization에서는 오류를 준다. 

int a = 4.5; //warnings
int b( 4.5 ); //warnings
int c{ 4.5 }; //errors

 

하지만, 그 외의 초기화 방법인 Copy Initialization와 Direct Initialization에서 소수점이 있는 숫자를 정수로 바꿔서 즉, integer로 바꿔서 저장하고 싶으면 type casting(형변환) 앞에 int를 붙이면 된다.

(Uniform Initialization은 문법을 지켜야 한다!)

#include <iostream>
 
int main()
{
    using namespace std;
 
    int a = 123; //copy initialization
    int b(123); //direct initialization 
    int c{ 123 }; //uniform initialization 
 
    int d = (int)1.23; //copy initialization & casting
    int e((int)1.23); //direct initialization & casting
    
    cout << a << endl; //output : 123
    cout << b << endl; //output : 123
    cout << c << endl; //output : 123
    cout << d << endl; //output : 1
    cout << e << endl; //output : 1
    
    return 0;
}

 

 

 

 

 

 

 

* 해당 글은 홍정모님의 따라 배우는 C++을 공부한 바탕으로 작성되었습니다.

* 이론적인 내용들은 www.learncpp.com에서 참고하였습니다.

 

Comments