결국 단순한 자료형을 다루는 게 아닌 이상, 처음으로 배우는 자료구조의 종류는 1차원 배열입니다.
그리고 1차원 배열에서 점점 2차원, 3차원을 사용하면서 더 효율적인 자료구조를 찾게 됩니다.
심화적으로 접근하기 전에 1차원을 먼저 제대로 짚고 넘어가려고 합니다.
Array, 배열
일단 Array 는 배열입니다. 이 Array는 인덱스가 중요한 구조입니다.
가장 편하게 생각하는 방법은 아파트 한 채라고 생각하시면 됩니다.
대신 한 층에 호수가 1개 밖에 없다고 생각해 봅시다.
처음에 아파트를 10층으로 지었습니다.
A, B, C라는 사람이 각각 1, 2, 3층에 삽니다.
Apartment[] apart = new Apartment[10]
apart[0] = A;
apart[1] = B;
apart[2] = C;
이 때, D라는 사람이 새로 들어올 경우, 순서대로 라면 4층, 또는 5~10층 안에도 살 수 있겠죠??
하지만 B라는 사람이 이사를 간다고 해서 C와 D가 한 층 씩 내려와 살지 않습니다.
그게 배열의 개념입니다. 빈 공간을 빈 상태로 두고, 그 형태를 아파트처럼 유지 시킵니다.
빈 공간이 있다고 임의로 아파트가 층이 없어지거나, 부족하다고 늘어나지 않는 것처럼 말이죠.
그래서 Array는 index(색인, 검색)에 아주 강합니다. 몇 층 인지만 안다면, 한 명씩 찾아갈 필요가 없는 것이죠.
대신 증설에 약합니다.
예를 들어서, 10층 짜리 아파트에 10명이 꽉 찼는데, 1명이 더 들어온다면 어떻게 해야 할까요?
아파트를 증설해서 두 채로 만들 수도 있겠지만 그럼 이중 배열이 되잖아요??
한 채로 만들어야 한다면, 11층짜리, 아니 혹시 모르니까 20층짜리 아파트를 지은 다음에,
한 명씩 새로 지은 아파트로 이사시키는 방식입니다.
...
apart[8] = I;
apart[9] = J;
// K..? 20층짜리로 개설..!
Apartment[] new_apart = new Apartment[20];
for(int i = 0 ; i < 10; i++) {
new_apart[i] = apart[i];
}
apart[10] = K;
또는 입주자가 많을 줄 알고 100층으로 지었는데, 3명밖에 입주하지 않는다면
그 것도 그 것 나름대로 공간을 낭비하는 것이겠죠?
그렇기 때문에 Array를 사용할 때에는, 정확하게 값의 양이 정해져 있는 상태에서
값의 양이 변동이 적은 경우에 사용하기 아주 좋습니다.
index로 조회하기 때문에 값의 조회가 가장 빠르기 때문에 자주 사용됩니다.
List
List 는 순서가 중요한 자료 구조 입니다.
A, B, C, D라는 사람들이 한 줄로 줄을 서 있다고 생각해 봅시다.
A - B - C - D
만약 B라는 사람이 기다리다가 집에 간다면, C, D 사람들이 앞으로 당기겠죠??
A - C - D
그리고 만약 제가 E라는 사람을 D자리에 배치하고 싶다면 어떻게 할까요??
A - C - E - D
이런 모양이 될 거에요. 이게 바로 List의 주 개념이에요.
그래서 List는 추가하거나 제거할 때에 배열보다 유리하다는 강점이 있어요.
하지만 그만큼 큰 단점은 indexing에 약하다는 것이죠.
아까 Array의 경우에는 index로 몇 층인지 알 수 있었고, 바로 찾아가면 됬지만,
List의 경우에는 i 번째 라고 했을 때, 앞에서부터 한 명씩 세면서 찾아 보아야 한다는 게 단점이에요.
따라서 List는 모든 값을 순회하는 것이 아닌 특정 값을 자주 사용하거나 찾아서 수정하는 일에는 잘 쓰이지 않고
값의 변동이 큰 경우에 유용하게 쓰입니다.
List에 대한 극단적인 설명이기 때문에 이런 느낌이라는 것만 알아 두시길 바랍니다.
정리
앞으로 다양한 자료 구조들을 다루기 앞서서
가벼운 마음으로 Array와 List에 대한 내용들을 다루어 보았습니다.
이를 기반으로 ArrayList와 LinkedList를 한 번 다루어 보겠습니다.
'개발 > Algorithm' 카테고리의 다른 글
자료구조, 알고리즘이 필요한 이유? (0) | 2020.03.02 |
---|