프로그래밍/java

[자료구조] 배열(Array)의 정의 및 장단점, 기본 사용법

컴뀨 2021. 3. 10. 15:34
배열이란?

동일한 자료형(Data Type)의 데이터를 연속된 공간에 저장하기 위한 자료구조이다. 즉, 연관된 데이터를 그룹화하여 묶어준다고 생각하면 된다.


장점

인덱스를 이용한 항목 접근 속도가 빠르다.

배열이 선언되면 자료형에 따라 배열 항목의 크기가 결정된다. 4byte int 데이터를 담는 배열을 선언할 경우 항목 크기 역시 4byte가 된다. 배열의 기본 주소는 배열의 맨 처음 부분을 가리키고, 블럭단위로 메모리를 차지한다. 따라서 "기본주소 + (데이터크기 * index)"로 특정 인덱스에 위치한 항목에 접근할 수 있다. 예를 들어 int 배열 5번 인덱스에 접근하려면 "기본주소 + (4 * 5)"를 계산한 결과로 나온 메모리주소를 찾아가면 된다. 이처럼 위치에 상관없이 한 번의 연산으로 찾고자 하는 데이터를 탐색할 수 있어 접근 속도가 빠르다.
단점

1. 크기가 고정되어 있다. 사용하기 전에 배열 크기를 지정해야 한다.

-> 배열은 생성할 때 지정한 크기를 바꿀 수 없기 때문에 너무 크게 잡으면 메모리가 낭비되고 너무 작게 잡으면 그 이상의 자료를 저장할 수 없게 된다.

2. 메모리의 재사용이 불가능하다.

-> 배열은 초기 사이즈만큼의 메모리를 할당 받아 사용하기 때문에 데이터의 존재 유무와 상관없이 일정한 크기의 메모리 공간을 점유하고 있다. 즉, 이미 삭제한 데이터라고 하더라도(배열 요소를 삭제) 배열 자체가 메모리에서 제거되지 않는 이상 삭제된 데이터의 메모리 공간을 재사용할 수 없다.

3. 자료의 사입과 삭제에 비효율적이다.

-> 자료의 삽입(Insert)과 삭제(Delete)시 다음 항목의 모든 요소를 이동시켜야 한다. 이를 연산작업이 수행되어 비효율적이며 자료의 수가 많아지면 비례하여 성능이 떨어지게 된다.

배열의 선언 및 사용

배열을 정의하는 방법은 크게 2가지 방법이 있다.

자료형[] 배열이름 = { 데이터1, 데이터2, 데이터3, ... };

첫 번째 방법은 데이터들의 값을 알고 있을 대 사용하기 편리하다.

String[] fruits = { "apple", "strawberry", "banana", "peach", "orange" };

System.out.println(fruits[0]); // apple
System.out.println(fruits[1]); // strawberry
System.out.println(fruits[2]); // banana
System.out.println(fruits[3]); // peach
System.out.println(fruits[4]); // orange

fruits라는 String[] 배열에 데이터를 저장했다. 저장한 데이터에 접근하기 위해서는 배열의 인덱스를 알아야 한다. 인덱스는 데이터를 저장한 순서대로 0부터 시작하여 1씩 증가되어 만들어진다. 과일을 종류별로 구분하기 위한 구분자라고 생각하면 된다. 즉, fruits라는 배열에 0 ~ 4까지의 index 번호를 가진 5개의 공간(length)에 데이터들이 저장되어있다. 그림으로 표현하면 아래와 같다.

index 0 1 2 3 4
data "apple" "strawberry" "banana" "peach" "orange"

배열을 정의하는 두 번째 방법은 아래와 같다.

자료형[] 배열이름 = new 자료형[배열 크기];
배열이름[0] = 데이터1;
배열이름[1] = 데이터2;

위 방법은 배열의 값은 모르지만 향후 값을 저장하기 위한 배열을 생성하고 싶을 경우 사용한다.

// 5개의 정수를 입력한 뒤 최대값과 최소값을 각각 출력
int[] num = new int[5]; // 크기가 5인 int형 배열 생성
int max = 0, min = Integer.MAX_VALUE; // 최대값, 최소값을 저장할 변수 선언
Scanner sc = new Scanner(System.in);

for (int i = 0; i < num.length; i++) {
	num[i] = sc.nextInt(); // 데이터 입력 및 배열에 저장
    if (max < num[i]) {
    	max = num[i];
    }
    if (min > num[i]) {
    	min = num[i];
    }
}

System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);

위의 예제처럼 배열의 값을 모를 때 배열은 정의만 하고 값을 입력받아 데이터를 저장한다. 데이터의 값을 모를 경우가 더 많기 때문에 위와 같은 방법을 더 자주 사용하게 된다.