효율적인 프로그램을 작성할 때 가장 우선적인 고려사항은 저장 공간의 효율성과 실행시간의 신속성이다. 자료 구조는 프로그램에서 사용하기 위한 자료를 기억장치의 공간 내에 저장하는 방법과 저장된 그룹 내에 존재하는 자료 간의 관계, 처리 방법 등을 연구 분석하는 것을 말한다.
배열이란?
아시다시피, 배열이란 연관된 데이터를 하나의 변수에 그룹핑해서 관리하기 위한 방법입니다. 배열을 이용하면 하나의 변수에 여러 정보를 담을 수 있고, 반복문과 결합하면 많은 정보도 효율적으로 처리할 수 있습니다.
배열에는 여러 정보가 저장되어 있습니다. 이러한 다수의 정보를 처리하기 위한 방법은 반복입니다. 그래서 배열과 반복문은 바늘과 실의 관계라고 할 수 있습니다.
*첨자: 그렇다면, subscript와 index는 무엇일까?
단도직입 적으로 subscript는 A[2][1] 에서 2와 1이라는 값이며, index는 A[2][1] 자체를 지칭한다.
즉, subscript는 배열의 특정 위치를 포인팅하기 위해 표기된 값이며, index는 포인팅 된 위치를 의미하는 것이다.
출처: https://swjman.tistory.com/15 [JMAN's SW Lab.:티스토리]
배열의 사용
그럼 배열을 사용해 봅시다. 배열은 매우 다양한 용도로 사용할 수 있는 데이터 스트럭쳐입니다. 하지만 우리 수업은 데이터 스트럭쳐 수업이고 이후에 등장하는 데이터 스트럭쳐들도 배열과 유사한 역할을 하게 되기 때문에 배열만 할 수 있는 일에 집중합시다.
학급을 프로그래밍적으로 표현하기엔 배열이 좋습니다. 선생님이 학생의 이름을 기억하는 것은 어려운 일이죠. 그래서 학교에서는 학생들에게 번호를 부여합니다. 이 번호는 학년이 바뀔 때까지 절대 바뀌지 않습니다. 전학을 가면 그 번호는 결번이 되고, 전학을 오면 마지막 번호에 추가됩니다.
여기서 학생은 배열에서 하나의 엘리먼트로 표현할 수 있습니다. 학생의 이름은 배열의 값, 학생의 인덱스는 학번으로 기능할 수 있습니다. 이전 예제에서 5명이 소속된 학급을 배열로 만들어봤습니다. 만약 한이은 학생의 데이터를 가져오고 싶다면 아래처럼 인덱스 3을 이용하면 됩니다.
for(i = 0; i < student.length; i++){
console.log(student[i]);
}
반복문으로 배열값 불러오기!
배열의 한계
배열은 좋은 데이터 표현방법입니다. 하지만 배열로 모든 것을 해결할 수는 없습니다. 일단 배열이 부적합한 이유를 생각해 봅시다. 위의 예제에서 한이은 학생이 전학을 갔다고 합시다. 그럼 아래와 같이 처리할 수 있습니다.
이것도 좋은 방법이지만 위와 같은 반복문이 수십 개 등장한다면 그만큼 조건문도 많아질 것입니다. 이것이 배열의 단점입니다. 배열은 인덱스에 따라서 값을 유지하기 때문에 엘리먼트가 삭제돼도 빈자리가 남게 됩니다.
그렇다면 존재하지 않는 데이터는 아예 없애버리는 것이 좋겠죠.
즉 삭제한 자리를 뒤에 위치한 엘리먼트로 메꾸는 것입니다. 이렇게 데이터가 순서에 따라서 빈틈없이 연속적으로 위치하는 데이터 스트럭쳐를 리스트(list)라고 합니다. 그런데 이렇게 해도 문제가 있습니다. 김주한 학생의 식별자인 인덱스 값이 4에서 3이 되었습니다. 만약 인덱스 4를 이용해서 김주한 학생의 값을 가져오는 프로그램이 있다면 문제가 생길 것입니다.
그럼 어떻게 해야 할까요? 프로그래머가 선택을 하면 됩니다. 인덱스가 중요한 경우는 배열을 사용하면 됩니다. null를 처리에서 제외해야 한다면 조건문을 사용하면 되겠죠. 인덱스가 중요하지 않은 경우에는 리스트를 사용하면 됩니다.
결론
배열은 거의 모든 언어에 포함된 데이터 스트럭쳐 입니다. 배열을 잘 다루는 것은 프로그래머에게는 기본적인 소양이라고 할 수 있습니다. 하지만 배열만으로는 부족한 경우가 생깁니다. 이런 경우에 보다 적합한 데이터 타입을 고안해야겠지요. 하지만 명심하셔야 할 것은 이후에 등장하는 대부분의 데이터 스트럭쳐들은 모두 직간접적으로 배열을 부품으로 사용한다는 것입니다. 따라서 배열에 대한 이해는 모든 데이터 스트럭쳐 이해의 공통요소라고 할 수 있습니다.
정리가 잘 된 글이네요. 도움이 됐습니다.