배열과 문자열(Array & String) 완벽 정리
1. 배열 (Array)
배열은 같은 타입의 데이터를 메모리상에 연속적으로 저장하는 자료구조입니다. 때문에 접근 속도가 빠르고, 인덱스 번호를 이용해 임의 위치 데이터에 빠르게 접근할 수 있습니다.
배열 크기는 선언 시 고정되며, 실행 중 변경할 수 없습니다. 그리고 인덱스는 0부터 시작한다는 점을 반드시 기억해야 합니다.
#include <iostream>
using namespace std;
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
cout << numbers[i] << " ";
}
return 0;
}
배열 선언과 초기화
배열은 선언 시 타입과 크기를 명시해야 하며, 크기는 상수여야 합니다.
int arr[3] = {10, 20, 30};
: 선언과 동시에 초기화int arr[5] = {1, 2};
: 나머지 요소는 0으로 자동 초기화int arr[] = {1, 2, 3, 4};
: 크기 생략 가능 (초기값 개수에 따라 자동 설정)
배열 크기를 벗어난 인덱스 접근은 치명적 오류를 초래할 수 있으니 주의해야 합니다.
다차원 배열
2차원 이상의 배열도 선언할 수 있으며, 주로 행렬 데이터에 사용합니다.
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
첫 번째 인덱스는 행(row), 두 번째 인덱스는 열(column)을 뜻합니다.
2. C 스타일 문자열 (char 배열)
C 스타일 문자열은 char
배열에 문자를 저장하고, 문자열 끝을 '\0'
(널 문자)로 표시하는 방식입니다. 널 문자가 없으면 문자열의 끝을 알 수 없습니다.
예를 들어, 문자열 "Hello"
는 문자 5개와 끝에 널 문자까지 총 6개 공간이 필요합니다.
#include <iostream>
using namespace std;
int main() {
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << greeting << endl;
return 0;
}
문자열 입력과 출력
cin
으로 입력할 수 있으나 공백 전까지만 입력되므로, 공백 포함 문자열은 입력 불가합니다.
#include <iostream>
using namespace std;
int main() {
char name[20];
cout << "이름을 입력하세요: ";
cin >> name;
cout << "안녕하세요, " << name << "님!" << endl;
return 0;
}
C 스타일 문자열의 단점
직접 메모리를 관리해야 하며, 버퍼 크기 제한과 널 문자 처리로 인한 오류 위험이 큽니다. 이런 이유로 현대 C++에서는 점차 std::string
사용이 권장됩니다.
3. C++ 스타일 문자열 (std::string)
C++에서는 std::string
클래스를 제공하여 동적 크기 관리, 다양한 문자열 조작 기능, 안전성을 갖춘 문자열 처리를 지원합니다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string greeting = "Hello";
cout << greeting << endl;
string name;
cout << "이름을 입력하세요: ";
cin >> name;
cout << "안녕하세요, " << name << "님!" << endl;
return 0;
}
std::string
은 길이 제한 없이 동적으로 크기를 조절할 수 있습니다.주요 멤버 함수
size()
,length()
: 문자열 길이 반환empty()
: 비어있는지 여부append()
,+=
: 문자열 뒤에 추가substr(pos, len)
: 부분 문자열 반환find(str)
: 특정 문자열 위치 검색clear()
: 문자열 내용 삭제
string str = "Hello World";
cout << "길이: " << str.length() << endl;
cout << "부분문자열: " << str.substr(6, 5) << endl; // World
메모리 구조 비교
C 스타일 문자열: 고정 길이 배열, 스택 메모리 사용, 널 문자 필수
std::string: 내부적으로 동적 메모리(힙) 사용, 자동 크기 관리, 안전함
// C 스타일
char str1[100];
// C++ 스타일
std::string str2 = "Hello";
4. 문자열 비교 & 주의사항
char*
배열 문자열은 strcmp()
함수를 이용해 비교해야 하며, ==
연산자는 포인터 주소 비교입니다.
#include <cstring>
char a[] = "hello";
char b[] = "hello";
if (strcmp(a, b) == 0) {
cout << "같은 문자열입니다." << endl;
}
반면 std::string
은 ==
연산자를 오버로딩해 내용을 바로 비교할 수 있습니다.
string a = "hello";
string b = "hello";
if (a == b) {
cout << "같은 문자열입니다." << endl;
}
5. 정리 및 결론
- 배열은 고정 크기, 같은 타입 데이터 연속 저장에 적합
- C 스타일 문자열은
char
배열 + 널 문자로 구성, 직접 메모리 관리 필요 - 문자열 조작 시
std::string
사용을 권장 - 문자열 비교는 C 스타일은
strcmp()
, C++ 스타일은==
연산자 활용
std::string
은 메모리 관리, 안전성, 편의성 측면에서 압도적이므로, 현대 C++ 개발에서는 항상 std::string
사용을 권장합니다.