문자열 (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;
열거형과 다르게 범위 지정 연산자(::)를 사용한다.
'C++' 카테고리의 다른 글
5-1. C++ switch-case, do-while (0) | 2024.02.03 |
---|---|
4-3. C++ 자료형에게 가명 붙이기 (type aliases), 구조체 (struct) (0) | 2024.02.02 |
4-1. C++ 전역변수, 정적변수, 내부연결, 외부연결 (1) | 2024.02.02 |
3-3. C++ 비트 플래그, 비트 마스크 (1) | 2024.01.30 |
3-2. C++ 비트단위 연산자(shift,AND,OR,XOR) (1) | 2024.01.29 |