C/C++ 배열 사용법
안녕하세요 열코입니다.
이번시간에는 C/C++에서 배열의 사용법에 대해 알아보겠습니다.
컴퓨터 공학에서 배열(array)이란 번호(index)와 그에 대응하는 데이터들로 이루어진 자료구조를 뜻합니다.
일반적으로 배열은 같은 종류(type)의 데이터들이 순차적으로 메모리에 저장됩니다.
대부분의 프로그래밍 언어에서 배열을 지원하며 이번시간에는 C와 C++의 배열 사용법에 대해 알아보도록 하겠습니다.
☞ 배열의 사용 이유?
많은 수의 데이터를 저장하기위한 변수를 선언할 때 일반 변수로 관리하기가 어렵기 때문에 하나의 변수(배열)를
선언해서 많은 데이터를 한꺼번에 순차적으로 처리 할 수 있습니다.
☞ 배열의 선언 방법?
C/C++에서 배열은 선언 당시 크기가 지정되어야 합니다.(고정된 크기의 자료구조)
일반적으로 다음과 같이 선언 할 수 있습니다.
int arr[5];
배열은 일반 변수와 같이 자료형(type)을 먼저 선언하고 배열의 이름(기본적으로 arr 또는 ary 등을 사용합니다)을
명시해준 후, 대괄호( ' [ ' , ' ] ' )를 사용해서 배열의 크기를 지정해 줍니다.
이때 배열의 크기는 고정된 상수(양의 정수형 숫자)여야 하며 일반 변수를 지정해 줄 수 없습니다.
배열 요소의 자료형은 int(정수)형을 포함, 모든 기본 자료형(char, double 등)을 지원합니다.
또한 아래와 같이 크기를 명시 해 주지않고 배열의 요소를 모두 정의할 수 있습니다.
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
이 경우에는 arr 변수의 크기는 개발자가 직접 명시하지 않아도 자동으로 10으로 지정됩니다.
또한 배열의 크기를 명시적으로 지정해 주고 배열 요소를 모두 지정해 주지않으면 나머지 요소들은 모두 0으로 초기화 됩니다.
아래의 예제를 확인해보겠습니다.
int arr1[5] = { 1, 2, 3 }; // 배열의 요소들은 { 1, 2, 3, 0, 0 } 으로 초기화 됨
int arr2[5]; // 배열의 요소들은 모두 쓰레기값으로 초기화 됨
int arr3[10] = { 0 }; // 배열의 요소들은 모두 0으로 초기화 됨
위 코드를 보면 알 수 있듯이, 요소들의 값을 하나라도 지정해 주면 나머지 지정 해 주지않은 요소들은 모두 0으로 초기화되며,
만약 요소의 값을 하나라도 지정 해 주지않으면 모두 쓰레기 값으로 초기화됩니다.
☞ 배열의 요소에 접근하는 방법?
배열 각각의 요소에 접근을 하기 위해서는 대괄호( ' [ ' , ' ] ' )를 사용해서 접근 할 수 있습니다.
int arr[3];
arr[0] = 5;
arr[1] = 2;
arr[2] = 0;
arr[3] = 4; // 런타임 에러!!
위와 같이 배열의 크기를 3으로 지정하면 배열의 요소(index)는 0부터 2(배열의 크기 - 1)까지 생성됩니다.
또한 배열의 요소에 접근역시 0부터 2까지 허용되며 배열의 요소 범위를 초과하면 런타임 에러가 발생하게 됩니다.
* 배열의 요소의 시작이 1이아닌 0부터 시작한다는 것을 주의합니다.
☞ 배열의 이름의 의미?
우리가 배열을 만들어 줄 때 이름을 arr 또는 ary 또는 a, b, c...등 으로 의미없이 지어주었지만
컴파일러는 배열의 이름에 남다른 의미를 부여해줍니다.
바로 배열의 이름에는 배열의 시작 주소를 담고있는데요.
이 배열의 시작 주소로 여러가지 활용이 가능합니다.
int arr[3];
printf("%d\n", arr); // 배열의 시작 주소를 출력 (100번지)
printf("%d\n", arr + 1); // 배열의 다음 요소의 주소를 출력 (104번지)
배열의 다음 요소의 주소가 104번지 (4차이)가 나는 이유는 배열의 자료형이 int(정수형) 4바이트(32비트 운영체제 기준)이기 때문입니다.
이를 이용해 배열의 자료형을 알 수도있으며, 배열 각각의 요소에 접근 할 수도 있고, 포인터와 활용하여 여러가지 연산이 가능해지게 됩니다.
☞ 배열과 포인터의 차이?
배열과 포인터는 엄연히 말하면 다르지만 사용 측면에서 비슷한점이 많습니다.
먼저 포인터에 대해 이해한 다음 아래 내용을 확인하시면 좋겠습니다.
포인터에 대해 배우러 가기 < 클릭
배열과 포인터는 구조상 차이가 있지만 사용 측면에서는 큰 차이가 없으며 대부분 같은 동작을 수행합니다.
아래 코드를 확인해보시면 배열과 포인터의 비슷한 점을 확인 하실 수 있습니다.
int arr[3] = { 1, 2, 3 }; // 배열 선언
int *p = arr; // 포인터 선언(배열의 첫번째 요소의 주소값을 가리킴)
// 배열을 포인터처럼 사용
printf("%d\n", *(arr + 2));
// 배열의 시작 주소의 2를 더함(8바이트 이동하여 배열의 3번째 요소에 도착)
// 배열의 3번째 요소의 주소값에 *(역참조연산자)를 연산하면 그 주소값의 실제 저장된 값에 접근
// 따라서 배열의 마지막 요소인 3을 출력
// 포인터를 배열처럼 사용
printf("%d\n", p[0]);
// p는 포인터 변수이지만 배열처럼 [ ] 대괄호를 사용해 배열의 요소에 접근하는 것 처럼 활용이 가능
// 배열의 첫번째 요소인 1을 출력
// 포인터의 연산
printf("%d\n", *(p + 1));
// p는 포인터 변수이며 배열의 첫번째 요소를 가리킴
// p에 1을 더한것은 포인터의 타입인 int형을 기준으로 4바이트 더한 연산을 수행
// 따라서 p는 배열의 첫번째 요소의 주소값에서 4를 더했으므로 배열의 두번째 연산의 주소값을 가리킴
// *(역참조연산자)을 연산하면 주소값의 실제 값인 2를 출력
☞ 배열의 크기를 동적으로 만들고 싶을 때?
배열은 정적인 크기의 자료구조입니다. 하지만 프로그래밍을 하다보면 배열의 크기를 마음대로 조절하고 싶을 때가 생깁니다.
그럴 때에는 포인터를 사용하여 동적할당을 활용하거나 C++에서는 STL의 하나인 벡터 클래스를 활용하시면 됩니다.
1. C에서 동적할당
C언어에서는 포인터 변수를 활용해 배열을 동적으로 생성하고 제거할 수 있습니다.
아래의 코드는 malloc() 함수를 사용하여 배열의 크기를 입력 받은 후 사용하고 메모리를 해제하는 예제 코드입니다.
int *p; // 포인터 변수 선언
int arr_size; // 배열의 크기를 입력 받을 변수
scanf("%d", &arr_size); // 배열의 크기를 입력 받음
p = (int *)malloc(sizeof(int) * arr_size); // 입력 받은 숫자만큼 배열을 동적 생성
free(p); // 사용이 끝난 후 메모리 해제
2. C++에서 동적할당
C++언어에서도 마찬가지로 포인터 변수를 활용해 배열을 동적으로 생성하고 제거할 수 있습니다.
C++에서는 malloc() 함수이외에 new 키워드를 지원하므로 new 키워드를 사용하여 배열을 동적으로 생성할 수 있습니다.
아래는 new 키워드를 사용하여 배열을 동적 할당하는 예제 코드입니다.
int *p; // 포인터 변수 선언
int arr_size; // 배열의 크기를 입력받을 변수
cin >> arr_size; // 배열의 크기를 입력받음
p = new int[arr_size]; // 입력받은 크기만큼 배열을 동적 생성
delete[] p; // 사용이 끝난 후 메모리 해제
3. C++ STL 벡터클래스 활용
C++은 STL이라는 표준 라이브러리를 지원하며 이 중 벡터(Vector) 클래스를 활용하여 크기가 가변하는 배열을 사용할 수 있습니다.
벡터 클래스의 사용방법은 여기를 참고하세요.
이상 'C/C++ 배열 사용법'에 대해 알아보았습니다.
질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!
공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.
[관련 게시글]
2018/09/26 - [C, C++] - C++ 벡터 사용법
2018/09/25 - [C, C++] - C언어 포인터
2018/09/23 - [Java] - 자바 벡터(Vector)와 어레이리스트(ArrayList) 비교
2018/09/14 - [Python] - 파이썬 리스트 사용법
2018/09/09 - [Java] - 자바 foreach문 사용법
2018/09/10 - [Java] - java.lang.ArrayIndexOutOfBoundsException 해결법
'C, C++' 카테고리의 다른 글
C++ friend 클래스와 함수 (1) | 2018.10.10 |
---|---|
C++ 클래스 접근제한자 (0) | 2018.10.10 |
C++ 클래스와 객체 (0) | 2018.10.09 |
C/C++ 구조체 사용법 및 예제 (1) | 2018.10.08 |
C 파일처리 (0) | 2018.10.02 |
C++ 벡터 사용법 (2) | 2018.09.26 |
C언어 포인터 (8) | 2018.09.25 |
C++ 자바 상속 비교 (0) | 2018.09.08 |