배열의 정의
같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조를 말한다.
1. 같은 타입의 데이터만 저장할 수 있다.
2. 한번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
타입별 배열의 초기값
분류 | 타입 | 초기값 |
기본 타입 | byte[] | 0 |
char[] | '\u0000\ | |
short[] | 0 | |
int[] | 0 | |
long[] | 0L | |
float[] | 0.0f | |
double[] | 0.0 | |
boolean[] | false | |
참조 타입 | 클래스[] | null |
인터페이스[] | null | |
*참고: 문자열을 다루는 String은 클래스 타입에 해당한다. |
배열 선언
int[] arr;
int arr[];
배열 변수는 참조 변수에 속한다. > stack 영역에서 생성된 배열 변수는 heap 영역에 생성된 배열 객체를 참조한다.
배열 생성
1. 배열 선언과 동시에 값 목록을 주어 생성하기: 타입[] 변수명 = {값0, 값1, ...};
int[] arr1 = {1, 2, 3};
char[] arr2 = {'a', 'b', 'c'};
String[] arr3 = {"자바", "정말", "어렵네요"};
{} : 블록 안의 값을 항목으로 가지는 배열 객체를 heap 영역에 생성하고, 생성한 배열 객체의 번지를 반환한다.
배열 객체 arr1, arr2, arr3는 반환된 배열 객체의 번지를 저장해 객체를 참조하게 된다.
2. 배열 선언 시 길이만 지정해 생성하기 - new 연산자 사용: 타입[] 변수명 = new 타입[길이];
선언과 동시에 값의 목록을 넣지 않지만, 선언과 함께 배열의 길이를 할당해두고자 할 때 new 연산자를 이용할 수 있다.
int[] arr = new int[5];
int[] arr = null; //배열 객체를 참조하지 않는 상태이다.
arr = new int[5]; //길이가 5인 배열 객체를 참조한다.
배열의 길이로 배열 생성 후 배열의 인덱스를 이용해 값을 지정해줄 수 있다.
int[] arr = new int[5];
for(int i=0; i<arr.length; i++){
arr[i] = i;
}
3. 배열 변수만 선언 후 나중에 값을 지정하는 경우 - new 연산자 사용
*배열 선언 시 주의할 점: 값 목록 없이 배열 변수 선언 후, 값의 목록을 {}로 지정할 수 없다.
int[] arr;
arr = {1, 2, 3}; //compile error
<해결 방법> 배열 변수 선언 후 값을 나중에 할당하고 싶다면, new 연산자를 사용한다.
int[] arr;
arr = new int[] {1, 2, 3};
(+) 매개값으로 배열을 받는 경우에도 동일하게 적용해야 한다.
eg.
public class Main {
public static void main(String[] args) {
add(new int[] {23, 53, 99});
//add({23, 53, 99});
}
public static void add(int[] scores){
int sum = 0;
for(int score : scores){
sum+=score;
}
System.out.println(sum);
}
}
int 배열을 입력받아 모든 원소의 합계를 계산하고 반환하는 add 메소드가 있다고 할 때, 메소드의 매개값으로 값의 목록을 {}를 통해 바로 넣는 연산은 허용되지 않는다. 반드시 new 연산자를 이용해 값 목록을 지정해주어야 한다.
배열의 길이와 인덱스
배열의 길이는 저장된 항목들의 개수를 말한다. 즉, 배열의 길이를 5로 초기화했다는 뜻은, 배열에 저장할 수 있는 항목들의 개수가 5개라는 의미이다.
int[] arr = new int[5];
하지만 배열의 인덱스는 1이 아닌 0부터 시작한다는 것에 주목해야 한다.
배열을 이용한 연산을 수행할 때 무심코 범위를 .length 그대로 잡아주는 경우가 있는데, 이 경우 연산 시 배열의 길이를 초과하게 된다. 하지만 배열의 인덱스 범위는 0부터 arr.length-1의 값을 갖는다.
따라서 배열의 인덱스를 이용한 연산을 수행하고자 하는 경우 범위 설정에 주의한다.
reference. 신용권, 혼자 공부하는 자바, 한빛미디어, 2019
'p-languages > java' 카테고리의 다른 글
java/ copyOf(), copyOfRange(), arraycopy() : 배열을 복사하는 메서드 (0) | 2022.05.15 |
---|---|
java/ 문자열이 빈 문자열인지, +공백만 갖는지 확인하는 메서드 (0) | 2022.05.14 |
java/ split() : 문자열을 특정 문자열으로 나누어 배열로 반환하는 메서드 (0) | 2022.05.14 |
java/ 다차원 배열 (0) | 2022.05.10 |
java/ 배열 공부 전 이해해야 할 stack, heap 영역과 참조 타입 변수 간단 정리 (0) | 2022.05.09 |