[문과 코린이의 IT 기록장] C,C++ - 문자 (문자(char), 문자 배열, 문자열, Stirng)
[문과 코린이의 IT 기록장] C,C++ - 문자 (문자(char), 문자 배열, 문자열, Stirng)
1. 문자(char)
: 문자는 인간만이 가지는 특수한 인식 체계이다. 즉, 컴퓨터 내부에서 문자라는 것은 존재하지 않는다.
1) char
: char변수는 1byte 정수(integer)이다.
: 그러나, char 자료형이 정수일지라도, 일반 정소와는 다른 방식으로 사용한다.
: 그래서, char 값을 정수로 해석하는 대신, ASCII code 문자로 해석한다.
* ASCII란? ) American Standard Code for Information Interchange의 약자로, 영어 문자(+몇 개의 다른 기호)를, 0에서 127사이의 숫자(ASCII)코드로 나타낸다. 예를 들어, 'a'의 문자는 97, 'b'는 98이다. 문자는 항상 따옴표("") 사이에 배치된다.
cf) ASCII 코드표 :
2) char 사용 주의사항
- 문자와 실제 숫자를 혼동하며 사용하면 안 된다.
3) 형 변환을 통해 문자를 정수로 출력하기
: 문자를 문자 대신 정수로 출력하게 하려면, cout에게 문자를 정수처럼 출력하도록 지시해야 한다.
a. 이 작업을 수행하는 첫 번째 방법은 char을 정수에 할당하고, 정수에 출력하는 것이다.
ex )
b. 두 번째 방법은 형 변환(type casting)을 하는 것이다.
- 형 변환은 다른 자료형의 값으로부터, 특정 자료형의 값으로 만드는 것이다.
- 기본 자료형 간에 변환하려면 static_cast를 사용하면 된다.
- static_cast 문법 : satatic_cast<new_type>(expression)
ex )
- 입력으로 사용되는 expression에 변수를 전달하면, 그 변수는 값을 생성하기 위해 평가되고, 새로운 자료형의 값으로 변환된다. 여기서 변수는 아무른 영향을 받지 않는다. 즉, char변수는 그대로 char변수이며, 여전히 같은 값을 가지게 된다.
- static_cast는 범위(range)검사를 수행하는 것은 아니다. 따라서 char에 맞지 않게 너무 큰 정수를 지정하면, char가 오버플로(overflow)가 된다.
2. 문자 배열
ex ) char str1[5]{'A', 'B', 'C', 'D', 'E'};
- 각 배열 요소는 char 자료형으로, 수치 자료와 문자로 사용할 수 있다.
- 표준 C-style 문자열 함수를 사용할 수 없다.
3. 문자열
: 전통적인 문자열은 배열을 이용하며, 마지막에 '\0'문자를 포함한다.
: C++의 문자열 함수(strlen, strcpy.. 등)은 모두 배열의 마지막에 '\0'이 있다는 것을 가정하고 동작한다.
: "ABCDE"와 같이, " "로 여러 문자를 나열한 것은 문자열이다.
* C언어에서는 문자 리터럴이 int와 동일하게 4byte이지만, C++에서는 char과 동일하게 1byte이다.
- C언어에서는 문자열을, char형을 원소로 하는 배열이나, char형을 원소로 하는 포인터 형식으로 나타낼 수 있다.
포인터 | 배열 이름 | |
이름이 존재하는가? | O | O |
무엇을 나타내는가? | 메모리의 주소 | 메모리의 주소 |
변수인가 상수인가? | 변수 | 상수 |
4. String
- 기존 C언에서 문자열 처리를 하려면, 특히 가변 길이를 처리할 때, 상당히 어려웠다. (프로그래머가 손수 메머리를 재할당해주기도 하고, 아니면 충분한 배열을 선언해주는 등 여러가지 번거로운 문제들이 많았다.)
- 이 어려움들을 해결하기 위해, C++에서는, 클래스로 문자열을 감싸고, public을 통해 쉽게 사용할 수 있도록, string을 정의하고 만들었다. 그래서 C++에서는 문자열 사용을 기본적으로 string으로 하고 있다.
- string을 사용하려면, string 헤더파일을 선언해줘야한다. #include <string>
1) C++에서 문자열을 다룰 수 있는 2가지 방법은?
a. C-string
: C언어에서 사용해오던 전통적인 문자열로, '\0'으로 끝나는, char타입의 배열을 취급하는 방법이다.
ex ) char s[100]; scanf("%s",s);
b. String 클래스
: C++ 표준 라이브러리에서 제공하는 클래스로,, 문자열의 크기를 동적으로 변경 가능하다.
ex ) string str = "";
getline(cin, str); // 문자열 입력받기
cout<<str;
str.append("you"); // 문자열 뒤에 문자열 추가하기
cout<<str;
cout<<str[0];
2) string 사용
#include <string>
- string myName; // string타입의 변수 정의 가능
- string myName("Alex"); // myName변수를, 문자열 리터럴(string literal) "Alex"로 초기화
- string myName("John"); // myName변수에, 문자열 리터럴(string literal) "John"할당
- string myID("45"); // 문자열에는 숫자도 포함할 수 있다. 그러나 이는 텍스트로 처리되므로, 숫자처럼 조작할 수 없다.
3) 문자열 입력 및 출력 (String input and output)
a. 문자열 출력
- std::cout을 사용해서 문자열을 출력할 수 있다.
b. 문자열 입력
- std::cin로 인해, 문자열을 입력할 때는 주의사항이 있다.
- 연산자 >>를 사용하여, cin에서 문자열을 추출하게 되면, >>는 첫 번째 공백까지만 반환한다. 다른 모든 문자는 cin 내부에 남겨져, 다음 추출을 기다린다.
- 따라서, 연산자 >>를 통해 "Hello World"를 입력하게 되면, cin 내에 World가 남겨져 다음 추출을 기다리고, 이는 변수 age의 문자열 추출 대신, World를 나타낸다.
4) std::getline() to input text
- 위와 같은 주의사항을 고려해, 만약 문자열 전체를 읽고 싶다면 std::getline()함수를 사용하는 것이 좋다.
- std::getline()은, std::cin과 std::string, 두 개의 매개 변수가 있다.
5) std::cin과 std::getline 동시사용
- 이 프로그램은 1,2를 입력하도록 요청하고, 입력할 때까지 기다린다. 그리고 입력 후, 이름을 입력하게 된다.
- 하지만 실행되는 결과를 보면, 이름을 입력할 때까지 기다리지 않는 것을 볼 수 있다.
- cin을 사용하여 숫자 값을 입력하면, cin은 숫자 값 + \n을 캡쳐한다. 따라서 이 코드에서, cin은 실제로 2\n문자열을 얻는다. 이후 숫자 값 2를 추출해서, choice 변수에 할당하게 되고, getline()함수가 이름을 읽으러 갈 때, 스트림에 "\n"이 남아 있는 것을 보고 빈 문자열을 입력 받았다고 생각해, name 변수에 빈 문자열을 할당한다.
해결방안 )
cin으로 숫자 값을 읽은 후, 스트림에서 "\n"을 제거하는 것이 좋다.
cin.ignore(32767,'\n'); |
cf ) 매직넘버 32767이란? : cin::ignoer()함수가 무시할 숫자 수이다.
즉, choice 변수를 읽은 후에, 이 코드를 삽입하면, 관련 없는 개행이 스트림에서 제거되고, 프로그램이 잘 동작하게 된다.
ex )
6) 문자열 추가
- 연산자 +를 사용해서 두 문자열을 연결하거나, +=를 사용해서 한 문자열을 다른 문자열에 추가할 수 있다.
ex )
7) 문자열 길이
- 문자열의 길이를 알고 싶으면, length()맴버 함수를 통해, 문자열의 길이를 요청할 수 있다.
ex ) length(myName) [X], myName.length() [O]
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |