3 분 소요

📌 배열(Array)이란?

반 학생들의 점수를 집계해 처리하는 프로그램을 작성한다고 가정한다. 학생들의 각 점수마다 int변수 하나씩 할당하면 변수명을 의도와 다르게 잘못 입력할 수도 있고, 변수를 관리하기 어렵다.

int student1 = 100;
int student2 = 45;
int student3 = 55;
...
int student10 = 35;

int totalScore = student1 + student2 + student3 + ... + student10;

위 예제를 살펴보면 매우 비효율적이라는 것을 알 수 있다. 반 학생들은 각자 번호를 가지고 있고, 점수를 순차적으로 저장한다면 점수를 집계하는 프로그램을 작성하기 매우 편할 것이다. 이 때 필요한 자료구조중 하나가 배열이다.

  • 배열(Array): 같은 자료형의 변수인 구성 요소(component)가 모인 것. 데이터를 나열해 각 데이터를 인덱스(index)에 대응하도록 구성한 순차적 자료구조.
    • 배열의 길이(length): 배열의 구성 요솟수, 한번 생성하면 변경할 수 없다.
      • JVM이 모든 배열의 길이를 별도로 관리하며, 변수명.length를 통해 값을 얻을 수 있다.
    • 인덱스(index): 배열의 특정 구성 요소에 접근할 때 사용, 0번 부터 시작해 length - 1번 까지 존재
    • 타입: 기본 자료형(primitive type)과 참조형(Wrapper 클래스)이 올 수 있다.
      • 기본 자료형: byte, short, int, long, float, double, char, boolean
      • 참조형: String, Integer, Boolean, Double 등
타입[] 변수명 = new 타입명[길이];

int[] a; // 구성 요소의 자료형이 int형인 배열
a = new int[5]; // new 키워드를 이용해 배열 본체를 생성한 뒤 배열변수(참조변수) a와 연결
// int[] a = new int[5]; 선언과 동시에 참조 가능

a = new int[]{50, 60, 70, 80, 90};

a.length; // 배열의 길이는 5
a[0]; // 50, 배열의 첫 번째 요소
a[4]; // 90, 배열의 마지막 요소

위에서 생성한 배열 a의 구조는 아래와 같다.

배열 변수와 배열 본체

자료구조(datastructure): 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계를 뜻함. 즉, 대량의 자료를 효율적으로 활용할 수 있도록 컴퓨터에 저장하는 방법.


📌 배열이 필요한 이유

학생 점수를 집계해 처리하는 프로그램을 작성하는 예제에서 반 학생들이 각자 번호를 가지고 있고, 점수를 순차적으로 저장한다면 편할것이라 언급했다. 배열이 필요한 이유중 하나는 데이터를 순차적으로 저장한다는 점에 있다. 또 학생들의 점수는 모두 정수형이다. 즉, 같은 종류의 데이터를 한 곳에 모아 효율적으로 관리할 수 있다.

배열의 장점

  1. 같은 종류의 데이터를 효율적으로 관리한다.
  2. 같은 종류의 데이터를 순차적으로 저장한다.
    • 순차적으로 저장하기 때문에 index를 이용해 저장된 요소에 접근하는 속도가 빠르다.

배열의 단점

배열은 순차적으로 자료를 저장한다. 그렇기 때문에 배열의 중간에 요소의 추가, 삭제가 어렵다. 또 배열을 선언할 때 길이를 미리 지정해 공간이 부족하거나 너무 많이 남는 상황이 발생할 수 있다.

  1. 데이터의 추가, 삭제가 어렵다.
  2. 미리 배열의 길이를 지정해 문제가 발생할 수 있다. 배열의 길이는 한번 생성하면 변경할 수 없다.
    • 너무 작게 지정한 경우: 데이터를 추가할 수 없다. ArrayIndexOutOfBoundsException발생
    • 너무 크게 지정한 경우: 필요없는 메모리 공간을 차지해 비효율적
int[] a = new int[5];
a = new int[]{1, 2, 3, 4, 5, 6}; // ArrayIndexOutOfBoundsException발생


📌 배열 사용법

배열의 선언과 생성

배열은 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 []를 붙인다.

배열을 선언하였으면 배열을 생성해줘야 한다. 선언은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐, 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다.

타입[] 변수이름; // 일반적으로 이 방식을 사용해 선언하는 것이 보편적
타입 변수이름[];
변수이름 = new 타입[길이];

int[] a;
a = new int[5];

// 대부분 선언과 동시에 배열을 생성함
int[] a = new int[5];

배열의 초기화

배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화된다. 원하는 값을 저장하려면 각 요소마다 값을 지정해야한다.

자바에서는 배열을 초기화할 수 있는 여러 방법을 제공한다.

// 1. 배열의 생성과 초기화를 동시에
int[] a = new int[]{50, 60, 70, 80, 90};
int[] a = {50, 60, 70, 80, 90};

// 2. new 생략 불가
int[] a;
a = new int[]{50, 60, 70, 80, 90};
a = {50, 60, 70, 80, 90}; // ERROR

// 3. add 메서드 이용
int a = add(new int[] {50, 60, 70, 80, 90});
int a = add({50, 60, 70, 80, 90}); // ERROR

배열의 요소 접근과 출력

int[] a = new int[5];
a = new int[]{50, 60, 70, 80, 90};

for (int i = 0; i < arr.length; i++) {
  System.out.print(a[i]); // 5060708090
}

// 향상된 for문(Enhanced For Loop)을 사용해 접근할 수도 있다.
for (int i : a) {
  System.out.print(i); // 5060708090
}

// Arrays.toString()을 호출해 출력이 가능하다.
System.out.print(Arrays.toString(a); // [50, 60, 70, 80, 90]

댓글남기기