본문 바로가기
언어/C++

[C++ 기본 공부정리] 8. 문자열(string)

by 민-Zero 2019. 11. 29.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

문자열(string) 이란 여러 문자(character)들의 집합이다.

c++에서 이 문자열을 사용하는데 2가지 방법이 있다. 첫 번째는 C언어 스타일로 char형 배열에 문자열을 저장해 배열을 문자열처럼 사용하는 것과 두 번째는 표준 라이브러리에 존재하는 string 클래스를 이용하는 것이다.

 

1) NULL문자

C++에서 문자열 변수는 문자열의 끝을 프로그램에 따로 알려주어야 한다. 그래야 프로그램이 문자열에 속한 값과 그 외의 쓰레기 값을 구분할 수 있다. 따라서 문자열의 끝을 의미하는 문자를 하나 더 삽입해 주는데 이 문자를 널(NULL) 문자라고 하며, \0으로 표시한다. 널 문자의 유무로 문자형 데이터 배열과 문자열을 서로 구분할 수 있다.

 

2) C언어 스타일 문자열

프로그램 내부에서 문자열을 이용해야 한다면 관계없지만 문자열을 외부에서 입력받아야 한다면 문자형 배열의 크기가 정해져 있어야 동작 가능하다.

또한 띄어쓰기 입력 시 cin 객체가 문자열의 끝으로 인식해 의도하지 않은 동작이 발생할 수 있다.

cin객체에 포함된 함수인 get()과 ignore()을 통해 띄어쓰기를 입력받고 지정한 크기보다 많은 문자를 입력받게 할 수 있다. 하지만 지정한 크기를 넘어가는 문자는 잘려서 들어가지 않게 된다.

 

3) string 라이브러리

string 라이브러리를 통해 string객체를 이용하면 문자형 배열을 통해 문자열을 사용할 때 발생할 수 있는 문제점들을 쉽게 극복할 수 있다. string은 표준 라이브러리에 속해 있으므로 프로그램 처음에 include 시켜야 하며 std 네임스페이스가 필요하다. string을 사용할 경우 문자열을 일반 타입처럼 사용할 수 있게 해 주어 일반 변수처럼 사용하면 된다.

일반 변수처럼 선언과 동시에 초기화 가능하며 변수끼리의 대입도 가능하다. [] 을통해 배열처럼 한문자씩 접근 또한 가능하며 마지막에 널문자가 포함되어 있음을 확인할 수 있다.

문자열끼리의 + 연산과 +=연산도 지원한다.

입력 함수 cin이 공백의 경우 문자열의 끝으로 인식하기 때문에 띄어쓰기까지 인식하려면 문자열을 한 행씩 읽을 수 있는 getline함수를 통해 입력받으면 된다.

 

4) string 관련 메소드

1. length(), size()

length와 size 둘 다 같은 값을 반환 하지만 다른 의미를 가지고 있다. length의 경우 문자열의 길이를 반환하는 것이고 size의 경우 해당 객체가 메모리에서 사용하는 크기를 반환하는 것이다. 또 문자열의 마지막에 널문자가 들어가는 것을 확인했는데 length의 경우 널문자까지의 길이가 아닌 실제 문자열의 길이만 반환한다.

 

2. append()

문자열의 끝에 새로운 문자열을 추가하는 메소드이다. 2가지의 방법으로 사용할 수 있다.

1) 문자열. append("새로운 문자열");

2) 문자열. append("새로운 문자열", 시작번호, 개수);

문자열의 끝에 추가하려는 문자열이 추가되며 두 번째 경우 추가하려는 문자열의 1번 인덱스부터 3개의 문자가 입력되는 것을 볼 수 있다.

 

3. find()

find()는 원하는 문자열의 시작 위치를 반환하는 메소드이다. 사용방법은 다음과 같다.

1) 문자열. find(찾을 문자열);

2) 문자열. find(찾을 문자);

3) 문자열. find(찾을 문자열, 시작 위치);

find()는 해당 문자열에서 찾을 문자열을 찾지 못하면, string::size_type의 string::npos라는 상수를 반환한다.

2번째의 경우를 보면 l이 2개가 존재하는데 처음 만난 l의 위치를 반환하게 된다. 즉 같은 문자열이 여러 개 있으면 그중 제일 앞의 인덱스를 반환한다. 3번째의 경우는 시작 위치 인덱스부터 검색하여 해당 문자열을 찾게 된다.

 

4. compare()

compare() 메소드는 두 문자열 간의 내용을 비교하는 메소드이다. 사용방법은 다음과 같다.

기준 문자열. compare(비교할 문자열)

 

만약 두 문자열이 일치한다면 0을 반환한다.

기준 문자열이 비교할 문자열보다 사전 편찬 순으로 앞일 경우 기준. compare(비교)<0이 되고 사전 편찬 순으로 뒤일 경우 기준. compare(비교)>0 이 된다.

 

5. replace()

replace() 메소드는 특정 문자열을 다른 문자열로 대체하는 메소드이다. 다음과 같이 사용한다.

문자열. replace(변경할 문자열 시작 위치, 새로운 문자열의 길이, 새로운 문자열);

변경할 문자열의 시작 위치를 find() 함수를 통해 찾는 것이 좋다.

 

6. capacity(), max_size() 

capacity() 메소드는 해당 문자열이 재할당(reallocation)받지 않고 저장할 수 있는 최대 문자열의 길이를 반환

max_size() 메소드는 해당 문자열이 최대한 할당받으면 가질 수 있는 최대 문자열의 길이를 반환

댓글