본문 바로가기
Game DevTip/C++

6. C++ string 타입에 대해서

by LIKE IT.라이킷 2024. 12. 5.

1. String 타입

  • string은 문자열의 모음이라고 할수 있다.
#include <string>
using std::string;
  • 가변길이 문자열이며, 해당 string타입을 사용하려면
    이렇게 string 헤더를 사용하여야 한다.(참고로 string은 std::string에 정의 되어 있다.)
string s1;				// string의 기본 초기화. s1은 빈문자열이다.
string s2 = s1;			//s2는 s1의 복사본이다.
string s3 = "hiya";		//s3는 문자열의 복사본이다.
string s4(10,'c');		//s4는 cccccccccc(c가 10개)라는 뜻.

위에 코드 마다 주석에 달린 내용으로 사용법을 대략 알수 있겠지만,
보다시피 초기화를 하는 방법이 두 가지이다.

1-1. string의 직접초기화 & 복사초기화.

string s5 = "hiya"		//복사 초기화
string s6("hiya");		//직접 초기화
string s7(10, 'c');		//직접초기화, s7은 cccccccccc(c가 10개)라는 뜻.

초기값이 하나일 때는 직접초기화이든, 복사초기화든 상관이 없다.
하지만 s7처럼 초기값이 여러개라면 반드시 직접 초기화를 해야한다.

string 객체이름(초기화 개수, '문자');

이런 초기화 방법은 맨뒤에 있는 문자를 초기화 개수에 맞게 생성하여
위에 s7과 s4처럼 c를 10개를 변수에 저장하는 것으로 초기화한다.

  • 또한 초기값이 여럿일때 복사할 (임시)객체를 명시적으로 만들어
    복사 초기화 형식을 간접적으로도 사용이 가능하다.
string s8 = string(10,'c'); //복사 초기화 s8은 cccccccccc(c가 10개)라는 뜻.

1-2. string의 연산

  • 이름으로 호출가능한 연산, <<, + 처럼 해당 클래스
    타입 객체에게 적용될 때 의미있는 연산기호들을 사용가능하다.
stirng s;
cin >> s;
cout << s <<endl;

빈 string s를 정의한 이후 표준입력에서 사용자가 문자열을 입력하면
s에 그 문자열을 저장하고서 출력하겠다는 코드이다.

string s1, s2;
cin >> s1, s2;				//첫입력은 s1에, 두번째 입력은 s2에 저장.
cout << s1 << s2 << endl;	//string 2개를 출력.

이렇게 입력을 두개를 받아야 하는 상황에서 순차적으로
사용자가 Enter버튼을 누르기 전까지 앞에 있는 s1부터 그다음 s2에
사용자가 입력한 문자열이 저장된다.

1-3. 임의 개수 string 읽기

int main()
{
	string word;
    while (cin >> word)			//파일 끝에 도달할때까지 읽음.
  		cout << word << endl;	//한주렝 한단어씩 출력함.
        
	return 0;
}
  • 파일 끝에 도달하지 않았거나, 유효하지 않는 입력을 받지 않는등
    스티림이 유효하면 while 본체를 실행한다.

즉, while 본체에서는 읽은 값을 표준 출력으로 보낸다.
파일 끝에 도달하거나 유효하지 않는 입력을 만나면 while을 벗어난다.

1-4. getline 함수

-입력 내용에서 공백문자를 무시하고 싶지 않을때 사용함.
즉, 한줄 전체 읽기가 가능.

때문에 cin으로 공백문자를 받고 싶을때 >>대신 getline을 이용하면 됨.

  • getline 함수는 입력스트림과 string을 인자로 받는다.
    -지정된 스트림에서 줄바꿈 문자를 만날때까지 줄바꿈 문자를 포함해서
    입력 내용을 읽고서 그 줄바꿈 문자를 제외한 내용을 인자로
    지정한 string에 저장한다.

대충 이런 방식이다.

  • 그러므로 첫 문자가 줄바꿈이라면 그 결과는 비어있는 string이다.
    다른 입력 연산자처럼 getline에서도 istream인자를 반환한다.

-> 때문에 위에 코드들 처럼 getline도 조건문에서 사용가능.
(while, for, if등등...)

string line;
while (getline (cin,line))
		cout << line << endl; 	//파일 끝에 도달할 때까지 입력에서 한번에 한줄씩 읽는다.

return 0;

위 코드에서 string line에는 줄바굼 문자가 없으므로
직접 추가해야한다. <- 주로 endl을 사용한다.
(이후 현재줄을 마치고 버퍼를 비운다.)

