티스토리 뷰

Programming/C++

C++ 독학 로그 04. 문자열

quokka_dev 2018. 7. 31. 17:43

최근에 일이 바빠서 연재를 정기적으로 하지 못했다. 조금씩이라도 짬을 내서 포스팅을 했어야 하는건데 그러지 못했다. 내 끈기의 부족이다.


그리고 책의 내용이 너무 자세해서 내가 전부 포스팅을 하기 힘들다. 너무 디테일하다... 


이거까지 다뤄야 하나 싶기도 하고 이 내용들이 어느정도 프로그래밍 기초가 있는 사람에게는 이해가 빠르고 디테일에 감탄하며 좋아할 만한 미립자 꿀팁들인데,


내 포스팅을 봐주는 사람이 있을지 모르겠다만 만약 기초가 없는 분이 읽는다면 과연 도움이 될만한 내용인지 걱정된다.


그래서 어느정도 내가 먼저 책을 읽으며 진도를 빼고, 연습이나 독학하면서 이런 내용은 많이쓰고 중요하구나, 기억해야하 하는 부분이구나 하는 부분만 정리해서 올릴 계획이다.


이 부분 양해 부탁드린다. 그럼 오늘의 포스팅, 문자열에 대해 알아보자.


char 형  


문자 데이터 유형에 대해 알아보자. 얘는 문자 하나만 담을 수 있는 데이터 유형이다.


1
2
3
4
char 변수명;
 
char abc = 'A';
char number = '5';
cs

이렇게 작성한다.

변수 abc에는 문자 A를 할당하고, 변수 number에는 문자 5를 할당한다. 숫자가 아니라 문자이다. 

문자값을 표현할때는 ' ' 으로 감싼다.


아스키코드 


컴퓨터는 0, 1로 이루어진 이진수만 알아본다. 그래서 우리가 쓰는 문자를 사실상 알아보지 못한다. 그런데 어떻게 출력하고 컴퓨터언어를 이해하는 것일까?


아스키코드는 이러한 이유로 우리가 쓰는 문자를 컴퓨터에게 숫자로 부호화해준다. 쉽게 말하면 문자에 ID값으로 지정된 숫자를 부여해준다.


아스키코드는 그 범위가 8비트(128개)까지 있다.


아스키코드가 중요한 이유는 문자를 취급할때에 가장 기초가 되는 문자일 뿐만 아니라, 컴퓨터로 작성해야하는 문자중 가장 많이쓰고 가장 필요한 문자만을 모아 부호화 했기때문에 중요한 것이다.


쉽게말해 아스키코드는 컴퓨터가 우리에게 0, 1이 아닌 우리가 읽을 수 있는 문자로 바꾸기 위한 가장 기초적이며 가장 많이쓰는 128개의 문자들을 모아놓은 것이다.


또한 조건문에서 문자를 이용한 범위를 표현할 때 굉장히 유용하게 쓸 수 있는데, 문자를 정수로 표현하거나 정수를 문자로 다룰 수 있기 때문에 표현의 방법을 여러가지로 가져갈수 있기 때문에 중요하다.


아스키코드는 그럼 128개 전부 외워야하는가?


외우면 좋다. 하지만 효율적으로 외우기 위해 범위를 알아두도록 하자.


숫자 0~9까지는 아스키코드 48~57, 대문자 A~Z는 아스키코드 65~90, 소문자는 97~122 이다. 이정도만 알아두어도 매우 도움이 되니 참고하도록 하자.


그리고 외우면 좋은 것이 이스케이프 시퀀스이다.


이스케이프 시퀀스 


이스케이프 시퀀스란 컴퓨터가 문장을 해석하기 위해 사용하는 기호들을 출력할 때에 언어가 아닌 문자로써의 역할을 하도록 도와주는 몇가지 지정된 문자들이다.


우리가 많이 쓰는 \n이 그중 하나이다. 조금 알아보자.


\b 백스페이스 아스키코드 8

\t 탭(tab) 9

\n 라인피드 10

\f 폼피드 12

\r 캐리지 리턴 13

\\ 역슬래시 92

