도솔비 2019. 7. 8. 15:21

배열

배열이란, 개수가 ‘n로 자료형이 있으면, 이 자료형이 1개면 변수지만, n개가 되면 배열이 된다. 배열과 포인터는 짝꿍으로 알고 있으라고 하는데, 사실 포인터도 배열과 같이 쓸 수 있기 때문에 둘의 경계가 별로 없는 이유에서다. 그래서 대부분의 강좌나 설명에서도 배열과 포인터를 같이 다룬다. 다만, 배열의 값과 포인터가 가리키는 값이 같지만, 포인터는 직접 값이 아니라, 주소로 유도하는 값이므로, 포인터는 관리, 배열은 사용에 목적을 둔다고 했었다.

int, int, int, intint w, x, y, z;int라는 것 4개가 같이 있는 것으로, int [4]라고 줄일 수 있다. 이렇게 동일한 자료형이 여러 개 필요할 경우에, 그래서 자료형 여러 개를 선언할 경우, 하나 하나 일일이 선언하는 것보다 한 번에 배열로 선언하는 것이 좋다. 만약에 일일이 선언한 변수를 주택이라고 하고, 배열을 주택이 모인 아파트라고 하자면, 택배아저씨가 주택 3곳에 배달을 할 때 어느 것이 편할까? 아파트가 배달하기가 쉬울 것이다. 이곳저곳 직접 찾아가서 내릴 필요 없이 아파트에 한번 내려서 배달하기 때문이다. 코드를 사용하는 사람을 택배아저씨라고 하면 이해가 될 것이다. 같은 자료형은 배열로 묶어서 해주는 것이 편리한 것을.

 

인덱스 ‘Index‘

주택이 철수 집, 영희 집, 유리 집 등으로 있다고 하면, 택배기사의 입장에서 3집이 연달아 있으면, 철수 집으로 묶어서 철수 집 (+0), 철수 집 +1, 철수 집 +2으로 표현하는 것이 헷갈리지 않고 편할 것이다. 여기서 이 숫자를 인덱스(Index)라고 한다. 여기서 가장 중요한 것은 인덱스는 변수처리가 가능한 특징이다.

이것은 코드를 짜는데 가장 손쉽게 할 수 있는 특징인데, 예를 들어 변수를 100개 선언한다고 한다면 각각의 변수이름을 정하는 것을 인덱스로 하기 때문에 긴 코드를 간략히 쓸 수 있게 해준다. 수많은 양의 변수도 배열로 쉽게 선언해줄 수 있기 때문에 이것이 배열의 인덱스를 중요하게 여기는 이유다.

인덱스의 수는 이렇다. 배열로 int anData[20]가 된다면 맨 왼쪽은 anData[0]이 되고, 맨 끝은 anData[19]가 된다. (제로 베이스 인덱스라고 한다) 이 배열의 요소 - 1이 인덱스가 되는 것이다. anData[2]의 인덱스로 나타낸 것은 *(anData + 2)와 똑같이 사용할 수 있는데, 지금상황에서 int anData는 메모리 주소를 의미하는데, 거기서 int로 되어있는 2를 더해주는 것이다. 그러면 int anData[0] + 2로 주소 값을 anData[2]로 만들어 주고 이 주소 값을 *로 정보로 만들어 주는 것이다.

배열의 인덱스는 요소 -1인데 그 수를 넘으면 어떻게 될까? ‘오버플로우가 된다. (앞은 언더플로우가 된다) 그곳에 수를 넣으면 아무도 모르는 다른 값에 들어간다. 잘못하면 다른 변수의 값이 바뀔 수도 있다. 초보자가 하기 쉬운 실수니 주의하자.