[코드스테이츠 BE 45기] <Section1> Week2 (Java 기초4)
배열
동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조
값들이 같은 의미를 지니면서 서로 연관성이 있을 때, 이들을 하나의 덩어리로 묶을 수 있으며, 이렇게 묶인 값들의 집합
- 인덱스: 배열의 각 요소는 0에서부터 시작하는 번호를 부여받는데, 이처럼 배열의 각 요소가 부여받는 순번
예) 배열의 맨 첫 번째 요소의 인덱스는 0이며, 두 번째 인덱스는 1, 마지막 요소인 31번째 요소의 인덱스는 30
// 7월 한 달 동안의 일별 최고 기온을 저장할 때 → 7월은 총 31일 → 총 31개의 변수가 필요
double temperatureOfJuly1 = 28.1;
double temperatureOfJuly2 = 30.2;
...
double temperatureOfJuly31 = 32.3;
// 7월 한 달 동안의 일별 강수 여부를 저장할 때 → 7월은 총 31일 → 총 31개의 변수가 필요
boolean isRainyJuly1 = true;
boolean isRainyJuly2 = false;
...
boolean isRainyJuly31 = false;
double[] temperatureOfJuly = { 27.4, 30.1, ..., 31.8 };
• 배열에 값을 저장하면 아래 그림과 같이 값들이 서로 모여서 저장됨
• 중괄호({})를 통해 값들을 묶을 수 있음
1 배열의 차원
1차원 배열
배열이 중첩이 없는 경우 = 배열의 요소가 배열이 아닌 경우
예 : { 1, 2, 3, 4 } → 배열의 각 요소는 1, 2, 3, 4로 모두 정수형의 값
- 1차원 배열의 선언과 초기화
1차원 배열을 선언할 때에는 타입 뒤에 대괄호를 붙여서 선언하고 초기화할 수 있음
double[] temperatureOfJuly;
temperatureOfJuly = new double[31];
위 예제가 실행될 때 이루어질 동작
1 double[] temperatureOfJuly;
: 배열을 가리킬 참조 변수 temperatureOfJuly를 선언
2 new double[31];
: 총 31개의 double형 값을 저장할 수 있는 배열이 생성됨
이때, 배열의 모든 요소는 `double`형의 기본값인 0.0으로 초기화되어 있음
3 temperatureOfJuly = new double[31];
: 대입 연산자(=)에 의해 생성된 배열 첫 번째 요소의 주소값 이 참조 변수 temperatureOfJuly에 할당됨
이제 참조 변수 `temperatureOfJuly`는 배열의 맨 첫 번째 요소를 가리키게 됨 (`double[]`이라는 배열 선언 문법으로 선언한 `temperatureOfJuly`는 선언 이후에 생성될 배열의 주소값을 담을 참조 변수가 됨)
하나의 문장으로 작성할 수도 있는 선언과 초기화!
double[] temperatureOfJuly = new double[31];
*변수를 선언한다: 어떤 값을 저장할 메모리 공간을 확보하고, 해당 메모리 공간에 이름을 붙이는 것
기본타입(int형, double형)
변수 이름 앞에 타입이 붙어 있으며, 각 타입 별로 크기가 정해져 있기 때문에 기본 타입의 값을 저장할 변수를 선언하는 시점에 얼마만큼의 메모리 공간을 확보해야 하는지 컴퓨터가 알 수 있음
double temperature;
// 컴퓨터 : 'double형이니 8byte의 메모리를 확보하면 되겠군.'
참조타입
배열을 선언하면, 이후에 생성될 배열의 주소값을 담을 메모리 공간만이 확보됨
이후 배열이 생성되고 난 다음에 해당 배열의 시작 주소값이 참조 변수에 할당됨
double[] temperatureOfJuly;
// 컴퓨터 : '타입에 []가 붙었으니 배열 참조 변수군. 배열의 요소가 몇 개일지 모르니 어딘가에 배열을
// 먼저 생성한 다음, 생성된 배열의 시작 주소를 temperatureOfJuly에 메모해두자'
double형의 기본값인 0.0으로 초기화하지 않고 27.4, 30.1와 같은 실제 값을 넣어서 초기화하는 방법
double[] temperatureOfJuly = new double[] { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };
// 선언과 초기화를 하나의 문장으로 할 때에 한해 new double[]을 생략할 수 있습니다.
double[] temperatureOfJuly = { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };
코드가 실행되면
1 참조 변수 temperatureOfJuly가 선언됨
2 배열이 생성되고 중괄호({}) 내의 값으로 배열 요소들의 값이 초기화됨
3 생성된 배열의 첫 번째 요소의 주소값이 참조 변수 emperatureOfJuly에 할당됨
- 값 접근하기
배열에 넣은 값을 사용하기
배열 내 특정 요소에 할당되어 있는 값에 접근하려면 배열 참조 변수의 이름과 배열의 인덱스를 활용 → 배열_참조_변수_이름[인덱스]로 배열의 요소에 접근할 수 있음
double[] temperatureOfJuly = { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };
첫 번째 요소는 temperatureOfJuly[0]으로 접근, 값은 27.4
두 번째 요소는 temperatureOfJuly[1]로 접근, 값은 30.1
세 번째 요소는 temperatureOfJuly[2]로 접근, 값은 31.1
네 번째 요소는 temperatureOfJuly[3]으로 접근, 값은 32.4
마지막 요소는 temperatureOfJuly[30]으로 접근, 값은 31.8
- 배열의 길이
배열이 가진 요소의 개수
배열_참조_변수_이름.length 예) arr.length
double[] temperatureOfJuly = new double[31];
System.out.println(temperatureOfJuly.length); // 31
인덱스는 0부터 시작하므로, 배열의 길이가 31이라면 배열 마지막 요소의 인덱스는 30이 됨
→ “배열의 길이 - 1” 이 배열 마지막 요소의 인덱스가 됨
2차원 배열
배열이 한번 중첩된 경우 = 배열의 요소가 배열인 경우
예 : { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } } → 배열의 각 요소로 배열이 들어가 있음
// 7월 한 달 섭취하는 하루 세끼의 열량을 측정하고 기록해서 2차원 배열에 저장하여 평균, 총합 등 통계를 내자
int[][] kcal;
kcal = new int[31][3];
//한줄로 줄여서 작성 가능
int[][] kcal = new int[31][3];
2차원 배열의 내부 배열은 int형의 기본값인 0을 3개씩 저장하고 있으며, 외부 배열은 내부 배열({ 0, 0, 0 }) 31개를 저장하고 있음
{
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
...
{ 0, 0, 0 }
}
//값을 넣어 초기화를 하는 경우
int[][] kcal = new int[][] {
{ 1982, 2098, 2130 },
{ 2242, 2431, 2198 },
{ 2365, 1997, 1932 },
...
{ 2278, 2391, 2006 }
};
// 선언과 초기화를 하나의 문장으로 할 때에 한해 new int[][]를 생략할 수 있습니다.
int[][] kcal = {
{ 1982, 2098, 2130 },
{ 2242, 2431, 2198 },
{ 2365, 1997, 1932 },
...
{ 2278, 2391, 2006 }
};
가변 배열
배열이 2차원 이상일 때, 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 됨
//가변 배열의 선언과 초기화
int[][] ages = new int[5][];
외부 배열은 크기를 5로 지정했으나, 마지막 차수에 해당하는 내부 배열에는 크기를 지정하지 않음
→ 마지막 차수에 해당하는 배열의 크기를 지정하지 않으면 가변 배열이 생성됨
이때 생성된 것은 내부 배열의 크기를 자유롭게 지정할 수 있는 외부 배열 즉, 외부 배열만 생성된 상태
int[][] ages = new int[5][];
System.out.println("Arrays.toString(ages) = " + Arrays.toString(ages));
// 결과
// Arrays.toString(ages) = [null, null, null, null, null]
내부 배열을 생성하려면 new int[]를 사용하여 외부 배열의 각 요소에 할당해 주면 됨