배열의 길이, 배열의 초기화
배열의 길이
- 배열이름.length - 배열의 길이(int형 상수)
int[] arr = new int[5]; // 길이가 5인 int배열
int tmp = arr.length; // arr.length의 값은 5이ㄱ tmp에 5가 저장된다.
"배열은 한번 생성하면 일단 실행하면 그 길이를 바꿀 수 없다."
- 왜 길이를 못바꾸는가?
- 공간이 부족하면 어떻게 하는가?
위의 코드를 예로 들면 int[5]는 4byte * 5 즉, 20byte의 공간이 필요하다.
현재 보유하고 있는 메모리는 내부 공간을 보면, 사용되고 있는 공간이 있고, 비어있는 공간이 있을 것이다.
배열은 연속적이므로 메모리에서 20byte의 공간을 찾아야 한다.
비어있는 공간 중, 20byte짜리를 찾게되면, 해당 공간에 배열이 생성되고 해당 주소를 사용한다.
근데 만약에 int[5]가 아니라, 공간이 더 필요해서 int[10]으로 늘렸다고 가정해보자.
그러면 20byte가 더 필요하다.
근데, int[5]일때 기존에 사용하고 있었던 배열 뒤에 추가로 연속적인 공간이 필요하므로
총 40byte의 공간이 필요하다.
근데, 메모리에서 처음에 사용하던 20byte다음에 뒤에있는 20byte 공간이 비어있다는 보장이 없다.
비어있을 수도 있고, 없을 수도 있다.
그렇기 때문에 이것을 확인해서 만약에 공간이 부족하면, 이것을 40byte의 빈공간으로 옮겨야하는데,
그렇게 하지말고, 그냥 아예 크기를 못바꾸게 하고, 필요하면 다른곳으로 옮기도록 규칙이 설정되어 있다.
따라서 공간이 부족하면 크기를 늘릴 수 없기 때문에 새로운 큰 공간을 만든다.
그리고 기존 배열에 있는 내용을 복사한다.
배열의 길이는 int[] score = new int[6] 라는 문장에서도 6이라고 명시되어 있는데,
뭐하러 또 int tmp = arr.length; 를 사용하냐면,
예를 들어서, 아래와 같이 길이 6의 int배열을 생성했다고 가정해보자.
int[] score = new int[6];
for (int i = 0; i < 6; i = i + 1)
System.out.prinln(score[i]);
for문 반복문을 이용하여 score배열의 모든 요소를 출력하는 코드이다.
근데, 만약에 new int[6]의 값을 new int[5]로 바꾸면 어떻게 될까?
for문 반복문의 조건문에 배열의 길이 6도 함께 5로 바꿔주어야 한다.
근데 깜빡잊고 for문에 사용한 배열의 길이는 수정하지 않는다면 어떻게 될까?
수정한 배열[5]의 모든 요소를 출력하기 위한 인덱스의 범위는 0~4인데 인덱스의 범위가 0~5에서 수정되지 않을 것이다.
그러면 이부분에서 에러가 발생한다.
왜냐하면, 배열의 인덱스 범위를 벗어낫기 때문이다.
그래서 이런실수를 하기 쉽기 때문에 아래와 같이 코드를 작성한다.
int[] score = new int[5]; // 배열의 길이를 6에서 5로 변경
for (int i = 0; i < score.length; i = i + 1) // 조건식을 변경하지 않아도 됨
System.out.println(score[i]);
이렇게 for문의 조건식에 배열 길이를 직접 적는 것이 아니라, score.length로 작성하면 위에서 배열의 길이를 int[] score = new int[6]등으로 바꿔도 저절로 배열길이가 바뀌어 들어가게 된다.
배열의 초기화
- 배열의 각 요소에 처음으로 값을 저장하는 것
int[] score = new int[5]; // 길이가 5인 int형 배열을 생성한다.
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;
배열 score의 인덱스 범위는 0~4이다.
처음에 이 배열에 각각 데이터를 저장하는 것을 초기화라고 한다.
보통 반복문으로 할 수도 있다.
int[] score = new int[5]; // 길이가 5인 int형 배열을 생성한다.
for (int i = 0; i < score.length; i = i + 1)
score[i] = i * 10 + 50;
for문을 이용해서 초기화 하기도 한다.
그치만, for문을 이용해서 초기화 하려면 어떤 규칙이 있어야 가능하다.
그래서 좀더 간단하게 초기화를 할 수 잇는 방법을 제공한다.
int[] score = new int[]{50, 60, 70, 80, 90};
int[] score = {50, 60, 70, 80, 90}; // new int[]를 생략할 수 있음
간단한 초기화 방법이 있다. new int[] 붙인 첫번째 문장이 원조인데, 불편하니까 두번째 문장처럼 생략 할 수도 있다.
보통 두번째 문장 방식으로 쓴다.
한가지 조심해야 할 것은,
int[] score;
score = {50, 60, 70, 80, 90}; // 에러 new int[]를 생략할 수 없음
score = new int[]{50, 60, 70, 80, 90}; // OK
이 방식은 두문장으로 나눠쓰면 에러가 발생한다.
해당 방식으로 사용시, 반드시 한문장으로 합쳐 사용해야 한다.
정말 어쩌다 한번씩 선언과 초기화를 나누어야 할 때가 있는데 그럴 때는, 세번째 문장처럼 사용하면 된다.
자바를 처음 공부하는데, 이걸 모두 외우려고 하지말고,
우선은 이 방식만 기억하자.
int[] score = new int[]{50, 60, 70, 80, 90};
int[] score = {50, 60, 70, 80, 90}; // new int[]를 생략할 수 있음
그리고 이것만 주의하자. int[] score = {50, 60, 70, 80, 90};은 두줄로 나눠쓰면 안된다. 라는 것만 기억하자.
배열은 기본적으로 자동초기화 된다.
integer의 기본값은 0
'JAVA' 카테고리의 다른 글
배열의 활용(1)~(2) (0) | 2022.03.22 |
---|---|
배열의 출력 (0) | 2022.03.22 |
배열의 생성과 선언, 배열의 인덱스 (0) | 2022.03.21 |
break문, continue문, 이름붙은 반복문 (0) | 2022.03.20 |
while문, do-while문 (0) | 2022.03.20 |
댓글
이 글 공유하기
다른 글
-
배열의 활용(1)~(2)
배열의 활용(1)~(2)
2022.03.22 -
배열의 출력
배열의 출력
2022.03.22 -
배열의 생성과 선언, 배열의 인덱스
배열의 생성과 선언, 배열의 인덱스
2022.03.21 -
break문, continue문, 이름붙은 반복문
break문, continue문, 이름붙은 반복문
2022.03.20