본문 바로가기
프로그래밍/자바

자바문법 - 배열 사용하기

by pentode 2018. 4. 18.

자바(java) 언어에서 배열을 사용하는 방법을 알아 보겠습니다. 배열은 여러개의 데이터를 저장할 수 있는 자료 구조로, 순서를 나타내는 정수형 배열 첨자를 사용해서 데이터에 액세스 할 수 있습니다. 자바 배열은 한번 크기가 정해지면 크기를 변경할 수 없습니다.



1. 배열 변수의 선언은 다음과 같습니다. [] 가 배열 기호 입니다. 정수를 저장할 수 있는 배열 변수 입니다.


int[] values;
// or
int[] values = null;


배열은 객체이므로 변수만 선언할 경우 실제 객체가 없으므로 null 입니다.



2. 배열을 생성합니다. new 연산자를 사용해서 만듭니다. 앞에서 만든 변수에 객체를 만들어서 대입하는 방법과, 선언과 동시에 생성하는 방법 입니다.


// 10개의 정수를 저장할 수 있는 배열을 생성합니다. values = new int[10]; // 선언과 동시에 생성합니다. int[] scores = new int[10];



3. 위에서 생성한 배열에는 기본적으로 어떤 값이 들어 있을까요? 


- 숫자형 원시(Primitive) 타입의 경우에는 0이 들어 있습니다.(char 포함)

- boolean의 경우에는 false가 들어 있습니다.

- 객체 배열의 경우는 null이 들어 있습니다.

  예) String[] names = new String[10];



4. 배열에 값을 채워 보겠습니다.


배열은 배열의 길이를 가지는 상수 멤버변수인 length를 가집니다. 이걸 이용해 보겠습니다. 위에서 만든 scores 배열의 길이는 10이므로 다음 코드는 배열이 0부터 9까지 10개의 값을 순서대로 가지도록 초기화 합니다. 배열 인덱스는 0부터 시작합니다.(Zero-based numbering)


import java.util.Arrays;

...

for(int i = 0; i < scores.length; i++) {
  scores[i] = i;
}

System.out.println(Arrays.toString(scores));

결과)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]



5. 배열 크기를 벗어난 인덱스를 사용하면 예외가 발생합니다.


scores[-1] 또는 scores[10] 처럼 사용하면 ArrayIndexOutOfBoundsException 이 발생합니다. 보통 부등호를 사용해서 배열 범위를 다루게 되는데, 실수로 1씩 범위를 넘거나, 적게 사용해서 발생하는 에러를 Off-by-one error 라고 합니다.



6. 미리 알고 있는 값으로 배열을 초기화해서 생성할 수도 있습니다.


int[] odds = {1, 3, 5, 7};
// or
int[] evens = new int[]{2, 4, 6, 8};


이 때는 배열 갯수를 지정하지 않아도 입력된 요소의 갯수로 자동 생성 됩니다.



7. 2차원 배열 만들기


2차원 배열은 배열 첨자( [] )를 두개 사용해서 만듭니다. 더 많은 차원의 배열을 만들기 위해서는 첨자를 계속 늘리면 됩니다.


import java.util.Arrays;

...

int[][]scores = new int[2][3];

int k = 0;
for(int i = 0; i < scores.length; i++) {
    for(int j = 0; j < scores[i].length; j++) {
        scores[i][j] = k++;
    }
    System.out.println(Arrays.toString(scores[i]));
}

결과)
[0, 1, 2]
[3, 4, 5]


위의 2차원 배열은 3개의 요소를 가지는 배열을 2개 가지고 있는 것과 같습니다. 그러므로 전체 배열의 이름인 scores.length 는 2값을 가지게 되고, 각각 score[0].length와 score[1].length 은 3을 가지게 됩니다.



8. 배열요소 사용하기


배열의 요소를 하나씩 꺼내서 출력하거나 어떤 처리를 하기 위해서 사용할 수 있는 방법으로는 고전적인 for, while 등의 루프를 사용할 수도  있고, jdk 1.5 부터 지원하는 개선된 for 루프를 사용할 수 도 있습니다. scores 가 1차원 배열인 경우의 예 입니다. 아래 세 가지 코드는 모두 동일한 결과를 냅니다.


for(int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}
// or
int i = 0;
while(i < scores.length) {
    System.out.println(scores[i++]);
}
// or
for(int score : scores) {
    System.out.println(score);
}



9. 길이가 0인 배열 만들기


아래 코드는 길이가 0인 배열을 만듭니다. scores는 null이 아닙니다. scores.length는 0입니다.


int[] scores = new int[0];


이런 길이가 0인 배열은 배열을 반환하는 메소드를 만들때 반환할 요소가 없을 경우 사용할 수 있습니다. a.test(); 라는 메소드가 정수형 배열을 반환한다고 가정해 보겠습니다. 반환할 요소가 없을때 null 을 반환하는 경우와, 길이가 0인 배열을 반환하는 경우 코드를 보겠습니다.


// null 을 반환하는 경우
int[] scores = a.test();

if(scores != null) {
    for(int i = 0; i < scores.length; i++) {
        System.out.println(scores[i]);
    }
}

// 길이가 0인 배열을 반환하는 경우
int[] scores = a.test();

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


객체의 null 체크를 할 필요가 없으므로 길이가 0인 배열을 반환하는 경우가 코드가 좀 더 깔끔한 것을 알 수 있습니다.



10. 배열 유틸리티 클래스


위에서 배열의 내용을 문자열로 출력하기 위해서 Arrays객체의 toString() 메소드를 사용해보았었습니다. 이 Arrays 객체는 toString() 외에도 배열을 다루는데 유용한 다양한 기능을 제공해 줍니다.


- Arrays 객체를 사용하기 위해서는 import 해야 합니다.


import java.util.Arrays;


- 배열을 단일 값으로 채울때 사용합니다.


// 배열 전체를 1로 채웁니다.

Array.fill(scores, 1);


- 배열을 정렬합니다.


Array.sort(scores);


- 배열이 정렬되어 있다면 이진 검색을 사용하여 배열내 값을 찾을 수 있습니다.


Arrays.sort(scores);

// 배열내에서 5값을 찾아 그 인덱스를 반환합니다.

int index = Arrays.binarySearch(scores, 5);


- 배열을 복사합니다.

첫 번째 인자는 원본 배열이고, 두 번째 인자는 새로 만들어질 배열의 길이 입니다. 새 배열의 길이가 원본보다 짧으면 잘리고 복사되고, 원본보다 길면 다 복사되고 나머지는 배열의 타입에 따라 0, false, 또는 null 로 채워지게 됩니다.


int[] newScores = Arrays.copyOf(scores, 20);

System.out.println(Arrays.toString(newScores));


결과)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0]



이것으로 자바(java) 언어에서 배열을 다루는 방법을 알아 보았습니다.

반응형