\" 따옴표 34


기억하면 더 좋고.


string 형 


char형은 문자 딱 하나만 표현한다. 그런데 문자를 모아 단어를 출력하려고 한다면 문자 변수를 단어의 스펠 개수만큼 선언하고 사용해야하나?


그래서 나온게 string형이다. 


string형은 연속된 문자들로 구성되는 문자열을 담기위한 데이터유형이다.


여기서 중요한 사실이 있다. C++에서는 이 string형으로 문자열을 만들면 원시유형이 아니라 객체유형으로 생성된다고한다.


객체 개념에 대해서는 나중에 배우게 되겠지만 객체를 사용하여 프로그래밍을 하게 되는데 이것이 참 재밌는 방식이다.


어떻게 쓰는지 보자.


1
2
3
4
5
6
string message = "ABCD";
cout << message.length() << endl;
cout << message.at(0<< endl;
string s = "Bottom";
cout << s.length() << endl;
cout << s.at(1<< endl;
cs


먼저 알아야 할 중요한 포인트가 있다. 객체들은 클래스를 사용하여 정의된다. 


string은 <string> 헤더 파일에 미리 정의되어있는 클래스이다. 그래서 이 클래스에 이미 존재하는 함수들을 사용하여 string의 객체들을 다룰 것이다.


먼저 몇 가지 함수들을 보자


length() 함수는 문자열 내의 문자 개수를 반환해준다. size() 함수도 똑같다.

at(index) 함수는 문자열에서 지정된 인덱스의 문자를 반환한다.


인덱스는 문자열을 이루는 문자들의 번호값이다. apple라는 문자열이 있다면, 순서대로 0, 1, 2, 3, 4 의 해당 넘버를 부여받는다. 이 번호들을 인덱스라고 한다.


그러면 위 예제를 해석해보자.


message 스트링변수에 "ABCD"를 할당해주고, 2행에서 변수 message의 문자개수를 반환하는 length()함수를 사용하여 문자개수를 출력한다.

3행에서는 message 변수에 할당된 문자열의 제일 첫번째 문자를 출력해준다.


마찬가지로 4행에서 스트링변수를 선언하고 초기화해주고, 5행에서 문자열의 문자개수를 출력, 6행에서 문자열에서 두번째 문자를 출력한다.


2행과 3행, 5행과 6행의 출력값은 

4, A, 6, o가 될것이다.


첨자 연산자 


첨자연산자는 문자열 안의 문자를 검색, 수정할 수 있게 도와주는 구문이다.

1
2
3
string s = "ABCD";
s[0= 'P';
cout << s[0<< endl;
cs


위 예제의 2행이 첨자 연산자다. 3행의 출력결과로는 P가 출력되며, string 변수 s의 문자열값은 PBCD가 된다.



문자열의 특징으로는 문자열을 서로 붙일수도 있다는것이다. +연산자를 통해 이어붙이기가 가능하다.

1
string s3 = s1 + s2;

cs

이런식으로 활용이 가능할 뿐만 아니라 += 연산자도 사용가능하다.


그 외에 두개의 문자열을 비교하기 위해 ==, !=, <, <=, >, >= 와 같은 관계연산자도 활용할수있다.



C++에서 문자열을 입력할때 공백문자를 포함하는 문자열을 입력한다면, cin 함수가 아니라 다른 함수를 사용해야한다.


왜냐하면 위에서도 언급했지만 C++에서는 문자열을 객체로 다루기 때문이다.


그럼 어떻게 해야하는가? <string> 헤더 안의 getline함수를 사용한다.


1
2
3
4
5
6
getline(cin, s, delimitCharacter) // 구분문자(delimit character)를 만나면 문자의 입력을 멈추는 함수. 세번째인수의 기본값은 '\n' 이다.
 
string city;
cout << "Enter a city: ";
getline(cin, city, '\n'); // getline(cin, city)와 동일
cout << "you entered " << city << endl;
cs


이렇게 getline함수를 사용하면 엔터를 누를때까지 문자열의 입력을 받을 수 있다.


이정도만 알면 문자열은 끝이다.








최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함