Programming/C++

C++ : 배열과 문자열

나무수피아 2025. 4. 28. 12:19
728x90
반응형

 

배열과 문자열(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;
}
📌 Tip: 배열 인덱스는 항상 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;
}
📌 Tip: 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 사용을 권장합니다.
728x90
반응형

'Programming > C++' 카테고리의 다른 글

C++ : 기초 프로젝트  (6) 2025.04.28
C++ : 클래스와 객체  (0) 2025.04.28
C++ : 구조체와 열거형  (0) 2025.04.28
C++ : 포인터와 참조  (0) 2025.04.28
C++ : 함수  (0) 2025.04.28
C++ : 제어문  (0) 2025.04.28
C++ : 변수와 자료형  (0) 2025.04.28
C++ : 입출력과 기본 프로그램 구조  (0) 2025.04.28