Data Structure (자료구조)

비전공자는 도전해볼 수 있고, 전공자는 쉽게 배울 수 있는 데이터 스트럭쳐 수업

배열

이번 시간에는 배열을 배워봅시다. 배열은 거의 모든 프로그래밍 언어에 포함되어 있습니다. 따라서 여러분도 배열이 무엇인지에 대한 기본적인 이해는 하고 계실 것입니다. 여기서는 배열을 어떤 경우에 사용하는지를 우선 살펴보고, 배열을 사용하기에 적합하지 않은 경우도 알아보겠습니다. 이것을 통해서 이후에 배우게 될 데이터 스트럭쳐들이 어떤 맥락에서 출현하게 되었는가를 이해하는 단서도 제공할 수 있을 것입니다.

배열이란?

아시다시피, 배열이란 연관된 데이터를 하나의 변수에 그룹핑해서 관리하기 위한 방법입니다. 배열을 이용하면 하나의 변수에 여러 정보를 담을 수 있고, 반복문과 결합하면 많은 정보도 효율적으로 처리할 수 있습니다.

우리 수업에서 배열이 중요한 이유는 배열이 여러분이 이미 알고 있는 데이터 스트럭쳐라는 점입니다. 데이터 스트럭쳐가 낯설어 보이겠지만 배열도 데이터 스트럭쳐라고 생각하니 부담이 조금 줄어들죠?

배열의 용어

우리 수업에서는 자바스크립트를 공통적인 설명의 도구로 사용하겠습니다. 자바스크립트는 모든 브라우저에서 간편하게 실행할 수 있고 그 문법이 쉽습니다. 자바스크립트를 모른다고 걱정하지 않으셔도 됩니다. 필요한 내용은 충분히 설명하겠습니다.

아래는 배열을 사용하고 있는 간단한 코드입니다. 이 코드를 이용해서 배열과 관련된 중요한 용어를 먼저 살펴보겠습니다.

student = new Array();
student[0] = '최진혁';
student[1] = '한이람';
student[2] = '최유빈';
student[3] = '한이은';
student[4] = '김주한';

new Array()는 배열을 만듭니다. 이것을 변수 student에 대입하고 있습니다. student[0]은 첫 번째 배열의 값이고 문자열 최진혁을 값으로 대입하고 있습니다. 이것을 그림으로 나타내면 아래와 같습니다. 

위의 그림에서 최진혁은 배열에 저장된 값입니다. 그리고 숫자 0은 최진혁이라는 값을 식별하는 인덱스입니다. 이 인덱스를 이용해서 최진혁이라는 값을 가져올 수 있습니다. 값 최진혁과 인덱스 0을 합쳐서 엘리먼트라고 합니다.

배열의 사용

그럼 배열을 사용해 봅시다. 배열은 매우 다양한 용도로 사용할 수 있는 데이터 스트럭쳐입니다. 하지만 우리 수업은 데이터 스트럭쳐 수업이고 이후에 등장하는 데이터 스트럭쳐들도 배열과 유사한 역할을 하게 되기 때문에 배열만 할 수 있는 일에 집중합시다.

학급을 프로그래밍적으로 표현하기엔 배열이 좋습니다. 선생님이 학생의 이름을 기억하는 것은 어려운 일이죠. 그래서 학교에서는 학생들에게 번호를 부여합니다. 이 번호는 학년이 바뀔 때까지 절대 바뀌지 않습니다. 전학을 가면 그 번호는 결번이 되고, 전학을 오면 마지막 번호에 추가됩니다. 

여기서 학생은 배열에서 하나의 엘리먼트로 표현할 수 있습니다. 학생의 이름은 배열의 값, 학생의 인덱스는 학번으로 기능할 수 있습니다. 이전 예제에서 5명이 소속된 학급을 배열로 만들어봤습니다. 만약 한이은 학생의 데이터를 가져오고 싶다면 아래처럼 인덱스 3을 이용하면 됩니다.

console.log(student[3]);

함수 console.log는 인자로 전달된 값을 콘솔창에 출력하는 역할을 합니다.

배열에는 여러 정보가 저장되어 있습니다. 이러한 다수의 정보를 처리하기 위한 방법은 반복입니다. 그래서 배열과 반복문은 바늘과 실의 관계라고 할 수 있습니다. 아래는 자바스크립트에서 반복문으로 데이터를 처리하는 모습을 보여줍니다.

for(i = 0; i < student.length; i++){
    console.log(student[i]);
}

참고로 배열.length는 배열의 길이를 의미합니다. 이 값을 이용해서 몇 번 순회할지를 결정할 수 있습니다.

