C++

C++ 문자열 배열(Array of Strings) 총정리

김구티2 2024. 6. 18. 19:46

1. 문자열 배열의 개념

C++에서 문자열은 일반적으로 NULL 문자 '\0'으로 끝나는 문자의 배열이다. 문자열은 문자의 1차원 배열이고 문자열의 배열은 각 행이 일부 문자열을 포함하는 문자의 2차원 배열이다.

 

C++에서 문자열 배열을 만드는 방법으로는 5가지가 있다.

① 포인터 사용
② 2D 배열 사용
③ 문자열 클래스 사용
④ 벡터 클래스 사용
⑤ 배열 클래스 사용

2. 포인터 사용

포인터는 주소를 상징적으로 나타내는 것이다. 간단히 말해서 포인터는 변수의 주소를 저장하는 것이다. 이 방법에서 문자열 리터럴의 배열은 각 포인터가 특정 문자열을 가리키는 포인터의 배열로 만들어진다.

 

예시:

// C++ program to demonstrate 
// array of strings using
// pointers character array
#include <iostream>

// Driver code
int main()
{
     // Initialize array of pointer
     const char* colour[4]
          = { "Blue""Red""Orange""Yellow" };

     // Printing Strings stored in 2D array
     for (int i = 0; i < 4; i++)
          std::cout << colour[i] << "\n";

     return 0;
}

 

출력:

Blue
Red
Orange
Yellow

 

문자열의 수는 고정되어 있지만, 사실 그럴 필요는 없다. 4는 생략될 수 있으며, 컴파일러가 정확한 크기를 계산할 것이기 때문이다. 그런데 이러한 문자열은 상수이므로 내용을 변경할 수 없다. 문자열 리터럴은 메모리의 읽기 전용 영역에 존재하기 때문에 프로그램을 충돌시킬 수 있는 원하지 않는 액세스를 방지하려면 여기에서 "const"를 지정해야 한다.

3. 2D 배열 사용

2D 배열은 표 형식으로 데이터를 저장하는 다차원 배열의 가장 간단한 형태다. 이 방법은 모든 문자열의 길이가 알려져 있고 특정한 메모리 사용량을 원할 때 유용하다. 이때 문자열을 위한 공간이 단일 블록에 할당된다.

 

예시:

// C++ program to demonstrate 
// array of strings using
// 2D character array
#include <iostream>

// Driver code
int main()
{
     // Initialize 2D array
     char colour[4][10]
          = { "Blue""Red""Orange""Yellow" };

     // Printing Strings stored in 2D array
     for (int i = 0; i < 4; i++)
          std::cout << colour[i] << "\n";

     return 0;
}

 

출력:

Blue
Red
Orange
Yellow

 

문자열의 수와 문자열의 크기는 모두 고정되어 있다. 4는 다시 생략될 수 있으며, 적절한 크기는 컴파일러에 의해 계산될 것이다. 하지만 두 번째 차원은 컴파일러가 적절한 메모리 레이아웃을 선택할 수 있도록  주어져야 한다. 위에서는 10이 될 것이다. 각각의 문자열은 수정될 수 있지만 두 번째 차원에 의해 주어진 전체 공간을 차지할 것이다. 각각은 메모리에서 서로 옆에 놓여질 것이고, 크기를 바꿀 수 없다. 그리고 여기서 메모리 사용량을 제어하는 것이 바람직하며, 이는 고정된 규칙적인 레이아웃으로 메모리 영역을 할당한다.

4. 문자열 클래스 사용

STL 문자열 또는 문자열 클래스는 변경 가능한 문자열의 배열을 만드는 데 사용될 수 있다. 이 방법에서는 문자열의 크기가 고정되지 않고 문자열을 변경할 수 있으므로 본질적으로 동적이지만, std::string을 사용하여 내장 함수를 사용하여 문자열 배열을 만들 수 있다.

 

예시:

// C++ program to demonstrate 
// array of strings using
// string class
#include <iostream>
#include <string>

// Driver code
int main()
{
     // Initialize String Array
     std::string colour[4]
          = { "Blue""Red", "Orange""Yellow" };

     // Print Strings
     for (int i = 0; i < 4; i++)
          std::cout << colour[i] << "\n";
}

 

출력:

Blue
Red
Orange
Yellow

 

배열은 고정된 크기이지만 꼭 그럴 필요는 없다. 여기서도 4는 생략될 수 있으며, 컴파일러가 배열의 적절한 크기를 결정한다. 물론, 문자열도 변경이 가능하도록 변경할 수 있다.

5. 벡터 클래스 사용

벡터는 한계를 초과하는 새로운 문자가 추가될 때마다 크기가 두 배로 증가하는 동적 배열이다. STL 컨테이너 벡터를 사용하여 크기가 달라질 수 있는 배열을 동적으로 할당할 수 있다.

예시:

// C++ program to demonstrate 
// array of strings using 
// vector class
#include <iostream>
#include <string>
#include <vector>

// Driver code
int main()
{
     // Declaring Vector of String type
     // Values can be added here using 
     // initializer-list
     // syntax
     std::vector<std::string> colour{"Blue""Red",
                                                       "Orange"};

     // Strings can be added at any time 
     // with push_back
     colour.push_back("Yellow");

     // Print Strings stored in Vector
     for (int i = 0; i < colour.size(); i++)
          std::cout << colour[i] << "\n";
}

 

출력:

Blue
Red
Orange
Yellow

 

벡터는 동적 배열이며 언제든지 항목을 추가 및 제거할 수 있다. 모든 유형 또는 클래스가 벡터에 사용될 수 있지만, 주어진 벡터는 한 가지 유형만 유지할 수 있다는 것을 명심해야 한다.

 

개인적으로는 벡터 클래스를 이용하는 것이 가장 좋은 방법인 것으로 보인다.

6. 배열 클래스 사용

배열은 메모리 공간에 연속적으로 저장되는 데이터의 균일한 혼합물이라 할 수 있다. STL 컨테이너 배열은 고정된 크기의 배열을 할당하는 데 사용될 수 있다. 벡터와 매우 유사하게 사용될 수 있지만 크기는 항상 고정되어 있다.

 

예시:

// C++ program to demonstrate 
// array of string using STL array
#include <array>
#include <iostream>
#include <string>

// Driver code
int main()
{
     // Initialize array
     std::array<std::string, 4> colour{"Blue", "Red",
                                                        "Orange""Yellow"};

     // Printing Strings stored in array
     for (int i = 0; i < 4; i++)
          std::cout << colour[i] << "\n";

     return 0;
}

 

출력:

Blue
Red
Orange
Yellow

728x90