Array - Java API

이번 시간에는 배열을 배워봅시다. 배열은 거의 모든 프로그래밍 언어에 구현되어 있습니다. 여러분도 배열에 대해서 기본적인 이해는 하고 계실 겁니다. 여기서는 배열은 어떤 경우에 사용하기 적합한지 또는 적합하지 않은지 알아보겠습니다. 이를 통해 나중에 배울 여러 가지 데이터 스트럭쳐가 어떤 맥락에서 나타났는지 이해할 수 있을 겁니다.

배열이란?

아시다시피, 배열이란 연관된 데이터를 하나의 변수에 그룹핑해 관리하는 방법입니다. 배열을 쓰면 변수 하나에 여러 정보를 담을 수 있고, 배열을 반복문과 결합하면 많은 정보를 효율적으로 처리할 수 있습니다. 데이터 스트럭쳐가 낯설어 보이겠지만 배열도 데이터 스트럭쳐라고 생각하니 부담이 조금 줄었죠?

배열의 용어

이 수업에서는 자바스크립트를 예로 들겠습니다. 자바스크립트는 문법이 쉽고, 모든 브라우저에서 간편하게 실행할 수 있는 언어입니다. 자바스크립트를 몰라도 걱정하지 마세요. 필요한 내용은 충분히 설명하겠습니다.

아래는 배열을 사용한 간단한 코드입니다. 이 코드를 봐주세요. 배열과 관련된 중요한 용어를 먼저 살펴봅시다.

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

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

img

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

배열의 사용

그럼 배열을 사용해 봅시다. 배열은 매우 다양한 용도로 사용할 수 있는 데이터 스트럭쳐입니다. 하지만 이후에 등장하는 데이터 스트럭쳐도 배열과 비슷한 역할을 하니 배열만 할 수 있는 일에 집중합시다.

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

여기서 학생은 배열에서 하나의 엘리먼트로 표현할 수 있습니다. 학생의 이름은 배열의 값, 학생의 인덱스는 학번으로 기능할 수 있습니다. 앞선 예제에선 5명으로 이루어진 학급을 배열로 표현했습니다. 한이은 학생의 데이터를 가져오려면 아래처럼 인덱스 3을 이용합니다.

console.log(student[3]);

함수 console.log는 인자로 전달된 값을 콘솔 창(모니터)에 출력합니다.

배열은 많은 정보를 저장합니다. 많은 정보를 처리할 때는 반복문을 쓰면 좋습니다. 배열과 반복문은 실과 바늘 관계라 할 수 있습니다. 아래는 반복문으로 데이터를 처리하는 자바스크립트 코드입니다.

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

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

배열의 한계

배열은 좋은 데이터 표현법이지만, 만능은 아닙니다. 배열이 부적합한 이유를 생각해 봅시다. 위의 예제에서 한이은 학생이 전학을 가면 어떨까요. 그럼 아래와 같이 3번이 결번이라고 표시해야 합니다.

student[3] = null;

null은 값이 없다는 의미입니다. 이를 그림으로 표현하면 아래와 같습니다.

img

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

앞선 반복문으로 배열의 원소를 출력하면 아래와 같은 결과가 나옵니다.

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

4번째 줄에 처리하지 않아도 될 인덱스 3의 값, null이 보입니다. 물론 다음과 같이 조건문으로 null을 제외해도 됩니다. 예제 실행

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

이것도 좋은 방법이지만 이런 반복문을 수십 개 써야 한다면 그만큼 조건문도 많아집니다. 이게 배열의 단점입니다. 배열은 인덱스에 따라서 값을 유지하기 때문에 엘리먼트를 삭제해도 빈자리가 남습니다.

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

img

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

그럼 어떻게 해야 할까요? 프로그래머는 상황에 맞게 선택을 해야 합니다. 인덱스가 중요한 경우는 배열을 사용하세요. null을 제외하고 처리한다면 조건문을 사용하세요. 인덱스가 중요하지 않다면 리스트를 쓰세요.

결론

배열은 거의 모든 언어에 포함된 데이터 스트럭쳐 입니다. 프로그래머는 배열을 잘 다루어야 합니다. 기본 소양이라고 볼 수도 있지요. 하지만 배열이 비효율적인 경우도 있습니다. 프로그래머는 상황에 맞게 적합한 데이터 타입을 고안해야 합니다. 하지만 명심하세요. 배열은 직/간접적으로 이후에 나올 모든 데이터 스트럭쳐의 부품으로 씁니다. 따라서 배열에 대한 이해는 모든 데이터 스트럭쳐 이해의 공통요소라고 할 수 있습니다.

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

참고