C++

5. Array And Vector

Kelvin의 게임개발 2023. 12. 9. 01:11
728x90
반응형

1. What is an Array?

 

Array (배열)이란 복합 데이터 타입 or Data Structure이다 -> 배열은 다른 데이터 타입으로 만들어진 데이터 타입이다
ex) 정수들로 만들어진 배열은 정수타입 배열이다

 

배열의 모든 요소들은 같은 타입이어야 한다, 각 요소들에 직접 접근할 수 있다 (배열 요소들의 위치 인덱스를 이용한다)

 

배열은 같은 타입의 데이터들 여러개를 관리하기 쉽게 하기 위해서 사용한다 ex) 100명의 시험점수를 관리할 때 -> 1개씩 변수로 만들어 관리하면 컨트롤하기 힘드며 실수가 발생할 확률이 높다

 

배열은 원하는 만큼의 요소들을 제공하고 하나의 이름으로 관리한다 (각각의 요소에 이름을 붙히지 않는다)

 

배열의 크기는 고정되어 있다 (한번 사이즈를 정해서 만들면 저절로 변하지 않는다), 변경이 필요하다면 배열의 최대 사이즈를 다시 변경해야한다

 

배열의 요소들은 메모리에 연속적으로 저장된다

 

배열의 요소들의 인덱스는 0부터 시작한다

 

배열은 범위를 벗어나는 인덱스 요소에 접근할 때 체크해주지 않는다 (에러 발생)

 

배열도 변수와 마찬가지로 초기화 하지 않으면 이상한 값이 들어있게 된다 -> 보통 반복문과 배열을 함께 사용한다

 

 

2. Declaring and Initialize Array

 

배열은 요소타입 배열이름 [개수];로 선언한다 ex) int TempArray[10];

 

배열은 선언과 동시에 초기화를 하는게 좋다

 

다음은 다양한 배열의 초기화 방법이다

int main()
{
	int TestScores[10]; //10칸짜리 배열 선언

	int TempScores[5]{ 100, 99, 90, 32, 31 }; //하나하나 직접 초기화 하는 방식
	int HighScorePerLevel[10]{ 3,5 }; //0번, 1번은 3과 5로 초기화 되었고 나머지는 0으로 자동 초기화 된다
	double HiTemperatures{ 10 }; //0번만 10으로 초기화하고 나머지는 0으로 초기화된다
    	int TestArray[5]{}; //전부 0으로 초기화 한다
	int TempArray[]{ 1,2,3,4,5 }; //배열의 크기를 정하지 않고 초기화한 값 개수로 컴파일러가 배열의 크기를 지정하게 할 수 있다
}

 

 

3. Accessing and Modifying Array Elements

 

배열의 index 접근은 배열이름[원하는 index];로 접근이 가능하다 ex) TestScore[3]; 으로 TestScore배열의 4번째 index data에 접근이 가능하다

 

접근한 배열의 요소들은 다른값으로 할당이 가능하다 ex) TestScore[3] = 100;

배열의 이름은 0번 index 요소의 주소를 나타낸다 (메모리 위치), 1번 index 요소의 주소는 0번째 주소와 byte크기만큼 차이가 나게 된다(int타입 배열이면 4만큼 주소에서 차이가 난다)

배열의 index로 요소에 접근하는 방법은 배열의 시작부터 해당 index까지의 offset을 컴파일러가 계산하여 반환하는 방식이다

 

int main()
{
	char Vowels[]{ 'a', 'e', 'i', 'o', 'u' }; //5칸짜리 a,e,i,o,u로 초기화 된 배열 선언

	cout << "The First Vowel is:" << Vowels[0] << endl; //Vowels배열의 0번째 index에 접근 (a)

	Vowels[2] = 'c'; //배열 index로 요소에 접근하여 값을 할당할 수 있다

	cout << Vowels[2] << endl;

	cout << Vowels << endl; //배열의 이름은 0번째 index의 주소이기 때문에 주소가 출력된다

	//cin >> Vowels[5]; //이렇게 배열의 index 범위에 넘어서는 값에 접근하게 된다면 크래쉬가 발생하거나 중요한 값이 replace 될 수 있다
}

 

 

4. MultiDemensional Array (다차원 배열)

 

2차원 배열은 요소타입 배열이름 [행의 개수][열의 개수];로 선언이 가능하다


일반 배열과 마찬가지로 배열이름[행index][열index]로 접근이 가능하다

 