(예제 실행 : http://jsbin.com/qacap/10/edit?js,console)

배열의 한계

배열은 좋은 데이터 표현방법입니다. 하지만 배열로 모든 것을 해결할 수는 없습니다. 일단 배열이 부적합한 이유를 생각해 봅시다. 위의 예제에서 한이은 학생이 전학을 갔다고 합시다. 그럼 아래와 같이 처리할 수 있습니다.

student[3] = null;

이것을 그림으로 표현하면 아래와 같습니다.

null은 값이 없다는 의미입니다. 위의 반복문으로 이것을 실행하면 아래와 같은 결과가 출력될 것입니다.

or(i = 0; i < student.length; i++){
  console.log(student[i]);
}

실행 결과는 아래와 같습니다.

최진혁
한이람
최유빈
null
김주한

위의 실행결과에는 null이 포함되어 있습니다. 즉 처리되지 않아야 할 정보인 인덱스 3까지 결과에 포함되어 있는 것이죠. 물론 조건문으로 제외해도 됩니다.

for(i = 0; i < student.length; i++){
  if(student[i] != null) {
     console.log(student[i]); 
  }
}

(예제 실행 : http://jsbin.com/qacap/17/edit?js,console)

이것도 좋은 방법이지만 위와 같은 반복문이 수십 개 등장한다면 그만큼 조건문도 많아질 것입니다. 이것이 배열의 단점입니다. 배열은 인덱스에 따라서 값을 유지하기 때문에 엘리먼트가 삭제돼도 빈자리가 남게 됩니다. 

그렇다면 존재하지 않는 데이터는 아예 없애버리는 것이 좋겠죠.

즉 삭제한 자리를 뒤에 위치한 엘리먼트로 메꾸는 것입니다. 이렇게 데이터가 순서에 따라서 빈틈없이 연속적으로 위치하는 데이터 스트럭쳐를 리스트(list)라고 합니다. 그런데 이렇게 해도 문제가 있습니다. 김주한 학생의 식별자인 인덱스 값이 4에서 3이 되었습니다. 만약 인덱스 4를 이용해서 김주한 학생의 값을 가져오는 프로그램이 있다면 문제가 생길 것입니다. 

그럼 어떻게 해야 할까요? 프로그래머가 선택을 하면 됩니다. 인덱스가 중요한 경우는 배열을 사용하면 됩니다. null를 처리에서 제외해야 한다면 조건문을 사용하면 되겠죠. 인덱스가 중요하지 않은 경우에는 리스트를 사용하면 됩니다.

결론

배열은 거의 모든 언어에 포함된 데이터 스트럭쳐 입니다. 배열을 잘 다루는 것은 프로그래머에게는 기본적인 소양이라고 할 수 있습니다. 하지만 배열만으로는 부족한 경우가 생깁니다. 이런 경우에 보다 적합한 데이터 타입을 고안해야겠지요. 하지만 명심하셔야 할 것은 이후에 등장하는 대부분의 데이터 스트럭쳐들은 모두 직간접적으로 배열을 부품으로 사용한다는 것입니다. 따라서 배열에 대한 이해는 모든 데이터 스트럭쳐 이해의 공통요소라고 할 수 있습니다.

이번 시간에는 배열을 알아봤습니다. 다음 시간에는 리스트를 알아보겠습니다.

참고

댓글

댓글 본문
  1. 이마누
    완료
  2. 신덜덜
    감사합니다!
  3. egoing
    물론이죠~
    대화보기
    • 매일매일
      블로그에 혼자 정리하고 공부하는용으로 사진 가져다 써두 되나요?
    • SangHyeok Kim
      2017/03/30 수강완료!
      감사합니다!!
    • 임지호
      배열 : 연관되어있는 많은 양의 데이터를 효과적으로 관리하기 위한 자료구조
      모든 언어에서 배열을 지원하고 많은 자료구조에서 배열을 부품적으로 이용해서 배열은 가장 기본적인 자료구조이면서 중요하다고 할 수 있다.
      배열은 반복문과 결합해 강력한 효과를 낸다.
      연관된 데이터를 그룹핑해 효과적으로 처리할 수 있지만 단점도 있다.
      중간에 데이터가 빠질 경우 그 자리를 메꾸지 않기 때문에 배열이 듬성듬성 비는 경우가 생긴다.
      이러한 문제를 해결하기 위해서 고안된 것이 List이고 이 두 개의 자료구조는 각각 장단점이 있기 때문에 개발자가 선택적으로 사용하면 된다.
    • JasonLee
      아.. 대박입니다. 이렇게 깔끔하게 설명해주시니.. 감사합니다.
    • 삼디
      감사합니다
    • 임준용
      좋은 수업 감사합니다.
    • 김재영
      쭈욱 정독하고 있습니다. 멋진 강의 감사드립니다.
    • 데헷!
      좋은 강의 항상 감사드립니다 ^^