티스토리 뷰

코딩 씹어먹기/C++

[C++] 배열

jhcard 2022. 5. 18. 21:34
728x90
반응형

기본적인 배열에 대한 설명은 생략한다.

C++에서의 배열의 활용, 초기화, 동적 배열에 대해 알아보려고 한다.

 

1. 배열 선언 및 초기화

먼저 알고 나면 좋은 것을 알려주겠다.

int arr[5] = {1,2,3,4,5};
int arr[5]{1,2,3,4,5};

위의 코드는 동일한 결과값을 가진다. arr배열은 순서대로 1,2,3,4,5를 가지게 된다. 

이 코드는 다양한 방식에 적용 가능하다.

개인적으로 아래의 방식을 선호한다. 아래에 설명이 되어있는 동적배열에서 많이 사용되는 코드이다.

예를 들면,

int arr[5] = {};		// 전부 0으로
int arr[5]{};			// 전부 0으로

int arr[5] = {1,2,3};		// arr[0~2]는 1,2,3을, arr[3~4]는 0으로 초기화
int arr[5]{1,2,3};		// arr[0~2]는 1,2,3을, arr[3~4]는 0으로 초기화

주석에 써져있는것 처럼 배열 바로 뒤에 {}를 해준 것과 =을 붙여 초기화 해준 것과 결과값이 같다. 

 

다음은 배열의 다른 방식의 초기화 방법이다.

int arr[] = {1,2,3,4,5};
int arr[]{1,2,3,4,5};

이 방식 또한, 괄호의 역할이 동일하다.

이 방식은 먼저 배열의 크기를 정해주지 않아도 뒤에 선언되어 있는 초기화 숫자로 배열의 크기가 자동으로 결정된다.

int arr[5];			// 쓰레기 값으로 초기화
int arr[5] = {1};		// 첫번째 원소만 1로 초기화 나머지는 0
int arr[5] = {0}; 		// 모두 0으로 초기화

 

C++의 배열에 대한 내용은 여기서 끝이다.

 

2. 동적 배열

동적 배열이 무엇일까?

위에서 설명한 방식은 정적인 배열 선언 방식이다. 즉, 선언과 동시에 배열의 크기가 결정된다.

하지만, 동적 배열은 중간에 배열의 크기가 변경될 수 있다. 말이 조금 어렵지만, 쉽게 풀어쓰면 변수가 배열의 크기로 지정될 수 있는 것이다.

int arr[5]; 		// 정적인 배열 선언

int x = 5;
int arr[x] 		// err

위의 내용을 보면 첫번째 코드는 우리가 위에서 접한 내용이다. 정적인 배열의 선언이다. 하지만 위의 예시와는 다르지만, x의 값이 사용자에 입력이 된 변수라고 생각해보면 사용자가 입력한 값 만큼 배열을 생성하고 싶을 때가 있을 것이다. 그러한 경우 동적 배열이 사용된다. 

위의 코드는 동적으로 하려고 했지만, 에러가 난 코드이다. 우리는 배열의 선언을 변수로 설정하고 싶을 때 동적 배열을 사용해준다. C++의 경우 동적 배열 할당은 포인터를 이용한다.

 

2.1 일차원 배열 동적 할당

2.1.1 일차원 배열 동적 할당 선언 및 초기화

int x = 5;
int* arr = new int[x];

어떠한가. 나는 처음에 봤을 때 매우 당황했다. 포인터가 들어간 배열? ㅋㅋ 에~라이

여기는 나중에 보충 설명 할테지만 현재는 이렇게 생각해야 할 것 같다.

arr는 포인터 int변수로 int[x]만큼 공간이 할당되는 것이다.

 

여기에서 위에 괄호를 활용한 초기화를 왜 사용하면 좋은지 알려주도록 하겠다.

int x = 5;
int* arr = new int[x]{1,2,3,4,5}; 	// arr배열이 순서대로 1,2,3,4,5로 초기화된다.

여기에서 ={1,2,3,4,5} 방식을 사용할 수 없다. 참고!

그런데 여기에서 의문이 하나 생긴다. 괄호의 숫자를 6개로 하면 어떻게 될까? 

여기에서 분명 x는 5로 arr의 크기는 5만큼 할당이 되었지만, arr가 할당된 크기 이상의 값을 가져올 수 있다.

그 이유는 포인터에 있다.(뇌피셜이다.) arr는 배열의 시작 주소이다. arr[6]은 arr + 4*6의 위치에 접근하게 된다. 그렇기 때문에 접근 가능하게 되고, 만약 arr[6]의 값을 출력하면 쓰레기 값이 나오게 된다. 

그런데 초기화를 {1,2,3,4,5,6}으로 하면 arr[5]를 출력하여도 6이 나오게 된다. 참고하도록 하자.

 

2.1.2 일차원 배열 동적 할당 해제

배열을 동적으로 할당해준다면, 마지막에 해당 배열을 할당 해제해줘야 한다.

그 방법은 다음 코드에 있다.

delete[] arr

 

2.2 이차원 배열 동적 할당

2.1.1 이차원 배열 동적 할당 선언 및 초기화

살짝 어지럽다. ㅋㅋ

int x = 5;
int y = 6;
int** arr[] = new int*[y];

for(int i = 0; i<y; i++){
	arr[i] = new int[x];
}

어지럽다~ 그죠잉? 나는 외웠다.. 책이 본가에 있어서 ㅠㅠ 나중에 필요할때 수정하도록 하겠다.

그냥 외우도록 하자!

 

초기화는 for문 안에 있는 arr[i] = new int[x]에서 해주면 된다.(필요하다면?)

 

2.1.2 이차원 배열 동적 할당 해제

for(int i = 0; i<y; i++){
	delete[] arr[i];
}

delete[] arr;

해제를 2번 해줘야 한다.

728x90
반응형

'코딩 씹어먹기 > C++' 카테고리의 다른 글

[C++] cstring  (0) 2022.05.24
[C++] string 라이브러리  (1) 2022.05.23
[C++] List 라이브러리  (0) 2022.03.21
[C++] algorithm 라이브러리  (0) 2022.03.21
[C++] Vector 라이브러리  (0) 2022.03.20