wellcome_공부일기

C++ | 02.07. 문자 자료형(Char Data Type) 본문

프로그래밍/C++

C++ | 02.07. 문자 자료형(Char Data Type)

ma_heroine 2020. 5. 8. 23:58

<목차>

1. 문자 자료형(Chars Data Type)이란?

2. 문자 초기화시키기(Initializing chars)

3. 문자 출력하기(Printing chars)

4. 형변환을 통해 문자를 정수로 출력하기(Printing chars as integers via type casting)

5. 문자 입력하기(Inputting chars)

6. 문자형 크기(Chars Data Type Size)

 

 

문자 자료형(Char Data Type)이란?

- 문자 자료형은 일체형 타입으로, 기본값이 정수로 저장되고, 크기가 1바이트로 보장된다는 것을 의미

- 부울 값을 참 또는 거짓으로 해석하는 방법과 유사하게, 문자 값(char value)은 ASCII 문자로 해석

- 문자 리터럴(char literals)은 항상 작은 따옴표를 사용하여 표현

아스키(ASCII)란?

- ASCII는 정보 교환을 위한 미국 표준 코드(American Standard Code for Information Interchange)의 약자

- 영어 문자(더하기 몇 개의 다른 기호)를 0에서 127 사이의 숫자(아스키 코드 또는 코드 포인트라고 함)로 나타내는 특정한      방법을 정의

- 예를 들어 ASCII 코드 97은 문자 'a'로 해석됨

 

 

- Codes 0-31은 인쇄할 수 없는 문자(the unprintable chars)

- 주로 서식과 프린터 제어에 사용되지만 이제 대부분은 쓸모가 없음.

- Codes 32-127은 인쇄 가능한 문자(the printable characters)

- 대부분의 컴퓨터가 기본적인 영어 텍스트를 표시하기 위해 사용하는 문자, 숫자 문자, 문장 부호를 나타냄

 

문자 초기화시키기(Initializing chars)

#include <iostream>

int main()
{
    using namespace std;

    char c1('A');
    char c2(65);

    //output: A A
    cout << c1 << " " << c2 << " " << endl;
    
    return 0;
}

- 문자 변수를 문자 리터럴을 이용하여 초기화 시킬 수 있음

- 문자를 정수로 초기화할 수 있지만, 가능한 피하는 것이 오류를 피할 수 있음

 

주의사항

char ch{5}; // initialize with integer 5 (stored as integer 5)
char ch{'5'}; // initialize with code point for '5' (stored as integer 53)

- 문자 번호와 정수 번호를 섞어서 쓰면 안된다. 

- 문자 숫자는 우리가 숫자를 텍스트(text)로 표현하고 싶을 때 사용되도록 설계된 것

- 수학적 연산을 적용할 수 있는 숫자로 사용하도록 설계된 것이 아님

 

 

문자 출력하기(Printing chars)

#include <iostream>
 
int main()
{
    char ch1{ 'a' };               // (preferred)
    std::cout << ch1 << std::endl; // cout prints a character
 
    char ch2{ 98 };                // code point for 'b' (not preferred)
    std::cout << ch2 << std::endl; // cout prints a character ('b')
    
    //char literal case:
    std::cout << 'c' << std::endl;// cout prints a character ('c')
 
    return 0;
}

- std::cout을 이용하여 문자를 출력할 때, std::cout은 문자 변수를 ASCII 문자로 바꿔 결과물을 내줌

- C++에서 고정 너비 정수 int8_t는 signed char과 동일하게 다뤄지기 때문에, 정수 대신 문자로 출력됨

 

 

형변환을 통해 문자를 정수로 출력하기(Printing chars as integers via type casting)

형변환(type cast)은 다른 타입의 값을 원하는 타입의 값으로 만들어줍니다.

C++에서는 기본적으로 정적 캐스트(static_cast)를 이용하여 형변환을 합니다.

#include <iostream>

int main()
{
    using namespace std;

    char c1(65);
    char c2('A');
  
    // C-style casting
    cout << (char)65 << endl;
    cout << (int)'A' << endl;

    // C++ style casting
    cout << char(65) << endl;
    cout << int('A') << endl;
    
    return 0;
}

