알고리즘

[알고리즘] 배열 개념

FORHAPPy 2021. 9. 29. 11:15

배열

 

자료구조  데이터 단위와 데이터 자체사이의 물리적 또는 논리적인 관계로
자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법.
데이터 단위 데이터를 구성하는 한 덩어리
배열  같은 자료형의 변수로 이루어진 요소가 모여 직선모양으로 줄지어 있는 자료구조.
배열의 요소 상수만 사용할 수 있다.
상수식 상수만을 포함하는 식으로 실행시점이 아닌 컴파일 시점에 할당 및 계산 된다.
배열 특징 각 요소는 단일로 선언한 int형 변수와 성질이 같기 때문에 각 요소에 int 형값을 자유롭게 대입하거나 제거 할 수있다.
배열의 자료형 int[5] 형 ( int [요소의 개수]형 )이다. int 형이 아니다.

 

#define 을 사용하여 상수를 최소화 시킴

sizeod(a)는 전체 배열이 할당된 메모리 크기이고, sizeof(a[0])는 첫 요소값이 할당 된 메모리 크기이다.

배열의 개수 : sizeod(a) / sizeof(a[0]) 이는 배열 요소의 자료형이나 크기에 영향을 받지 않는다.

sizeod(a) / sizeof(int) 는 자료형이 바뀔 경우에 안전하지 않다.

 

 

기본적인 동적할당

 

new 연산자 heap 영역에 메모리를 만들어 준다. 그리고 return 값은  주소값이다. (변수이름 없이 주소값만 존재 한다.)
delete 가리키는 주소의 메모리를 해제한다.

따라서, 주소값을 반환 해주기 때문에 new값을 저장하는 변수는 포인터 형식의 변수 여야 한다.

 

다음 그림을 보자. 

문자열을 저장하는 char* 형은 주소(문자열)의 값을 바꿀 수 없기 때문에 const char*형을 써준다.

상위버전의 visual studio에서는 컴파일에러가 뜸.

 

ch의 주소값을 출력하고 싶으면  (void*)로 형변환을 해줘야 한다.

std::cout 자체에 문자열을 보여주도록 기능이 구현되어 있기 때문이다. 

따라서 문자열의 포인터 변수가 담고있는 주소값이 보고 싶은 경우 (void*)로 형변환을 해준다.

 

1. cout << "할당된 heap의 크기 : " << sizeof(*cha) << endl;
2. out << "할당된 heap의 크기 : " << sizeof(cha) << endl;

부분을 보면 1번은 변수를 가르키는 *cha 형태의 메모리크기를 나타내고,

2번은 주솟값을 가지고 있는 포인터 변수의 메모리 크기를 나타낸다. 

포인터 변수의 메모리크기는 32비트 환경에서는 언제나 8바이트가 할당된다.

 

 

배열의 동적할당 (동적할당은 주로 배열에서 많이 쓴다.)

배열의 동적할당 초기화 방법

int num = 5; 를 선언함으로서 상수쓰는걸 최소화 한다!!

배열은 상수식이기 때문에 컴파일이 된 후에는 크기를 늘렸다가 줄였다가 할 수 없다. 

배열을 동적으로 할당한다는 것은 배열의 전체 크기를 줄였다가 늘였다가 하는게 아니다.

 

배열의 동적할당은 

배열의 크기를 미리 정해두고 heap의 영역에 할당을 하는데

원하는 시기에 메모리를 할당하고 원하는 시기에 제거를 할 수 있다. (동적)

 

 

동적할당시 초기화 방법

 

 

  1. 1번과 2번은 4로 초기화를 하였다.
  2. 4번은 배열의 크기 5를 할당하였고 전부 0으로 초기화한 방식이다.
  3. 5번은 20바이트의 메모리를 동적할당 하였고 hello 로 초기화 하였다. 
  4. 5번의 경우 문자열에 역참조 연산자를 사용하여 맨 앞글자만 출력되었다.
  5.  6번은 5번처럼 문자열로 초기화 해주었다. 
  6. 4.5.7,8 은 배열의 요소를 {} 중괄호를 쳐가지고, 초기화 해주었다.

 

 

new로 2차원 배열을 할당

 

중요한 특징은 메모리를 해제할때 반복문으로 row의 각각 열에 해당하는 것들을 배열 해제 시키고 

row배열을 해제해 줘야한다.

 

 

 

 

주의사항

 

  1. 메모리 할당 했으면 delete 를 해줘서 메모리 누수를 방지한다.
  2. 배열을 동적할당한다고 해서 동적배열은 아니다. 
  3. new는 연산자이므로 malloc 보다 연산이 빠르다.
  4. new의 메모리할당 실패시 익셉션bad_alloc을 리턴한다.