본문 바로가기
개발 지식/C++

[C++] char*, char[], string 변수의 차이

by 에르주 2020. 9. 15.
반응형

알고리즘 테스트를 보다보면 각각 회사마다 다른 유형을 볼 수 있다. S사 같은 경우에는 BFS, DFS, DP 그리고 K사 또는 N사는 string 값을 이용하여 알고리즘 대입..

 

17년 하반기 이후로 코딩 테스트를 C++언어로 보고 있는데 문자열과 관련된 내용이 나오면 C++을 선택한 것이 후회할 때가 있다.

예를들어 어느 문자열이 주어졌고 공백을 기준으로 잘랐을 때 Java 언어는

 

String strinput ="Hi Hello Erjuer01!";
String strinputarray[] = strinput.split(" ");

/*
strinputarray[0] = "Hi"
strinputarray[1] = "Hello"
strinputarray[2] = "Erjuer01!"
*/

 로 split 메소드를 이용하여 쉽게 자를 수가 있었는데, C++ string 라이브러리의 strtok 메소드를 활용하려고 보니 char* 이라는 매개변수가 등장하게 되고 이와 유사한 char[], string 변수와의 차이점을 정리하여 C++로 쉽게 문자열을 다룰 수 있도록 공부해보려고 한다.

 

char

우선 char라는 변수 선언부터 언급해야 하는데 char은 문자라는  1-byte의 변수이다. 즉 단어 하나를 뜻하는 것이며 더 나아가 2-byte인 한글과는 문자 길이가 맞지 않아 깨진 것을 확인 할 수 있다. 또 char값에 정수를 대입해도 정수로 받아 들이는 것이 아닌 ASCII 코드로 해석한다.

 

char a = 65;
cout<<"a의 값은 : " <<a<<endl;
/*
출력
a의 값은 : A
*/

<출력의 예시>

 

 

Char*

char*는 문자열을 나타내는 것이며 글자 여러개가 계속 이어진 값을 가질 수 있다. 문자의 포인터 변수는 문자열을 담기 위해 사용한다.

char * str ="가나다라마바사" 일 때 포인터가 변수는 첫 글자 이자 문자열의 시작 주소(가나다라마바사에서 '가')를 가리킨다.

또한 문자열 끝의 경우에는 마지막 지정 문자가 들어간다.

 

 

 

 

 

char* p ="abcd";

cout<<p[0]<<endl;
cout<<p[1]<<endl;
cout<<p[2]<<endl;
cout<<p[3]<<endl;

cout<<p<<endl;
cout<<p+1<<endl;
cout<<p+2<<endl;
cout<<p+3<<endl;

/* 출력
Error
Error
Error
Error

abcd
bcd
cd
d

*/

 

더 나아가 char*은 포인터 변수 이므로 직접적인 변수에는 접근 및 수정할 수 없고 읽을 수만 있다.

p[0], p[1]와 같이 직접 접근은 실행 시 오류 발생 할 것이고 p+1, p+2 같은 경우에는 시작점이 a에서 b 그리고 c로 포인터 변수의 시작 주소가 바뀌는 것 이기 때문에 문자가 하나하나 줄어들며 출력이 된다.

 

 

char[]

char*와 같이 문자열을 나타내는 것은 똑같으나 포인터 변수가 아닌 배열을 통해 나타내는 것이다. 즉 주소값에 대해서 접근하는 것이 아니기 때문에 char*와 큰 차이점은 문자열 하나하나 수정이 가능하다는 점이다. 여기서도 문자열을 5개로 선언한 이유는 끝에 마지막 지정 문자가 들어가기 때문이다.

또한 char[] 선언에서는 꼭 크기를 정해주어야 한다.

 

 

 

 

 

 

char p[5] ="abcd";
 
cout<<p<<endl;
p[2]='z';
cout<<p<<endl;

/*출력
abcd
abzd
*/  

/*
p[4] ="abcd"일 때에는 error: initializer-string for array of chars is too long [-fpermissive] 길이가 맞지 않는 에러가 발생한다.
*/

 

string

char[]은 struct를 사용하고 string은 class의 객체이다. 그렇기 때문에 string을 활용하기 위해서는 #include<string.h> 라이브러리를 include하여 사용해야 하고 cout을 통해 출력되는 결과물이 같더라도 각각 변환을 위해서는 생성자나 메소드를 활용해야 한다.

확실한 차이점이라면 

 

char[] str일 경우 해당 배열의 크기는 strlen(str), string str 경우에는 str.size()이고 char[]에서는 사용할 수 없었던 문자열 처리를 쉽게 할 수 있도록 도와준다.

 

string tempstr ="c++ 알고리즘이 재밌다!";
string tempstr2 ="Java 알고리즘이 재밌다!";

tempstr2 = tempstr; // tempstr2는 c++ 알고리즘이 재밌다로 덮어쓰기 된다.
string str = tempstr+" 그리고 "+ tempstr2; // c++ 알고리즘이 재밌다! 그리고 java 알고리즘이 재밌다!

 

와 같은 수식 기호를 이용해 나타 낼 수 있다. 그 외에에도 string 라이브러리 안의 find, substr 같은 어떠한 문자열을 찾거나 잘라낼 때 도움이 되는 함수들이 많다.

 

다음 포스팅에는 char를 활용한 문자열 자르기 및 복사 그리고 char[] <-> string 변환에 대해서 정리해보자.

끝.

 

 

 

 

반응형

'개발 지식 > C++' 카테고리의 다른 글

[C++] cout cin namespace overloading 접해보기  (0) 2021.10.16

댓글