Language/Java

[Java] 배열 (Array) 개념 및 정리

pongic 2022. 10. 1. 23:03
반응형

배열(Array)이란?

동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미한다. 즉, 값들이 같은 의미를 지니면서 서로 연관성이 있을 때, 이들을 하나의 덩어리로 묶을 수 있으며, 이렇게 묶인 값들의 집합을 배열이라고 한다.

 

배열이 가진 각 값들을 배열의 요소라고 한다. 그리고 배열의 각 요소는 0에서부터 시작하는 번호를 부여받는데, 이처럼 각 요소가 부여받는 순번을 인덱스(index)라고 한다. 

예를 들어 길이가 31인 배열을 생성하면 맨 첫 번째 요소의 인덱스는 0이며, 두 번째 인덱스는 1, 마지막 31번째 요소의 인덱스는 30이 된다.

 

배열을 선언했을 경우 요소들은 타입에 맞게 자동으로 초기화된다.

배열의 타입 초기값
char '\u0000'
byte, short, int 0
long 0L
float 0.0F
double 0.0 또는 0.0D
boolean false
배열, 인스턴스 등 null

 

1차원 배열

1차원 배열은 가장 일반적인 배열의 형태이다.

int[] result;     // 배열을 가리킬 참조 변수 result 를 선언
result = new int[31];

int[] result = new int[31];  // 선언과 동시에 초기화

int[] result = new int[31] { 1, 2, 3, 4, .... 31 };  // 실제 값을 넣어서 초기화
int[] result = { 1, 2, 3, 4, .... 31 }  // new int[] 생략 가능

 

값 접근하기

배열 내 특정 요소에 할당되어 있는 값에 접근하려면 배열 참조 변수의 이름과 배열의 인덱스를 활용한다.

double[] temperatureOfJuly = new double[31] { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };

위와 같이 배열을 선언한 경우

  • 첫 번째 요소는 temperatureOfJuly[0]으로 접근할 수 있으며 27.4이다.
  • 두 번째 요소는 temperatureOfJuly[1]으로 접근할 수 있으며 30.1이다.
  • 세 번째 요소는 temperatureOfJuly[2]으로 접근할 수 있으며 31.1이다.
  • 마지막 요소는 temperatureOfJuly[30]으로 접근할 수 있으며 31.8이다.

 

배열의 길이

배열이 가진 요소의 개수를 배열의 길이 또는 크기라고 한다.

int[] result = new int[31];

배열참조변수이름.length

System.out.println(result.length); // 31

배열에서 인덱스는 0부터 시작하므로 배열의 길이가 31이라면 배열 마지막 요소의 인덱스는 30이 된다.

즉, 배열의 길이 -1이 배열 마지막 요소의 인덱스가 된다.

 

 

※ length 메서드 주의

int[] result = new int[31];
System.out.println(result.length);  // 31   배열 길이에서는 length

String result = "Hello!";
System.out.println(result.length());  // 6   문자열 길이에서는 length()

 

※ 빈 배열을 출력하는 방법

return new int[] {};

 

배열 메서드

Arrays.toString()

배열의 내용을 문자열 타입으로 반환해준다. String 타입으로 리턴한다.

// Arrays.toString("String으로 변환하고 싶은 배열")

int[] result = {1, 2, 3};
System.out.println(result.toString());  // 주소값 출력
System.out.println(Arrays.toString(result));  // [1, 2, 3] 출력

 

String.split()

어떤 문자 기준으로 문자열을 자르고 배열로 리턴한다.

// 문자열이름.split(" 기준 ", 배열의 길이)

String str = "Hi guys This is split example";
String[] result = str.split(" ");
String[] result2 = str.split(" ", 2);
String[] result3 = str.split(" ", 3);

System.out.println(Arrays.toString(result));  // [Hi, guys, This, is, split, example]
System.out.println(Arrays.toString(result2)); // [Hi, guys This is split example]
System.out.println(Arrays.toString(result3)); // [Hi, guys, This is split example]

// 일반 문자로 잘랐을 때
String str = "This island is beautiful";
String[] result = str.split("is");
System.out.println(Arrays.toString(result)); // [Th,  , land ,  beautiful]

System.arraycopy()

배열 복사하기

// System.arraycopy(arr1, 0, arr2, 0, arr.length);
// -> arr1의 0번 인덱스부터 arr.length개 만큼의 요소를 arr2의 0번 인덱스부터 붙여넣어라

int[] arr1 = {10, 20, 30, 40, 50};
int[] arr2= {1, 2, 3, 4, 5};

System.arraycopy(arr1, 0, arr2, 1, 3);   // result -> {1 10 20 30 5}

Arrays.copyOf()

배열 복사하기

// Arrays.copyOf(원본배열, 복사할 길이);

int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = Arrays.copyOf(arr1, 3); // arr2 = {1, 2, 3}

Arrays.copyOfRange()

배열 복사하기

// Arrays.copyOfRange(원본 배열, 복사할 시작인덱스, 복사할 끝인덱스);

int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = Arrays.copyOfRange(arr1, 3, 4);  // arr2 = {4}

 

2차원 배열

배열의 각 요소가 또 다른 배열인 구조일 뿐, 1차원 배열과 크게 다른 점은 없다.

int[][] result;
result = new int[31][3];

int[][] result = new int[31][3];

// 이 코드가 실행되면
{
	{ 0, 0, 0 },
	{ 0, 0, 0 },
	{ 0, 0, 0 },

	...

	{ 0, 0, 0 }
}

 

값을 넣어 초기화하는 경우

int[][] result = new int[][] {
	{ 1, 2, 3 },
	{ 4, 5, 6,},
	{ 7, 8, 9 },
	{ 10, 11, 12},
	...
	{ 29, 30, 31 }
}

// new int[][] 를 생략 가능
int[][] result = {
	{ 1, 2, 3 },
	{ 4, 5, 6,},
	{ 7, 8, 9 },
	{ 10, 11, 12},
	...
	{ 29, 30, 31 }
}

 

가변 배열

배열이 2차원 이상일 때, 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 되며, 이러한 배열을 가변 배열이라고 한다.

int[][] result = new int[5][];
System.out.println("Arrays.toString(result) = " + Arrays.toString(result));

// 결과 Arrays.toString(result) = [null, null, null, null, null]

선언과 동시에 초기화

int[][] ages = {
	{ 30, 32, 39, 59, 23 },
	{ 31, 41, 52, 56, 72, 13 },
	{ 45, 32, 84, 23, 13, 42, 55 },
	{ 23, 41, 62, 64, 23, 51, 67, 98 },
	{ 13, 14, 17, 84, 52, 37, 68, 66, 33 }
};

 

배열 탐색

반복문을 활용하여 배열을 탐색할 수 있으며, 기본적으로 인덱스와 배열의 크기(length)를 활용하여 탐색한다. 

// for문

int[] result = { 1, 2, 3, 4 };
int sum = 0;

for (int index = 0; index < result.length; index ++) {
	sum += result[index];
}

// while문

int[] result = { 1, 2, 3, 4 };
int sum = 0;
int index = 0;

while (index < result.length) {
	sum += result[index++];
}

// for each문
int[] result = { 1, 2, 3, 4 };
int sum = 0;

for (int score: result) {
	sum += score;
}

※ for - each문은 배열을 순회하면서 배열의 값을 수정할 수 없고 탐색만 가능하다.

반응형