1-5. string empty와 size연산

  • empty 함수 : string이 비어있는지 나타내는 bool을 반환.
  • empty는 string의 멤버함수 이므로,
    함수 호출시에 점(.)연산자를 사용해 호출함.

-> 이제 내용이 있는 줄만 출력하도록 의도하는 것이 가능하다.

while (getline (cin, line))
		if(!line.empty()) 		//참고로 !는 Not연사자이다.(피연산자를 평가한 bool의 값을 역변환 함)
  • size 멤버 : string의 길이, 즉 문자수를 반환한다.
string line;
while (getline(cin, line))
		if(line.size() > 80)
        	cout << line << endl;

1-6. string::size_type타입

  • size에서는 int나 unsigned를 반환할 것 같지만...
    사실 size는 string::size_type을 반환한다.

-> 이유는 string 클래스를 비롯해서 다른 라이브러리에서 대부분
여러 동반 타입을 정의하기 때문에 그렇다.

즉, 시스템에 독립적인 방법으로 라이브러리 타입을 쓰기 위함이다.

size_type을 이용하려면 범위지정연산자(::)를 사용해서
size_type이 클래스에서(string 클래스에서) 정의한 이름임을 알려야 한다.

  • 대충 size_type이 대체 어떤 타입인지는 몰라도
    어떤 string 크기라도 담을만한 충분한 크기의 타입일 것이다.

또한 string size 연산 결과를 저장하는데 사용할 변수들은
모두 string::size_type이여야 한다.

->근데 이거도 사실 c++14에서는 auto나 decltype으로
적절히 간편하게 사용하도록 바뀌었다.

auto len = line.size(); //len은 string::size_type이다.

size에서는 부호없는 타입을 반환하므로
표현식에 부호가 있는 데이터와 부호가 없는 것을 섞어쓰면
이상한 결과가 나온다.

마치 unsigned int 객체에서 -1을 대입하여 출력하면 65535가 나오는 것처럼...

1-7. string 비교하기

  • stirng은 대소문자를 서로 구별한다.
    -> 때문에 어떤 문자의 대문자와 소문자는 서로 다른 취급을 받는다.
    상등연산자(==),(!=)도 각가 사용 가능하다.
    관계연산자(<,<=,>,>=)도 크기(문자열 길이)를 비교할 수 있다.

또 관계연산자를 사용할 시 대소문자를 구분하는 마치 국어사전과
같은 방법도 사용가능하다.

비교할때 규칙 특징들을 한번 살펴보자면,

  • 규칙 1 : 두 string의 길이가 다르고 짧은 string의 모든 문자가
    긴것의 같은 위치에 있는 문자와 같다면 당연히 짧은게 긴것보다 길다.
  • 규칙 2 : 두 string에서 대응하는 위치의 어떤 문자가 서로 다를때
    비교결과는 string이 다른 첫번째 문자비교 결과에 따른다.
string str = "Hello";
string phase = "Hello World";
string slang = "Hiya";

위에 코드를 봤을때 규칙 1에 따라서 str이 phase보다 작고,
규칙 2에 따라 slang이 str과 phase보다 크다.

 

 

즉, H까지는 string 3개 모두 같지만 이후 알파벳에서 e와 i중 더 뒤에 배치되어있는 것이
i이기 때문에 규칙 2에 의거하여 slang이 다른 str과 phase보다 높은 것으로 추측된다.
(솔직히 나도 이렇게 생각하는거 제외하곤 잘 이해가 되지는 않는다.)

1-8. string 대입

  • string의 경우에도 한 string을 다른 것에 대입할 수 있다.
string st1(10,'c'), st2; 	// st1은 c(10개), st2는 비어있는 string.
st1 = st2 					// 대입 : st1내용을 st2 복사본으로 바꾼다.
							// 이제 st1과 st2모두 빈 string이다.
  • 또한 대입 뿐만아니라 두 string을 더하는 것도 가능하다.

string을 더하면 왼쪽 피연산자 뒤에 오른쪽 피연산자를 결합한
새로운 string을 반환한다.

string s1("아이쒸");
string s2("에라이");
string s3 = s1 + s2	//s3의 값은 "아이쒸 에라이"이다.
  • 참고로 s1+=s2도 동일한 결과값을 보여준다.

이후 글에서는 상수와 string 덧셈, string 내의 문자다루기등등을 한번 적어보겠다.

반응형

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

5. C++ auto & decltype에 대해서.  (0) 2024.12.05
4. C++ Typedef(타입 별칭)에 대해서  (0) 2024.12.05
3. C++ constexpr에 대해서  (1) 2024.12.05
2. C++ const에 대하여  (0) 2024.12.05
1. C++ 변수사용 Tip에 대해서.  (0) 2024.12.05

댓글