1. 배열의 길이와 인덱스
생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]' 의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.
인덱스는 0부터 시작한다. 0,1,2,3,4자동으로 번호가 붙는다. 이 숫자가 배열의 인덱스이다.
인덱스의 범위는 "0부터 배열길이-1 까지"
배열은 또 index로 상수 대신 변수나 수식도 사용할 수 있다. 그래서 for문으로 간단히 할 수 있다.
index로 변수 i를 사용하고, for문으로 변수 i의 값을 0부터 4까지 증가시킨다.
만약, 아래처럼 괄호[ ] 안에 수식이 포함된 경우, 이 수식이 먼저 계산된다. 그래야 배열의 몇 번째 요소인지 알 수 있다.
예를 들어 score[3]의 값이 100이고, 변수 i의 값이 2일 때, 다음과 같이 계산된다.
int tmp = score[i+1];
->int tmp = socre[2+1];
->int tmp =score[3];
->int tmp=100;
*배열 사용시 주의점
index의 범위를 벗어난 값을 index로 사용하지 않아야한다.
int [ ] score = new int[5]; //길이가 5인 배열. index의 범위는 0~4
score[5]=100; //index의 범위를 벗어난 값을 index로 사용
유효하지 않은 값을 index로 사용하면, 무사히 컴파일을 해도 실행시 (ArrayIndexOutOfBoundsException)가 발생.
예1) //배열의 범위 벗어남
public class ArrayEx1 {
public static void main(String[] args) {
int[] score = new int[5];
int k = 1;
score[0] = 50;
score[1] = 60;
score[k + 1] = 70; // score[2]=70
score[3] = 80;
score[4] = 90;
int tmp = score[k + 2] + score[4]; // int tmp= score[3]+ score[4]
// for문으로 배열의 모든 요소를 출력한다.
for (int i = 0; i < 5; i++) {
System.out.printf("score[%d]: %d%n", i, score[i]);
}
System.out.printf("tmp: %d%n", tmp);
System.out.printf("score[%d]: %d%n", 7, score[7]);
}
}
배열 score는 배열의 길이가 5이므로 index의 범위가 0~4이다. 7을 배열의 index로 출력해보았다.
컴파일 시에는 에러가 없지만 실행시 인덱스 범위를 벗어남 에러 발생
배열의 길이
배열의 길이는 배열 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다.
배열의 길이는 양의 정수. 최대값은 int타입의 최대값, 약 20억이다.
길이가 0인 배열도 생성이 가능하다. 길이가 0이라는 얘기는 값을 저장할 수 있는 공간이 하나도 없다는 뜻인데,
이런 배열을 생성하는 것이 의미있을까?
int [] arr = new int[0]; //길이가 0인 배열도 생성가능
배열의 길이는 int범위의 양의 정수(0도 포함)이어야한다.
배열이름.length
배열은 한번 생성하면 그 길이를 바꿀 수 없기 때문에 이미 생성된 배열의 길이는 변하지 않는다.
배열은 한번 생성하면 실행동안 글 길이를 바꿀 수 없다.
실행전에는 바꿀 수 있음.
배열이름.length 는 상수다. 즉 값을 읽을 수만 있을 뿐 바꿀 수 없다.
int[]arr=new int[5];
arr.length=10; //에러. 배열의 길이 변경 불가
배열의 각 요소 for문을 이용한 출력
int[] score = new int[6];
for(int i=0; i<6; i++) {
System.out.println(score[i]);
}
배열의 길이를 6->5로 변경
int[] score = new int[5]; //배열의 길이를 6->5로 변경
for(int i=0; i<6; i++) {
System.out.println(score[i]); //에러
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at ArrayEx.ArrayEx2.main(ArrayEx2.java:8) 발생
유효한 인덱스 범위인 0~4를 넘어 0~5까지 반복하기 때문에 5번째 반복에서 에러 발생
->배열 이름.length를 이용하자
int[] score = new int[5]; //배열의 길이를 6->5로 변경
for(int i=0; i<score.length; i++) { //조건식을 변경하지 않아도됨
System.out.println(score[i]);
}
배열이름.length는 배열의 길이가 변동하면 자동적으로 변경된 배열의 길이를 값으로 갖는다.
for문의 조건식을 일일이 변경하지 않아도 된다.
배열의 길이 변경하기
배열은 한번 선언되면 길이를 바꿀 수 없는데, 배열에 저장공간이 부족할 경우는?
더 큰 길이의 새로운 배열을 생성한 다음, 기존의 배열에 저장된 값들을 새로운 배열에 복사하면 된다.
메모리 공간에 int(4 byte)*5=20byte ; 만약 배열의 길이를 10으로 늘리면 20byte가 추가로 더 필요하다.
연속적인 40byte가 필요하게 됐으므로 처음 20byte뒤가 비어있다는 보장이없다.
확인해서 공간이 부족하면 다른 곳으로 옮겨야한다.
그렇게 하지않고 크기를 못 내게하고 공간이 부족하면 새로운 큰 걸 만들고 기존 배열을 복사한다.
배열의 길이 변경하는 법:
1. 더 큰 배열을 새로 생성
2. 기존 배열의 내용을 새로운 배열에 복사
처음부터 배열의 길이를 넉넉하게 잡아줘야 새로 배열을 생성하는 상황이 가능한 적게 발생한다.
그래도 너무 배열의 길이를 크게 잡으면 메모리가 낭비되므로 기존의 2배 길이 정도로 생성하는 것이 좋다.
'JAVA > 배열(array)' 카테고리의 다른 글
[JAVA] 배열의 활용 예제/총합과 평균/ 최대값과 최소값/섞기/난수/정렬/빈도수 구하기 (0) | 2021.06.15 |
---|---|
[JAVA] 배열의 복사 /System.arraycopy() (0) | 2021.06.15 |
[JAVA] Arrays.toString (0) | 2021.06.15 |
[JAVA] 배열의 초기화 (0) | 2021.06.15 |
[JAVA] 배열(array) (0) | 2021.06.12 |