본문 바로가기

p-languages/java

java/ 1차원 배열

배열의 정의

같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조를 말한다.

 

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