I'm FanJae.

[C++] C++ 에서 새롭게 추가된 Type & Variable 본문

C++/Basic

[C++] C++ 에서 새롭게 추가된 Type & Variable

FanJae 2024. 8. 6. 23:52

※ 본 포스트는 코드누리 C++ Basic 강의 내용을 보고 정리한 포스트입니다.

 

C 언어와 다르게 C++ 언어에서는 여러 가지 데이터 타입과 변수가 추가되었다.

 

1) auto, decltype

 

1-1) auto

int main()
{
    int x[5] = {1,2,3,4,5};
    
    auto n = x[0]; // n은 int type이 된다.
    
    auto a = x; // 배열의 이름은 해당 배열의 첫번째 원소의 주소로 암시적 형변환이 된다. 
    따라서 a는 (int *) 가 된다.
 }

 

auto ( C++ 11 )

- 변수 선언시, 우변의 표현식을 조사하여 컴파일러가 타입을 결정한다.

- 컴파일 할 때 타입을 결정하여, 실행 시 오버헤드는 없다.

- 위 예제의 경우는 x[0]이 int type이므로, n은 int type이 된다.

 

1-2) decltype

int main()
{
    int x[5] = {1,2,3,4,5};
    int data = 10;
    
    decltype(data) d1; // int d1;
    decltype(x) d2; // int d2[5];
 }

 

decltype ( C++ 11 )

- 괄호 ( ) 안의 표현식으로 타입을 결정한다.

- 함수(클래스) 템플릿 등을 만들때 주로 사용한다.decltype의 사용 예시를 다룬 포스트 : Suffix return type

 

 

※ 위와 같이 표현식을 보고 컴파일러가 타입을 결정하는 것을 C++에서는 type deduction이라고 한다.

 

2) using

// typedef int DWORD;
// typedef void(*PF)(int);

using DWORD = int;
using PF = void(*PF)(int);

int main()
{
    DWORD n; // int n
    PF    p; // void(*p)(int)
}

 

C 언어에서는 typedef를 이용해서 별칭을 만들어 사용할 수 있었다. 

C++ 언어에서는 using을 사용한다.

 

2-1) typedef와 using의 차이점

typedef는 type에 대한 별칭만 제공하지만, using은 type에 대한 별칭 및 template에 대한 별칭에도 사용 가능하다.

 

3) 일관된 초기화(Uniform initialization)

struct Point
{
    int x;
    int y;
};
int main()
{
    // 기존 초기화 방식
    
    int n1 = 0;
    Point p1 = {0, 0};
    int x1[3] = {1,2,3};
    
    // 직접 초기화
    int n2 = {0};
    Point p2 = {0, 0};
    int x2[3] = {1,2,3};
    
    // 복사 초기화
    int	n3{0};
    Point p3{0,0};
    int x3[3]{1,2,3};
    
}

 

- C++ 11 이전 (C++98) 까지는 일반 변수, 구조체, 배열, 클래스 등에 따라 초기화 방법이 모두 다르다.

- Uniform Initialization 은 모든 종류의 변수를 한가지 방법으로 초기화 할 수 있게 하는 것이다.

- 중괄호 초기화(brace-init)라고도 한다.

 

이 초기화 기법에는 Direct Initialization과 Copy Initialization 2가지가 존재한다.

Direct Initialization은 = 없이 초기화를 하고, Copy Initialization은 = 를 사용해서 초기화한다. 

이 차이점은 추후 explicit에서 다룬다.

 

3-1) Prevent Narrowing

- C++ 에서는 일관된 초기화를 할때, 데이터 손실이 일어나는 상황에서 Compile Error가 발생한다.

int x{3.14}; // 컴파일 오류 발생. Narrowing Conversion을 방지한다.

 

4) C언어와 다른 Struct

 

4-1) C언어의 Struct와 C++ Struct의 차이점.

struct Point
{
    int x = 1;
    int y{2};
};

int main()
{
    struct Point pt1; 
    Point pt2 = {3,4}; // 문제 없음.
}

 

1. 구조체 멤버에 디폴트 초기값을 지정 가능하다. (C++11)

2. 구조체 변수 선언시 struct 키워드를 표기하지 않아도 된다. (C++98)

 

4-2) Struct Binding (C++17)

int main()
{
    struct Point pt1;
    Point pt2 = {3,4};
    
    auto [x, y] = pt2; // Strucutre Binding (C++17)
    
}

 

- 구조체 또는 배열의 모든 요소의 값을 추출할 수 있다.

- 타입은 반드시 auto를 사용한다.

- 요소의 개수와 선언된 변수의 개수는 반드시 동일해야 한다.

 

5) String

 

5-1) C 언어의 문자열 처리

#include <cstring>

int main()
{
    char s1[] = "abcd";
    char s2[5];
    
    s2 = s1;
    if (s2 == s1)
    {
       std::cout << "same" << std::endl;
    }
    else
    {
       std::cout << "not same" << std::endl;
    }
}

- 위 예제는 잘못된 예제이다.

- C언어에서는 문자열을 다루는 데이터 타입이 없어서, 문자와 배열을 혼합하여 사용한다.

- =, == 등의 연산자를 사용하면 안되고 문자열 전용 함수(strcpy,strcmp 등)을 사용해야 한다.

 

5-2) C++ 에서의 문자열 처리

#include <iostream>
#include <string>

int main(void)
{
    std::string s1 = "abcd";
    std::string s2;
    
    s2 = s1;
    
    if ( s2 == s1 )
         std::cout << "same" << std::endl;
    else
         std::cout << "not same" << std::endl;
    
    std::string s3 = s1 + s2;
    std::cout << s3 << std::endl;
}

 

 

std::string

- C++ 표준 라이브러리인 STL 이 제공하는 문자열 타입이다.

- class 문법으로 만들어진 사용자 정의 타입이다.

- 문자열 변수를 정수형 변수와 유사하게 사용 가능하다. 즉, +,==,= 등의 연산자 사용이 가능하다.

 

※ std::string은 <string> 헤더파일에 있다. <cstring> 이라는 <string.h>의 C++ 버전과 혼동하지 않게 유의해야 한다.

 

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

[C++] Function II  (0) 2024.08.08
[C++] Function I  (0) 2024.08.07
[C++] 표준 입출력 정리  (0) 2024.08.06
[C++] namespace 정리  (0) 2024.08.05
[C++] Visual Studio C++ 언어 표준 설정.  (0) 2024.08.05
Comments