내부적으로 보면 사실상 1차원배열과 다차원배열은 동일하다

 

int main()
{
	int TestTwoDimArray[3][4]
	{
		{0,1,2,3},
		{4,5,6,7},
		{8,9,10,11}
	}; //3행 4열의 2차원 배열 선언 후 초기화


	TestTwoDimArray[1][2] = 100; //1행 2열의 값을 100으로 할당
}

 

 

5. Declaring and Initializing Vectors

 

배열의 크기는 고정되어 있어 저절로 바뀌지 않는다 하지만 vector는 동적이기 때문에 런타임에 크기를 조절할 수 있다


vector는 C++ STL 컨테이너중 하나이다
vector는 sort(정렬), reverse(역순), find.. 등등 다양한 기능을 사용할 수 있다
vector는 index범위를 벗어났는지 체크도 해준다 (bound check)
vector의 요소들은 전부 같은 타입이어야 한다


vector를 선언할 때는 #include <vector>로 vector library를 포함해주어야 한다 OOP Template class


vector<타입> 이름;으로 vector를 선언할 수 있다 (vector는 OOP Template Class이기 때문에 <>를 사용한다)
vector<타입> 이름(개수);로 vector를 개수에 맞게 선언도 할 수 있다 이때 배열과 다르게 vector는 자동으로 0으로 초기화 된다

 

초기화 할 때는 배열과 같은 문법으로 { }를 이용하여 초기화 한다


vector에 다른 vector를 할당할 수 있다 (배열은 X)

 

vector data도 메모리에 연속적으로 저장된다

 

#include <vector> //vector include 필요

int main()
{
	vector<int> TestVector; //int타입의 vector선언
	vector<int> TestVector2(10); //10개의 요소가 0으로 자동 초기화 된다

	vector<char> VowelsVector{ 'a','e','i','o','u' }; //배열과 같은 문법으로 초기화 가능

	vector<double> HiTemperatures(365, 80.f); //365개 크기의 vector를 선언하고 전부 80.f으로 초기화 한다는 의미이다
}

 

 

6. Accessing and Modifying Vector Elements

 

vector의 요소에 접근하기 위해서는 벡터이름[index];로 접근할 수 있다
vector의 요소에 접근하기 위해서는 벡터이름.at(index);로 접근할 수 있다 (직관적이며 index범위 밖에 접근하는지 체크(예외처리)해준다 []는 해주지 않는다)

 

vector도 배열과 마찬가지로 요소에 접근 후 값을 할당할 수 있다

vector는 동적이기 때문에 크기가 변할 수 있다 따라서 vector의 맨 뒤에 값을 넣을 수 있는데 벡터이름.push_back(값);으로 처리가 가능하다 (넣는 값의 type은 vector type과 일치시켜야 함)

벡터이름.size()는 vector의 요소 개수를 반환해준다

 

#include <vector>

int main()
{
	vector<int> TestScores{ 10,20,30,40,50 };

	cout << TestScores[2] << endl; //3번째 값에 접근하여 30을 출력
	cout << TestScores.at(1) << endl; //2번째 값에 접근하여 20을 출력

	TestScores.at(3) = 70; //4번째 값에 접근하여 70이라는 값을 할당

	TestScores.push_back(60); //vector의 마지막에 60이라는 값을 추가한다 -> 10, 20, 30, 70, 50, 60이 된다

	cin >> TestScores.at(10); //vector는 index범위밖에 벗어나는 index에 접근하려 하면 예외처리를 해준다 (에러 발생)

	cout << TestScores.size() << endl; //TestScores의 요소 개수를 출력한다 (6)
}

 

2차원vector는 vector <vector<타입>> 2차원벡터이름 { {}, {}, {} };으로 선언한다 (초기화는 2차원 배열과 같다)

 

2차원vector의 접근도 배열과 같다, 2차원벡터이름[행index][열index]; 혹은 2차원벡터이름.at(행index).at(열index);로 가능하다

 

#include <vector>

int main()
{
	vector<vector<int>> TwoDimVector
	{
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}
	}; //2차원 vector 선언, 초기화 완료
}

 

 

728x90
반응형

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

7. Control Program Flow (1)  (89) 2023.12.20
6. Operators (연산자)  (131) 2023.12.12
4. Variables and Constants  (110) 2023.12.07
3. Structure of a C++ Program  (2) 2023.11.22
2. Getting Started C++(2)  (1) 2023.11.21