배열
1. 배열
배열은 같은 종류의 데이터를 많이 다룰 경우 유용하게 사용할 수 있는 가장 기본적인 자료 구조입니다.
배열(array)은 같은 타입의 변수들로 이루어진 유한 집합으로 정의할 수 있다.
다른 타입의 변수들로 구성할 때는 구조체(struct)나 공용체(union), 클래스(class)를 사용하면 된다.
배열을 사용하기 위해서는 배열 요소(element)의 타입과 유한한 배열의 크기(size)를 지정해줘야한다.
타입 배열이름[사이즈] ;
ex) int Arr[10];
배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 합니다.
주의할 점은 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다는 점이다. 만약 배열의 사이즈가 10이라면 0부터 9까지 총 9개의 인덱스를 가지고 있다.
또한, 배열이름은 배열의 시작주소값을 가지고 있다. &배열이름= 배열의 시작주소 이며 배열이름 = 배열의 시작주소 는 사실을 아야한다. 즉, 배열이름과 배열이름이 존재하는 위치는 다 해당 배열의 시작주소(인덱스 0이 위치한 메모리주소)이다.
이를 통해 우리는 배열의 이름은 해당 배열이 시장되는 곳의 별칭이라 판단할 수 있다. 참고적으로 배열이름이 시작주소(0번 인덱스)를 가리키기 때문에 (*배열이름) = 배열이름[0] 과 같다.
1) 사용법
1.1 ) 배열 선언
타입 배열이름[사이즈];
1.2 ) 선언과 동시에 초기화
타입 배열이름[배열길이] = {배열요소1, 배열요소2, ...};
1.3 ) 컴파일러를 통해 자동으로 길이 설정
타입 배열이름[] = {배열요소1, 배열요소2, ... 배열요소n-1 }; // 이때 컴파일러가 사이즈를 n이라고 판단함
1.4) 동적 배열 할당
타입* 배열이름;
배열이름 = (타입 *) malloc(sizeof(타입) * 사이즈));
2) 주의사항
2.1) 컴파일러는 배열의 끝을 확인하지 않는다.
2.2) C++11에서는 int arr[10]={}; 이런식으로 괄호만 지정하면 0으로 다 초기화를 한다.
2.3) 배열을 초기화 해주지 않으면 쓰레기 값을 가지고 있다.
2.4) 배열을 초기화 할때도 narrow casting 이 발생한다. 강제 형변환으로 인한 값의 손실 발생.
2. 다차원 배열
배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있다.
다차원 배열이란 2차원 이상의 배열을 의미하며, 배열의 요소를 또 다른 배열을 가지는 배열이다.
즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며, 3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고,
4차원 배열은 배열 요소로 3차원 배열을 가지는 배열을 의미한다
하지만 현실적으로 이해하기가 쉬운 2차원 배열까지가 많이 사용되고, 빠른 속도를 위해서 2차원배열을 1차원으로 구현하기도 한다.
타입 배열이름[세로길이][가로길이];
1.2 ) 선언과 동시에 초기화
타입 배열이름[배열길이 n][배열길이 m] = { {배열 요소 1, 배열요소2, ... 배열요소 m-1}, {배열요소 m, .. 배열요소 2m-1}, ... } ;
1.3) 동적배열 할당
int ** arr = (int**) malloc(sizeof(int*) * 배열의 세로길이(row));
for(int i=0; i<col ; i++){
arr[i] = (int*) malloc(sizeof(int) * 배열의 가로길이 (col));
}
3. 추가 문법
3.1 배열의 일부 요소만을 초기화하는 방식
C++에서는 2차원 배열의 일부 요소만을 초기화할 수도
이 방식으로는 다음 예제처럼 2차원 배열의 원하는 배열 요소만을 초기화할 수 있습니다.
이때 초기화하지 않은 배열 요소는 모두 0으로 자동 초기화
int arr_col_len, arr_row_len;
int arr[3][4] = {
{10, 20},
{30, 40, 50, 60},
{0, 0, 70, 80}
};
4. 활용
특정 배열을 받고, 배열의 길이를 알아야할 경우,
배열의 길이 = sizeof(배열 이름) / sizeof(배열 이름[0])
를 통해서 길이를 구할 수 있다. sizeof(배열 이름)은 해당 배열이 차지하는 메모리 크기를 반환하고, size(배열이름[0])은 타입의 메모리 크기를 반환하기 때문에 배열의 길이(요소의 개수)를 알 수 있다.
2차원 배열 역시 마찬가지다.
int arr_col_len, arr_row_len;
int arr[3][4] = {
{10, 20},
{30, 40, 50, 60},
{0, 10, 70, 80}
};
//// 가로길이 - 열 길이= 한 행의 사이즈 / 한칸의 사이즈
//// 세로길이 - 행 길이 = 전체 / 열 / 한칸의 사이즈
arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]); // 열의 길이를 계산= 4
arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]); // 행의 길이를 계산= 3
'C++' 카테고리의 다른 글
오버로딩 Vs 오버라이딩 (0) | 2018.02.19 |
---|---|
증감연산자 오버로딩 (0) | 2018.02.18 |
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩 (0) | 2018.02.18 |
파일스트림 입출력 (0) | 2018.02.17 |
디폴트 인수 (0) | 2018.02.16 |