본문 바로가기
C++

4-2. C++ 문자열, 열거형, 열거형 클래스

by kwon5346 2024. 2. 2.
반응형

문자열 (string)

C++ 언어에서 기본적으로 제공해주는 것은 한 글자이다.
한 글자를 여러개 나열하는 방식으로 문자열을 사용한다.

#include <iostream>
#include <string>
#include <limits>

int main()
{
   using namespace std;

   cout << "What is your name? : ";
   string name;
   cin >> name;
   std::getline(std::cin, name);

   cout << "How old are you? : ";
   int age;
   cin >> age;

   // std::cin.ignore(32767, '\n');
   std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

   string abc = "abcdefg";

   cout << abc.length(); << endl;

   return 0;
}
std::getline(std::cin, name)

cin은 기본적으로 빈칸이 있으면 하나를 입력을 다 받았다고 가정을 한다.
그래서 이름을 작성할때 띄어쓰기를 하면 문제가 생긴다.
띄어쓰기 뒤에있는 문자열이 버퍼안에 담아뒀다가 두번째 cin에 넘겨저 버리게 되기 때문이다.
이걸 막기위해 string을 입력받을때 getline을 사용할 수 있다. getline(cin, 입력받을 변수명)
getline을 사용하면 엔터를 칠 때까지 line을 쭉 입력받을 수 있다.

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

cin.ignore는 두번째 parameter를 만날때까지 최대 첫번째 parameter(정수)개의 글자를 날려버린다.
2 byte integer로 표현이 가능한 가장 긴 signed value값 32767을 넣어줄 수도 있고,
numeric_limits<std::streamsize>::max()를 넣어줄 수도 있다.
streamsize는 버퍼 크기이다.

abc.length();

string class 안에 들어있는 length()함수. 문자열의 길이를 알수있다.



열거형 (enumerated types)

비슷한 유형의 다양한 옵션들을 기호적으로 표현하기 위해서 열거형을 사용한다.

#include <iostream>

enum Color
{
   COLOR_RED,   // 0
   COLOR_GREEN, // 1
   COLOR_BLUE,  // 2
   COLOR_WHITE, // 3
   COLOR_BLACK, // 4
};

int main()
{
   using namespace std;

   // 정수에 Color 대입 가능
   int colorId = COLOR_BLUE;

   cout << colorId << endl;  // 2

   // Color에 정수를 바로 대입할수는 없다. (casting 필요)
   Color myColor = static_cast<Color>(4);

   cout << myColor << endl;

   return 0;
}

enum을 한번 정의하면 프로그램 전체에서 반복해서 사용할수 있어 편리하다.
전방선언을 하기보다는 헤더파일을 만들어서 enum을 집어놓고 include하는 방식이 많이 사용된다.
enum은 내부적으로 integer로 저장되는것 같지만,

// Color에 정수를 바로 대입할수는 없다. (casting 필요)
   Color myColor = static_cast<Color>(4);

문법적으로 100% 호환이 되지 않는 점을 주의하자.



열거형 클래스 (Scoped Enumerations Enum Class)

열거형을 사용하면서 실수하기 쉬운 단점을 보완해주는 열거형 클래스(영역 제한 열거형)가 있다.

#include <iostream>

enum class Color
{
    WHITE,
    BLUE,
};

enum class Animal
{
   TIGER,
   LION,
};


int main()
{
   using namespace std;

   Animal animal1 = Animal::TIGER;
   Animal animal2 = Animal::LION;

   if (animal1 == animal2) { cout << "same" << endl; }
   else { cout << "not same" << endl; }

   return 0;
}

만약 위 코드에서 열거형 클래스가 아닌 일반 열거형을 사용했다면,
내부적으로는 정수로 저장되기 때문에 만약(WHITE == TIGER)를 비교하면 같다고 나올 것이다..
하지만 열거형 클래스를 사용하면 다른 enum class끼리는 비교가 안되게 막혀져 있다.
열거형 클래스는 같은 클래스 끼리만 비교가 가능하다.

Animal animal1 = Animal::TIGER;
Animal animal2 = Animal::LION;

열거형과 다르게 범위 지정 연산자(::)를 사용한다.

반응형