JAVA LV 4-1

배열

Posted by Gihoon on March 14, 2023

배열이란?

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 ‘배열’이라고 한다.
많은 양의 데이터를 저장하기 위해서, 그 데이터의 숫자 만큼 변수를 선언해야 한다면 매우 혼란스러울 것이다. 이런 경우에 배열을 사용하면 많은 양의 데이터를 쉽게 다룬다.
배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
여기서 중요한 것은 같은 타입이어야 한다.
만일 배열을 사용하지 않고 학생 5명의 점수를 저장하기 위해서는 아래와 같이 5개의 변수를 선언해야 한다.

1
int score1, score2, score3, score4, score5;

변수 대신 배열을 이용하면 간단히 처리할 수 있다.

1
int[] score = new int[5];//5개의 int 값을 저장할 수 있는 배열을 생성한다.

값을 저장할 수 있는 공간은 score[0]부터 score[4]까지 5개이며, score는 배열을 다루는데 필요한 참조 변수 일뿐 저장하기 위한 공간은 아니다.

배열의 선언

배열을 선언하는 방법은 간단하다. 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호를 붙이면 된다.

1
2
타입[] 변수이름; > int[] score; , String[] name;
타입 변수이름[]; > int score[]; , String name[];

배열의 생성

배열을 선언한 다음에는 배열을 생성해야 한다. 배열을 선언하는 것은 단지 배열을 다룰 참조변수를 위한 공간이 만들어질 뿐이다.
배열을 생성하기 위해서는 연산자 ‘new’와 함께 배열의 타입과 길이를 지정해 주어야 한다.

1
2
타입[] 변수이름; // 배열 선언
변수이름 = new 타입[길이]; // 배열을 생성(실제 저장공간 생성)

다음과 같이 배열과 선언을 동시에 한줄로 할수 있다. 대부분의 경우 이렇게 작성한다.

1
int[] score = new int[5]// 길이가 5인 int배열

배열의 인덱스

생성된 배열의 각 저장 공간을 ‘배열의 요소’라고 하며, ‘배열이름[인덱스]’의 형식으로 배열에 요소에 접근한다.
인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 인덱스는 1이 아닌 0부터 시작한다. “인덱스의 범위는 0부터 배열길이 -1 까지이다
배열에 ㄱ밧을 저장하고 읽어오는 방법은 변수와 같다. 단지 변수이름 대신 ‘배열이름[인덱스]’를 사용한다는 점이 다르다.

1
2
score[3] = 100; // 배열 score의 4번째 요소에 100을 저장한다.
int value = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장

배열의 장점은 index로 상수 대신 변수나 수식도 사용할 수 있다는 것이다. 다음 예시를 보자.

1
2
3
4
5
6
7
8
9
10
11
score[0] = 0;
score[1] = 10;
score[2] = 20;
score[3] = 30;
score[4] = 40;
score[5] = 50;
//를 for문을 이용해서 간단히 할 수 있다

for (int i=0; i<5; i++){
   score[i] = i * 10;
}

for문의 제어변수 i는 배열의 index로 사용하기 알맞아서 배열을 다룰 때 for문은 필수적이다.
배열을 다룰 때 주의할 점은 index의 범위를 벗어난 값을 index로 사용하지 않아야 한다.
이러한 실수는 컴파일러가 걸러주지 못한다. 하지만 실행시에 에러가 발생한다.

배열의 길이

앞서 배운것과 같이 []안에 배열의 길이를 적어야 하는데, 배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 공간의 개수이다.
배열의 길이는 당연히 양의 정수이어야 하며, 최대값은 int타입의 최대값 약 20억이다.
길이가 0인 배열도 생성이 가능하긴 하다. 이 배열은 무슨 의미가 있을까?

1
int[] arr = new int[0] // 길이가 0인 배열

배열의 길이는 int 범위의 양의 정수 (0도 포함) 이어야 한다

배열이름.length

자바에서는 jvm이 모든 배열의 길이를 별도로 관리하며, ‘배열이름.length’를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.

1
2
int[] arr = new int[5]; // 길이가 5인  int 배열
int tmp = arr.length;// arr.length 값은 5이고 tmp에 5가 저장된다.

배열은 한번 생성하면 길이를 변경할 수 없기 때문에 배열의 길이는 변하지 않는다.
따라서 ‘배열이름.length’는 상수이다.

1
2
3
4
5
int [] score = new int [5];

for (int i=0; i < score.length; i++){ //score.length를 이용하여 배열의 길이를 바꾸어도 조건식을 변경하지 않아도 된다.
	System.out.println(score[i]);
}

배열의 초기화

for문을 이용하여 배열을 초기화하는 경우가 많이 쓰이지만, 저장하려는 값에 일정한 규칙이 있어야 가능하기 때문에
자바에서는 다음과 같이 배열을 간단히 초기화 할 수 있는 방법을 제공한다.

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

이 코드에서 new int[]를 샹략할 수 있다.

배열의 출력

배열을 초기화 할떄 for문을 사용하듯이, 배열에 저장된 값을 확인할 때도 다음과 같이 for문을 사용하면 된다.

1
2
3
4
5
int[] iAr = { 100, 95, 80, 70, 60 } ;

for{int i=0; i< iArr.length; i++){
	System.out.println)(iArr[i]);
}

println메서드는 출력 후에 줄바꿈을 하므로 여러 줄에 출력되어 보기 불편할 때가 있다. 그럴때는 출력후에 줄바꿈을 하지 않는 print메서드를 사용하자.

더 간단한 방법은 ‘Arrays.toString(배열이름)’ 메서드를 이용하는 것이다. 이 메서드는 배열의 모든 요소를 순서대로 문자열로 만들어서 반환한다.
** 이 메서드를 사용하려면 ‘import java.util.*‘를 추가해야한다.**
예외적으로 char배열은 println메서드로 출력하면 각 요소가 구분 자없이 그대로 출력된다.

배열의 복사

for문 대신 System 클래스의 arraycopy()를 사용하면 보다 간단하고 빠르게 배열을 복사 할 수 있다. for문은 배열의 요소 하나하나에 접근해서 복사하지만 arraycopy()는 지정된 범위의 값들을 한번에 복사한다.