Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료

Topic 3: 문자열 기초 📝

🎯 학습 목표

  • C++ string 클래스의 기본 사용법을 익힐 수 있다
  • 문자열 연산과 조작 방법을 이해할 수 있다
  • 문자열 입출력과 처리 기법을 활용할 수 있다

🌟 문자열이란?

“문자열은 문자들의 연속으로, 텍스트 데이터를 저장하는 핵심 도구입니다!”

C++에서 문자열을 다루는 두 가지 방법:

  1. C 스타일: 문자 배열 사용 (복잡함)
  2. 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