Topic 3: 문자열 기초 📝
🎯 학습 목표
- C++ string 클래스의 기본 사용법을 익힐 수 있다
- 문자열 연산과 조작 방법을 이해할 수 있다
- 문자열 입출력과 처리 기법을 활용할 수 있다
🌟 문자열이란?
“문자열은 문자들의 연속으로, 텍스트 데이터를 저장하는 핵심 도구입니다!”
C++에서 문자열을 다루는 두 가지 방법:
- C 스타일: 문자 배열 사용 (복잡함)
- C++ string: string 클래스 사용 (편리함)
📝 C++ string 클래스
1. 문자열 선언과 초기화
#include <iostream>
#include <string>
using namespace std;
int main() {
// 다양한 초기화 방법
string str1; // 빈 문자열
string str2 = "Hello"; // 리터럴로 초기화
string str3("World"); // 생성자 사용
string str4(5, 'A'); // 'A'를 5번 반복: "AAAAA"
cout << "str1: '" << str1 << "'" << endl;
cout << "str2: " << str2 << endl;
cout << "str3: " << str3 << endl;
cout << "str4: " << str4 << endl;
// 문자열이 비어있는지 확인
if (str1.empty()) {
cout << "str1은 비어있습니다!" << endl;
}
return 0;
}
2. 문자열 길이 확인
#include <iostream>
#include <string>
using namespace std;
int main() {
string message = "Hello, World!";
// 길이 확인 (length()와 size()는 같은 기능)
cout << "문자열 길이: " << message.length() << endl;
cout << "문자열 크기: " << message.size() << endl;
// 빈 문자열 확인
if (message.empty()) {
cout << "문자열이 비어있습니다." << endl;
} else {
cout << "문자열에 내용이 있습니다." << endl;
}
return 0;
}
➕ 문자열 연산
1. 문자열 연결
#include <iostream>
#include <string>
using namespace std;
int main() {
string firstName = "홍";
string lastName = "길동";
// 방법 1: + 연산자
string fullName1 = firstName + lastName;
cout << "이름: " << fullName1 << endl;
// 방법 2: += 연산자
string greeting = "안녕하세요, ";
greeting += fullName1;
greeting += "님!";
cout << greeting << endl;
// 방법 3: append() 함수
string message = "오늘은 ";
message.append("좋은 날입니다.");
cout << message << endl;
return 0;
}
2. 문자열과 숫자 변환
#include <iostream>
#include <string>
using namespace std;
int main() {
// 숫자를 문자열로 변환
int age = 25;
string ageStr = to_string(age);
cout << "나이: " + ageStr + "세" << endl;
double pi = 3.14159;
string piStr = to_string(pi);
cout << "파이: " + piStr << endl;
// 문자열을 숫자로 변환
string numStr1 = "123";
int num1 = stoi(numStr1); // string to int
cout << "정수: " << num1 << endl;
string numStr2 = "3.14";
double num2 = stod(numStr2); // string to double
cout << "실수: " << num2 << endl;
return 0;
}
🔍 문자열 검색과 추출
1. 문자열 검색 (find)
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "C++은 강력한 언어입니다. C++을 배워보세요!";
// find() - 문자열 찾기
size_t pos = text.find("C++");
if (pos != string::npos) {
cout << "첫 번째 'C++' 위치: " << pos << endl;
} else {
cout << "'C++'를 찾을 수 없습니다." << endl;
}
// 두 번째 위치 찾기
pos = text.find("C++", pos + 1); // pos+1 위치부터 검색
if (pos != string::npos) {
cout << "두 번째 'C++' 위치: " << pos << endl;
}
// 문자 하나 찾기
pos = text.find('!');
if (pos != string::npos) {
cout << "'!' 위치: " << pos << endl;
}
return 0;
}
2. 부분 문자열 추출 (substr)
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "Hello, World!";
// substr(시작위치, 길이)
string part1 = text.substr(0, 5); // "Hello"
string part2 = text.substr(7, 5); // "World"
string part3 = text.substr(7); // "World!" (끝까지)
cout << "부분1: " << part1 << endl;
cout << "부분2: " << part2 << endl;
cout << "부분3: " << part3 << endl;
// 활용 예: 이메일에서 도메인 추출
string email = "user@example.com";
size_t atPos = email.find('@');
if (atPos != string::npos) {
string domain = email.substr(atPos + 1);
cout << "도메인: " << domain << endl;
}
return 0;
}
✂️ 문자열 수정
1. 문자열 삽입과 삭제
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "Hello World";
cout << "원본: " << text << endl;
// insert(위치, 문자열) - 삽입
text.insert(5, " Beautiful");
cout << "삽입 후: " << text << endl;
// erase(시작위치, 길이) - 삭제
text.erase(5, 10); // " Beautiful" 삭제
cout << "삭제 후: " << text << endl;
// clear() - 전체 삭제
string temp = "임시 텍스트";
cout << "clear 전: " << temp << endl;
temp.clear();
cout << "clear 후: '" << temp << "'" << endl;
return 0;
}
2. 문자열 교체
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "I love Java programming";
cout << "원본: " << text << endl;
// replace(시작위치, 길이, 새문자열)
size_t pos = text.find("Java");
if (pos != string::npos) {
text.replace(pos, 4, "C++"); // "Java"를 "C++"로
}
cout << "교체 후: " << text << endl;
// 모든 공백을 언더스코어로 교체
string filename = "my file name.txt";
for (int i = 0; i < filename.length(); i++) {
if (filename[i] == ' ') {
filename[i] = '_';
}
}
cout << "파일명: " << filename << endl;
return 0;
}
🎮 문자열 비교
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "apple";
string str2 = "banana";
string str3 = "apple";
// == 연산자로 비교
if (str1 == str3) {
cout << str1 << "과 " << str3 << "는 같습니다." << endl;
}
// 사전순 비교
if (str1 < str2) {
cout << str1 << "이 " << str2 << "보다 사전순으로 앞입니다." << endl;
}
// compare() 함수 사용
int result = str1.compare(str2);
if (result < 0) {
cout << str1 << "이 " << str2 << "보다 작습니다." << endl;
} else if (result > 0) {
cout << str1 << "이 " << str2 << "보다 큽니다." << endl;
} else {
cout << str1 << "과 " << str2 << "는 같습니다." << endl;
}
return 0;
}
📥 문자열 입출력
1. 기본 입출력
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
// 단어 입력 (공백 전까지)
cout << "이름을 입력하세요: ";
cin >> name;
cout << "안녕하세요, " << name << "님!" << endl;
// 버퍼 비우기
cin.ignore();
// 한 줄 전체 입력
string fullName;
cout << "전체 이름을 입력하세요: ";
getline(cin, fullName);
cout << "전체 이름: " << fullName << endl;
return 0;
}
2. getline 활용
#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
cout << "문장을 입력하세요 (quit 입력시 종료):" << endl;
while (true) {
cout << "> ";
getline(cin, line);
if (line == "quit") {
break;
}
cout << "입력한 문장: " << line << endl;
cout << "문장 길이: " << line.length() << "글자" << endl;
}
cout << "프로그램을 종료합니다." << endl;
return 0;
}
🎯 실습: 간단한 문자열 처리 프로그램
#include <iostream>
#include <string>
using namespace std;
// 문자열의 단어 수 세기
int countWords(string text) {
int count = 0;
bool inWord = false;
for (int i = 0; i < text.length(); i++) {
if (text[i] != ' ' && !inWord) {
count++;
inWord = true;
} else if (text[i] == ' ') {
inWord = false;
}
}
return count;
}
// 문자열 뒤집기
string reverseString(string text) {
string reversed = "";
for (int i = text.length() - 1; i >= 0; i--) {
reversed += text[i];
}
return reversed;
}
// 모음 개수 세기
int countVowels(string text) {
int count = 0;
string vowels = "aeiouAEIOU";
for (int i = 0; i < text.length(); i++) {
for (int j = 0; j < vowels.length(); j++) {
if (text[i] == vowels[j]) {
count++;
break;
}
}
}
return count;
}
int main() {
string text;
cout << "문장을 입력하세요: ";
getline(cin, text);
cout << "\n=== 문자열 분석 결과 ===" << endl;
cout << "원본: " << text << endl;
cout << "길이: " << text.length() << "글자" << endl;
cout << "단어 수: " << countWords(text) << "개" << endl;
cout << "모음 개수: " << countVowels(text) << "개" << endl;
cout << "뒤집기: " << reverseString(text) << endl;
// 대소문자 변환
string upper = text;
string lower = text;
for (int i = 0; i < upper.length(); i++) {
if (upper[i] >= 'a' && upper[i] <= 'z') {
upper[i] = upper[i] - ('a' - 'A');
}
}
for (int i = 0; i < lower.length(); i++) {
if (lower[i] >= 'A' && lower[i] <= 'Z') {
lower[i] = lower[i] + ('a' - 'A');
}
}
cout << "대문자: " << upper << endl;
cout << "소문자: " << lower << endl;
return 0;
}
💭 생각해보기
Q1. string vs char 배열
언제 string을 사용하고 언제 char 배열을 사용해야 할까요?
💡 답변
- string 사용: 대부분의 경우! 크기 조정, 연산, 안전성 면에서 유리
- char 배열 사용: C 라이브러리와 호환, 고정 크기, 성능이 극도로 중요한 경우
일반적으로 C++에서는 string 사용을 권장합니다.
Q2. string::npos의 의미
string::npos
는 무엇이고 왜 사용할까요?
💡 답변
string::npos
는 “찾지 못함”을 나타내는 특별한 값입니다.
- find() 함수가 문자열을 찾지 못하면 npos를 반환
- 실제로는 size_t 타입의 최대값
- 항상
!= string::npos
로 검사해야 함
Last updated on