코드스테이츠

[코드스테이츠 BE 45기] <Section1> Week2 (Java 기초4)

codingbug 2023. 4. 21. 00:58

배열

동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조

값들이 같은 의미를 지니면서 서로 연관성이 있을 때, 이들을 하나의 덩어리로 묶을 수 있으며, 이렇게 묶인 값들의 집합

  • 인덱스: 배열의 각 요소는 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[]를 사용하여 외부 배열의 각 요소에 할당해 주면 됨