- C++에서 C-style 캐스팅은 싱글 캐스트(single cast)라고도 불리는데, 데이터를 재해석해야 한다는 뜻이 강하기 때문에 다른 형변환과 동일하게 출력이 되더라도 쓰지 말아야함(컴파일러에게 강제로 int 혹은 char임을 말하는 것)

- C++ style casting은 공식 명칭이 functional casting으로 이 또한 쓰는 것을 자제하는 게 좋음

※ C style과 functional casting을 피해야 하는 이유 정리

https://stackoverflow.com/questions/32168/c-cast-syntax-styles

- C++ 형변환(type cast)

static_cast<new_type>(expression)

- 대표적인 static_cast은 명시적 형변환(Explicit type conversion)으로 컴파일러가 변환가능한 지 확인 후 출력

- 보통 C++을 하다 보면, < 꺾인 괄호 >를 많이 사용하는데, 대부분 타입으로 될 가능성이 높음

- 전처리기 #include <>의 괄호는 제외

- static_cast 사용 코드

#include <iostream>

int main()
{
    using namespace std;

    cout << static_cast<char>(65) << endl;  //output: A
    cout << static_cast<int>('A') << endl;  //output: 65

    char ch('a');
    cout << ch << endl;                    //output: a
    cout << static_cast<int>(ch) << endl;  //output: 97
    cout << ch << endl;                    //output: a

    return 0;
}

- static_cast는 그저 파라미터에 대한 표현에 지나지 않음

- 변수에 변환을 위해 사용되는 것으로 원래 자료형 타입이 동일한 값으로 그대로 유지됨

 

 

문자 입력하기(Inputting chars)

#include <iostream>

int main()
{
    using namespace std;

    char c1(65);

    cin >> c1;
    cout << c1 << " " << static_cast<int>(c1) << endl;
    
    return 0;
}

- std::cin은 여러개의 문자를 받을 수 있지만 문자형은 한 글자(1 byte)만을 받을 수 있음

- 그래서 abcd를 입력하게 되면 첫번째 입력 문자 a 값만 출력됨

 

#include <iostream>

int main()
{
    using namespace std;

    char c1(65);

    cin >> c1;
    cout << c1 << " " << static_cast<int>(c1) << endl;
    
    cin >> c1;
    cout << c1 << " " << static_cast<int>(c1) << endl;

    cin >> c1;
    cout << c1 << " " << static_cast<int>(c1) << endl;

    cin >> c1;
    cout << c1 << " " << static_cast<int>(c1) << endl;
    
    return 0;
}

- 하지만, std::cin이 사용하는 입력버퍼에 나머지 문자가 남아있어 std::cin을 후속 호출하면 출력 가능

- 즉, 입력한 문자 갯수만큼 출력 명령문을 써주면 같이 출력됨

 

문자형 크기(Chasr Data Type Size) 알아보기 

#include <iostream>
#include <limits>

int main()
{
    using namespace std;

    cout << sizeof(char) << endl; //output: 1
    
    /*
    * Unable to print all ASCII to the screen
    * cout << std::numeric_limits<char>::max() << endl;
    * cout << std::numeric_limits<char>::lowest() << endl; 
    */
    
    cout << (int)std::numeric_limits<char>::max() << endl;    //output: 127
    cout << (int)std::numeric_limits<char>::lowest() << endl; //output: -128
    
    cout << (int)std::numeric_limits<unsigned char>::max() << endl;    //output: 255
    cout << (int)std::numeric_limits<unsigned char>::lowest() << endl; //output: 0
    
    return 0;
}

- 모든 아스키(ASCII)를 출력할 수 없어서, 만약 출력한다면 이상한 값이 나옴

 

 

그 외

- 화면에 출력을 안하는데 의미를 갖는 것을 Escape sequences라고 함 ex) \n, \t, \a

 

 

 

 

 

 

 

 

* 해당 글은 홍정모님의 따라 배우는 C++과 learncpp에서 공부를 한 토대로 작성되었습니다. 

Comments