변수는 하나의 값만 저장할 수 있다. 따라서 저장해야 할 값의 수가 많아지면 그만큼 많은 변수가 필요하다. 변수가 많아질수록 매우 비효율적이고 지루한 코딩이 되기 때문에, 이를 효율적으로 다루는 방법이 바로 배열이다. 배열은 연속된 공간에 값을 나열시키고, 각 값에 인덱스 구조를 부여해 놓은 자료구조이다. 인덱스는 대괄호 []와 함께 사용하여 각 항목의 값을 읽거나 저장하는 데 사용한다.
배열은 다음과 같은 특징을 가지고 있다.
- 배열은 같은 타입의 값만 관리한다.
- 배열의 길이는 늘리거나 줄일 수 없다.
배열을 생성과 동시에 길이가 결정된다. 또한 한 번 결정된 배열의 길이는 늘리거나 줄일 수 없다.
배열 변수 선언
배열을 사용하기 위해서는 우선 배열 변수 선언을 해야한다. 배열 변수 선언은 두 가지 형식으로 작성할 수 있다.
타입[] 변수;
타입 변수[];
배열 변수는 참조 변수이다. 배열도 객체이므로 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 주소를 저장한다. 참조할 배열이 없다면 배열 변수도 null로 초기화할 수 있다.
값 목록으로 배열 생성
배열에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열을 생성할 수 있다.
String[] season = { "Spring", "Summer", "Fall", "Winter" };
이렇게 생성된 배열에서 "Summer"를 "여름"으로 바꾸고 싶다면 대입 연산자를 사용하면 된다.
season[1] = "여름";
중괄호 {}로 감싼 값의 목록을 배열 변수에 대입할 때 주의할 점이 있다. 배열 변수를 미리 선언한 후에는 값 목록을 변수에 대입할 수 없다.
타입[] 변수;
변수 = { 값0, 값1, 값2, 값3, ... }; // 컴파일 에러
배열 변수를 선언한 시점과 값 목록이 대입되는 시점이 다르다면 다음과 같이 new 타입[]을 중괄호 앞에 붙여 주면 된다.
변수 = new 타입[] { 값0, 값1, 값2, 값3, ... };
new 연산자로 배열 생성
값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성할 수도 있다. new 연산자를 다음과 같이 사용하면 배열 객체를 생성시킨다. 길이는 배열이 저장할 수 있는 항목 수를 말한다.
타입[] 변수 = new 타입[길이];
new 연산자는 해당 길이의 배열을 생성하고 배열의 번지를 리턴하기 때문에 배열 변수에 대입할 수 있다. 이미 배열 변수가 선언된 후에도 다음과 같이 대입이 가능하다.
타입[] 변수 = null;
변수 = new 타입[길이];
new 연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화된다. 다음 표는 타입별 배열의 초기값을 보여 준다.
| 데이터 타입 | 초기값 | |
| 기본 타입 | byte[] char[] short[] int[] long[] |
0 '\u0000' 0 0 0L |
| float[] double[] |
0.0F 0.0 |
|
| boolean[] | false | |
| 참조 타입 | 클래스[] 인터페이스[] |
null null |
배열을 생성하고 난 후 특정 인덱스 항목을 새로운 값으로 변경하는 방법은 동일하다.
변수[인덱스] = 값;
배열 길이
배열의 길이란 배열에 저장할 수 있는 항목 수를 말한다. 코드에서 배열의 길이를 얻으려면 도트(.) 연산자를 사용해서 참조하는 배열의 length 필드를 읽으면 된다.
배열변수.length;
배열의 length 필드는 읽기만 가능하므로 다음과 같이 값을 변경할 수는 없다.
intArray.length = 10; // 컴파일 에러
배열 길이 예제 : 전체 배열의 총합 구하기
public class ArrayLength {
public static void main(String[] args) {
int[] scores = { 70, 80, 90 };
int sum = 0;
for(int i = 0; i < scores.length; i++) {
sum += scores[i];
}
System.out.println(sum);
//배열 항목의 평균 구하기
double avg = (double) sum / scores.length;
System.out.println(avg);
}
}
실행 결과
240
80.0
배열 복사
배열은 한 번 생성하면 길이를 변경할 수 없다. 더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야 한다. 가장 기본적인 복사 방법은 for 문을 이용하는 것이다.
public class Example {
public static void main(String[] args) {
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new Int[5];
for(int i = 0; i < oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
for(int i = 0; i < newIntArray.length; i++) {
System.out.print(newIntArray + ", ");
}
}
}
실행 결과
1, 2, 3, 0, 0
배열 복사를 위한 더 간단한 방법이 있다. System의 arraycopy() 메서드를 이용하면 된다.
System.arraycopy(원본 배열, 원본 배열 시작 인덱스, 새 배열, 새 배열 붙여넣기 시작 인덱스, 복사 항목 수);
배열 항목 반복을 위한 향상된 for 문
자바는 배열 및 컬렉션을 좀 더 쉽게 처리할 목적으로 다음과 같은 for 문을 제공한다. 카운터 변수와 증감식을 사용하지 않고, 항목의 개수만큼 반복 후 자동으로 for 문을 빠져나간다.
for ( 타입 변수 : 배열 ) {
실행문;
}
for 문이 실행되면 배열에서 가져올 항목이 있을 경우 변수에 항목을 저장하고 실행문을 실행한다. 반복하다가 가져올 다음 항목이 없으면 for문을 종료한다.
public class Example {
public static void main(String[] args) {
int[] scores = { 95, 71, 84, 93, 87 };
int sum = 0;
for(int score : scores) {
sum += score;
}
System.out.println(sum);
}
}
실행 결과
430
'Language > JAVA' 카테고리의 다른 글
| [JAVA] 객체지향 프로그래밍 (3) | 2024.09.04 |
|---|---|
| [JAVA] 다차원 배열 (0) | 2024.09.03 |
| [JAVA] 문자열(String) (2) | 2024.09.03 |
| [JAVA] 참조 타입 (0) | 2024.09.03 |
| [JAVA] break 문과 continue 문 (0) | 2024.09.03 |