본문 바로가기
Java/Java

[Java]배열(Array) 선언 및 초기화,복사

by 전재경 2022. 11. 11.

배열이란 ?

 

동일한 자료형으로 선언된 데이터 공간을 메모리 상에 연속적으로 나열하여 데이터 관리의 효율성을 높이는 것

변수는 한개의 데이터만 저장할 수 있다.

따라서 저장해야 할 데이터의 수가 많아지면 그만큼 많은 양의 변수를 선언해줘야하는 비효율성이 발생.

그렇기에 좀 더 효율적인 방법이 필요한데 이것이 배열이다.

배열은 같은 타입의 데이터를 연속된 공간에 나열시키고 각 데이터에 인덱스(index)를 부여해 놓은 자료구조

 

 

다음과 같이 여러개의 int값을 다루는 경우 여러개를 각각의 변수로 선언하는 것이 아닌 하나의 배열로 묶을 수 있다.

// 각각의 변수로 선언
int a1, a2, a3, a4, a5;

// 5개의 int 값을 저장할 수 있는 배열 생성
int[] a = new int[5];

각각의 변수로 선언하게 되면 메모리 상에 서로 다른 5개의 int 값 저장공간이 생성되는데배열의 경우 a[0]부터a[4]까지 5개의 int값을 저장할 수 있는 공간이 생성되고 a는 배열을 다루는데 필요한 참조변수배열의 주소값을 가지게 된다.

 

 

타입별 배열의 초기값

분류 타입 초기값
기본 타입(정수) byte[]
char[]
short[]
int[]
long[]
0
'\u0000'
0
0
0L
기본 타입(실수) float[]
double[]
0.0F
0.0
기본 타입(논리) boolean[] false
참조 타입 클래스[] null
인터페이스[] null

 

배열의 선언과 생성

 

배열의 선언

 

원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호 '[]'를 붙이면 된다.

대괄호는 타입 뒤에 붙여도 되고 변수 이름 뒤에 붙여도 되는데, 일반적으로 타입의 뒤에 붙인다.

 

선언방법 예시
타입[] 변수이름; String[] name;
int[] age;
타입 변수이름[]; String name[];
int age[];

배열의 생성

 

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

 

배열 변수는 참조변수에 속합니다.

배열도 객체이므로 힙 영역에 생성되고 배열 변수는 힙영역의 배열 객체를 참조하게 된다.

따라서 new를 해주지 않으면 해당 배열은 null값을 가지며 null값을 가진 상태에서 배열을 활용하려고 하면 NullPointerException이 발생

아마 배열을 사용하기 시작하면 많이 보이는 에러메시지

NullPointerException이 뜨면 1차적으로 배열의 index값이 제대로 있는지부터 제대로 확인

 

// 해당 타입의 배열 선언 (참조변수 선언)
타입[] 변수이름;

// 해당 타입의 배열 생성 (실제 저장 공간 생성)
변수이름 = new 타입[길이];

int[] arr1; // int타입 배열을 다루기 위한 참조변수 arr 선언
arr1 = new int[5]; // int타입의 값 5개를 저장할 수 있는 배열

int[] arr2 = new int[5]; // int타입 배열의 선언과 생성을 한줄로 수행

 

배열의 길이와 인덱스

 

생성된 배열의 각 저장공간을 배열의 요소라고 하며, 배열이름[인덱스]의 형식으로 각 요소에 접근할 수 있다.인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 주의할 점은 인덱스가 1이 아닌 0부터 시작한다는 것이다. 인덱스는 0부터 '배열길이 - 1'까지이다. 만약 인덱스의 범위를 넘어가는 값을 인덱스로 주는 경우 ArrayIndexOutOfBoundsException이 발생한다.

int[] arr = new int[5];

arr[3] = 100;
int value = arr[3];

System.out.println(arr[3]);
// 100

System.out.println(value);
// 100

for(int i = 0; i < 5; i++) {
	System.out.println(arr[i]); // 반복문의 제어 변수를 배열의 인덱스로 사용하여 값을 출력한다.
}

'''
0
0
100
0
0
'''

int i = 1;
int temp = arr[i + 1]; // 이와같이 수식이 인덱스로 사용되는 경우 해당 수식이 먼저 계산되어 인덱스를 구한다.

System.out.println(arr[5]); // ArrayIndexOutOfBoundException 발생 - 최대 인덱스인 4보다 큰 값이 인덱스로 주어져 에러 발생

배열을 생성할 때는 배열의 길이를 주어야 하는데, 배열의 길이는 배열의 요소의 개수이다. 그렇기 때문에 양의 정수이어야 하고 최대값은 int타입의 최대값이다.

 

배열의 길이가 0인 배열도 생성이 가능하다.

 

배열이름.length

자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며 '.length'를 사용하여 배열의 길이에 대한 정보를 얻을 수 있다.

int[] arr = new int[5];
System.out.println(arr.length); // 5

배열은 한번 생성하면 길이를 변경할 수 없기 때문에 이미 생성된 배열의 길이는 변하지 않는다. 즉 배열이름.length는 상수이다. 값을 읽을 수만 있고 변경할 수 없다.

int N = arr.length;
for(int i = 0; i < N; i++) {
	System.out.println(arr[i]);
}
// 배열의 길이만큼 반복문을 돌려서 각 배열의 요소를 출력

 

배열의 초기화

 

배열은 생성과 동시에 자동적으로 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만 원하는 값을 저장하기 위해서는 각 요소마다 값을 지정해줘야 한다.

int[] score = new int[5];
score[0] = 10;
score[1] = 20;
score[2] = 30;
score[3] = 40;
score[4] = 50;

// for문을 사용한 초기화
for(int i = 0; i < score.length; i++) {
	score[i] = 10 * (i + 1);
}

배열 복사

 

배열은 한번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장공간이 필요한 경우 큰 배열을 새로 만들고 이전 배열의 내용을 복사해야 한다.

// 1. for문을 사용하여 배열 복사
int[] arr = new int[5];
.
.
.
int[] temp = new int[10];
for(int i = 0; i < 5; i++) {
	temp[i] = arr[i];
}

// 2. System.arraycopy() 사용
System.arraycopy(arr, 0, temp, 0, arr.length);
// arr[0]에서 temp[0]으로 arr.length 만큼의 요소를 복사

 

 

다차원 배열

 

행과 열로서 구성된 배열을 2차원 배열이라고 한다.

2차원 배열은 수학의 행렬을 떠올리면 되는데, 가로 인덱스와 세로 인덱스를 사용

자바는 2차원 배열을 중첩 배열 방식으로 구현,

 

ex) 2(행) X 3(열) 행렬

int[][] scores = new int[2][3];

 

 

 

참고블로그

 

 

[Java] 배열의 여러가지 선언 및 초기화 방법

배열이란 동일한 자료형으로 선언된 데이터 공간을 메모리 상에 연속적으로 나열하여 데이터 관리의 효율성을 높이는 것입니다. 변수는 한개의 데이터만 저장할 수 있습니다. 따라서 저장해야

coding-factory.tistory.com

 

 

[JAVA] 배열 (Array)

1.배열이란? 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 많은 양의 데이터를 저장하고 이를 다루기 위해 사용한다. 여기서 중요한 것은 같은 타입이어야 한다는 것

jammdev.tistory.com

 

'Java > Java' 카테고리의 다른 글

[Java]열거 타입  (0) 2022.11.11
[Java]향상된 for문  (0) 2022.11.11
[Java]메모리 구조  (0) 2022.11.11
[Java]기본타입과 참조타입  (0) 2022.11.11
[Java]별 찍기 피라미드  (0) 2022.11.10

댓글