Programming Language/JAVA
배열의 길이
Glory-L
2023. 1. 21. 11:47
배열의 길이
배열 이름.length - 배열의 길이 (int형 상수)
int[] arr = new int[5]; // 길이가 5인 int 배열
int tmp = arr.length; // arr.length의 값은 5이고 tmp에 5가 저장된다.
" 배열은 한번 생성하면 실행 동안 그 길이를 바꿀 수 없다. "
의문점 1. 왜 배열은 길이를 못바꾸는지?
메모리에 int(4byte) * 5 = 20 byte 공간을 연속적으로 차지해야 한다.
만약 메모리가 아래 표와 같이 불규칙한 저장 상태라면
8byte | ||||
8byte | 10byte | |||
16byte | 12byte (arr) | 8byte (arr) | 여기까지는 확장 가능, 하지만, 이 이상의 공간이 필요하다면? |
|
20byte | ||||
1byte | 4byte |
연속적인 특징을 가진 배열의 크기가 늘어나면 공간을 연속적으로 더 써야 하는데 연속적인 공간이 남아 있다는 보장을 하지 않는다. 즉, 공간이 있을 수도 있고 없을 수도 있다.
그렇기 때문에 길이를 늘리는 방법이 아니라 확인해서 공간이 부족하다면 다른 곳으로 옮겨줘야 하는 방법이 정해져 있는 것이다.
의문점 2. 배열의 길이가 부족하면 어떻게 해야 하는지?
새로 배열을 선언하고 원래 남아있던 배열을 복사해서 옮기고 그 외의 저장 값을 추가한다.
* 원래 배열 값
1 | 2 | 3 | 4 |
* 새로운 배열 선언 후 5, 6 값을 추가
1 | 2 | 3 | 4 | 5 | 6 |
배열을 선언 하면 명시적으로 길이가 나오는데 굳이 length 메서드가 있는 이유는?
int[] score = new int[6]; // 배열의 길이는 명시적으로 보인다.
// 만약 배열의 모든 요소를 출력한다고 하자.
int[] score = new int[5]; // 배열 크기를 5로 변경하고
for (int i = 0; i < 6; i++) // 실수로 이 값을 6만큼 for문 돌린다면?
System.out.println(score[i]); // index out of range error가 발생한다.
// 이러한 실수를 방지하고자 length를 쓴다.
for (int i = 0; i < score.length; i++) // 조건식을 변경하지 않아도 길이만큼만 돈다.
System.out.println(score[i]);
배열의 초기화
배열의 각 요소에 처음으로 값을 저장 하는 것
int[] score = new int[5]; // 길이가 5인 int형 배열을 생성한다.
score[0] = 50; // 각 요소에 직접 값을 저장한다.
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;
// 반복문으로 처리
int[] score = new int[5];
for(int i=0; i < score.length; i++)
score[i] = i * 10 + 50;
// 반복문은 어떤 규칙을 만들어야해서 살짝 불편 -> 더 개선한 방법
int[] score = new int[] { 50, 60, 70, 80, 90} // 방법 1. 잘 안씀
int[] score = { 50, 60, 70, 80, 90 } // 방법2. 거의 대부분 이 방법을 쓴다.
// 주의할 점!
int[] score;
score = { 50, 60, 70, 80, 90 }; // 두 문장으로 나눠서 초기화 하면 에러 발생, new int[]를 생략 할 수 없다.
score = new int[]{ 50, 60, 70, 80, 90 }; // 올바른 표현식
[ 자바의 정석 - 기초 유튜브 강의 영상 참고 ]
https://www.youtube.com/watch?v=r9m2jvElcNc&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=41