본문 바로가기

프로그래밍언어/JAVA

[JAVA] 배열 (Array)

반응형

1.배열이란?

 

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

여기서 중요한 것은 같은 타입이어야 한다는 것이며 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.

 

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

 

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

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

 

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

 

메모리에 생성된 배열

 

 

2. 배열의 선언과 생성

 

- 배열의 선언

 

배열을 선언하는 방법은 간단하다. 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호 '[]'를 붙이면 된다. 대괄호는 타입 뒤에 붙여도 되고 변수 이름 뒤에 붙여도 되는데, 일반적으로 타입의 뒤에 붙인다.

 

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

 

- 배열의 생성

 

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

배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다.

 

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

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

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

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

 

위와 같은 방식으로 배열을 선언 및 정의할 수 있다.

배열의 선언과 생성과정을 단계별로 표현하면 다음과 같다.

 

1) int[] arr; 

  • int형 배열 참조변수 arr를 선언한다.

 

2) arr = new int[5];

  • 연산자 new에 의해서 메모리의 빈 공간에 5개의 int형 테이터를 저장할 수 있는 공간이 할당된다.
  • 할당된 공간은 자동적으로 int의 기본값인 0으로 초기화된다.
  • 대입연산자 '='에 의해 배열의 주소가 int형 배열 참조변수 arr에 저장된다.

 

 

3. 배열의 길이와 인덱스

 

생성된 배열의 각 저장공간을 배열의 요소라고 하며, 배열이름[인덱스]의 형식으로 각 요소에 접근할 수 있다.인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 주의할 점은 인덱스가 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인 배열도 생성이 가능하다.

 

배열의 길이는 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]);
}
// 배열의 길이만큼 반복문을 돌려서 각 배열의 요소를 출력

 

위의 예제와 같이 반복문의 조건식에 배열의 길이를 사용하여 배열에 있는 모든 요소를 탐색하는데 사용할 수 있다.

 

 

4. 배열의 초기화

 

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

 

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);
}

 

위의 예제와 같이 각각 요소들의 값을 입력하거나 반복문을 사용하여 값을 초기화 할 수 있다. 이외에도 다음과 같은 방법으로 배열의 선언과 초기화가 가능하다.

 

// 선언과 생성을 한 라인에서 수행
int[] a = new int[] {0, 1, 2, 3, 4};

// 선언과 생성을 동시에 하는 경우에는 new 타입[] 생략 가능
int[] b = {0, 1, 2, 3, 4};

// 선언과 생성을 따로 수행
int[] c;
c = new int[] {0, 1, 2, 3, 4};

// Error 발생. 선언과 생성을 따로 하는 경우에는 new 타입[]을 생략할 수 없다.
int[] d;
d = {0, 1, 2, 3, 4};

// 길이가 0인 배열 생성
int[] e = new int[0];
int[] f = new int[]{};
int[] g = {};

 

- 배열의 출력

 

반복문을 사용하여 배열의 요소들을 출력할 수 있다.

 

int[] arr = {10, 20, 30, 40, 50};

// for-each문 사용
for(int a : arr) {
	System.out.println(a);
}

 

반복문에서 print를 사용하여 각 요소들의 값을 출력한다.

 

다른 방법으로는 Arrays.toString() 메소드를 사용하는 것이다. 해당 메서드는 배열의 값을 "[첫번째 요소, 두번째 요소, ...]"와 같은 형식의 문자열로 만들어서 반환해준다.

 

int[] arr = {10, 20, 30, 40, 50}
System.out.println(Arrays.toString(arr));
// [10, 20, 30, 40, 50]

 

만약 배열의 요소가 아닌 배열의 참조변수 arr를 출력하게 되면 '타입@주소'의 형식으로 출력이 된다. arr의 경우 1차원 int 배열이기 때문에 이를 의미하는 '[I'의 뒤에 '@주소'가 붙어서 출력된다. 주소는 16진수 형식으로 표현되는데, 이는 실제 주소가 아닌 내부 주소이다.

예외적으로 char 배열의 경우 println 메서드로 출력하면 각 요소가 구분자없이 그대로 출력되는데, 이는 println 메서드가 char 배열일때만 이렇게 동작하도록 작성되어있기 때문이다.

 

char[] arr = {'a', 'b', 'c', 'd', 'e'};
System.out.println(arr);
// abcde

 

 

5. 배열의 복사

 

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

 

배열의 복사 방법과 예시는 다음과 같다.

 

// 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 만큼의 요소를 복사

 

만약 배열을 복사하기 위해서 단순히 temp = arr와 같이 실행하는 경우 arr 배열의 값이 복사되는 것이 아니라temp arr 배열과 같은 주소를 가리키는 참조변수가 되어서 동일한 배열이 되고 크기가 10인 배열의 공간은 사라지게 된다.

반응형

'프로그래밍언어 > JAVA' 카테고리의 다른 글

[JAVA] 다차원 배열  (0) 2021.08.25
[JAVA] String 배열  (0) 2021.08.24
[JAVA] 반복문 - for, while, do-while  (0) 2021.08.22
[JAVA] 조건문 - if, switch  (0) 2021.08.21
[JAVA] 연산자 - 논리 연산자  (0) 2021.08.13