array는 같은 type의 elements를 저장한다. 개념적인 부분에서는 c언어의 배열과 같다.
다만, 약간의 부분에서 차이를 보인다.
int[] scores = new int[10];
변수 scores의 type을 int[ ]으로 하고 있다. bracket은 다음 두 가지 경우 모두 가능하다.
int[] scores
int scores[];
하지만, 첫 번째의 것을 보편적으로 사용한다.
int[] scores = {83, 97, 100, 80, 79};
배열은 위 방법을 통해 인스턴스화를 스킵하여 원소를 채우는 것이 가능하다.
자바 배열 사용에 있어 c와 다른 또 한 가지는 for-each 문이다.
//for-each loop
for(int score : scores){
System.out.println(score);
}
index 0에서 시작하여 모든 원소를 처리하는 무언가에 적합하게 사용한다.
자바 배열은 최초 인스턴스화에서 고정된 사이즈를 갖는다. N이 사이즈라 가정했을 때, 자바 배열 인덱스에 접근은 0부터 N-1까지 가능하다. 만약 이외의 인덱스에 접근했다면 Java Interpreter는 ArrayIndexOutOfBoundsException
을 throw하여 자동으로 Bounds Checking을 해준다.
int 배열 codes의 사이즈를 100이라 하자.
int[] codes = new int[100];
for(int idx=0; idx<=100; idx++){
codes[idx] = idx*50 + epsilon;
}
for문은 idx 100을 접근하게 되고 ArrayIndexOutOfBoundsException이 터지게 된다.
배열을 사용할 때 Bounds Check에 유용한 length를 이용하면 오류를 쉽게 피할 수 있다.
int[] codes = new int[100];
for(int idx=0; idx<=codes.length; idx++){
codes[idx] = idx*50 + epsilon;
}
배열의 원소는 어떠한 객체의 참조일 가능성이 있다.
Score[] scr = new Score[3];
위의 선언은 레퍼런스 변수 scr와 Score 객체에 대한 레퍼런스 변수 3개를 생성한다.
scr에 Score 객체의 레퍼런스 변수 3개가 배열의 형태로 만들어진다.
그러나 다음의 선언으로 Score 객체 3개가 만들어진 것은 아니다. 객체에 대한 레퍼런스 변수 3개가 만들어진 것이기 때문에 따로 Score 객체를 생성해야 한다.
scr[1] = new Score();
scr[2] = new Score();
scr[3] = new Score();
C 언어로 비유하면 scr는 Score라는 구조체에 접근할 수 있는 포인터들의 배열인 셈이고, scr[1], scr[2]와 같이 각각의 원소들이 포인터 역할을 하여 Score 구조체 변수들에 접근할 수 있는 것이다. Score 구조체에는 여러 field, method가 있는 것이다.
//객체 배열 예제
public class Score {
String name;
int score;
public Score() { } // 생성자
public void showScore() {
System.out.println(name + "의 점수는 " + score + "입니다.");
}
}
public class Main {
public static void main(String[] args) {
Score[] scr = new Score[3]; // 객체 배열 선언 및 생성
for (int i=0; i<scr.length; i++) {
scr[i] = new Score(); // Book 객체 생성
}
scr[0].name = "mingi";
scr[0].score = 100;
scr[1].name = "juhyung";
scr[1].score = 89;
scr[2].name = "hyungho";
scr[2].score = 84;
for (int i=0; i<scr.length; i++) {
scr[i].showScore();
}
}
}