[Java] 배열

Nakjoo·2022년 12월 26일
0

[SEB_BE_43]

목록 보기
7/29

배열이란, 동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미한다. 즉, 값들이 같은 의미를 지니면서 서로 연관성이 있을 때, 이들을 하나의 덩어리로 묶을 수 있으며, 이렇게 묶여진 값들의 집합을 배열이라고 한다.

배열은 아래와 같이 값을 넣어줄 수 있다.

double[] temperatureOfJuly = {27.4, 30.1, ..., 31.8};

배열을 선언할 때는 대괄호([])를 사용해 선언하고 중괄호({})를 사용해 값들을 묶을 수 있다.
여기서 배열이 가진 각 값들을 배열의 요소(element)라고 한다. 그리고, 배열의 각 요소는 0에서부터 시작하는 번호를 부여받는데, 이처럼 배열의 각 요소가 부여받는 순번을 인덱스(index)라고 한다.

1. 1차원 배열

1.1. 1차원 배열의 선언과 초기화

1차원 배열은 가장 일반적인 배열의 형태로, 배열의 요소가 아닌 배열을 의미한다.

double[] temperatureOfJuly;
temperatureOfJuly = new double[31];

참고로, 선언과 초기화는 아래와 같이 하나의 문장으로도 작성할 수 있다.

double[] temperatureOfJuly = new double[31];

1.2. 값 접근하기

이제 배열의 값에 접근하는 방법을 알아보겠다.

배열 내 특정 요소에 할당되어져 있는 값에 접근하려면 배열 찹조 변수의 이름과 배열의 인덱스를 활요하면 된다. 즉, 배열_참조_변수_이름[인덱스]로 배열의 요소에 접근할 수 있다.

예를 들어 아래와 같이 배열을 선언한 경우,

double[] temperatureOfJuly = { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };

인덱스는 0부터 시작하므로,
temperatureOfJuly[0]의 값은 27.4가 되고, temperatureOfJuly[1]의 값은 30.1, temperatureOfJuly[2]의 값은 31.1, temperatureOfJuly[3]의 값은 32.4, temperatureOfJuly[30]의 값은 31.8이 되게 된다.

1.3. 배열의 길이

배열이 가진 요소의 개수를 배열의 길이 또는 크기라고 한다. 배열의 길이는 배열_참조_변수_이름.length로 얻을 수 있다.

double[] temperatureOfJuly = new double[31];
System.out.println(temperatureOfJuly.length); // 31

배열의 길이가 31이라면 배열 마지막 요소의 인덱스는 30이 된다. 즉, 배열의 길이 - 1이 배열 마지막 요소의 인덱스가 된다.

2. 2차원 배열

2차원 배열은 배열의 각 요소가 또 다른 배열인 구조일 뿐, 1차원 배열과 크게 다른 점은 없다.

2.1. 2차원 배열의 선언과 초기화

2차원 배열을 선언하고 초기화하는 방법은 1차원 배열과 유사하다.

int[][] kcal;
kcal = new int[31][3];

위 코드는 1차원 배열에서와 마찬가지로 한 줄로 줄여서 작성 가능하다.

int[][] kcal = new int[31][3];

이 2차원 배열의 내부 배열은 int형의 기본값인 0을 3개씩 저장하고 있으며, 외부 배열은 내부 배열({0, 0, 0}) 31개를 저장하고 있다.

엄밀히 말하면, 내부 배열은 3개의 0을 요소로 가지지만, 외부 배열의 각 요소는 내부 배열의 주소값을 저장하고 있다.

{
	{ 0, 0, 0 },
	{ 0, 0, 0 },
	{ 0, 0, 0 },

	...

	{ 0, 0, 0 }
}

3. 가변 배열

2차원 이상의 다차원 배열에서는 1차원보다는 자유로운 형태로 배열을 만들 수 있다. 즉, 배열이 2차원 이상일 때, 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 되며, 이러한 배열을 가변 배열이라고 한다.

가변 배열을 선언하고 초기화 하는 방법은 다음과 같다.

int[][] ages = new int[5][];

위 예제의 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[]를 사용하여 외부 배열의 각 요소에 할당해주면 된다.

int[][] ages = new int[5][];

ages[0] = new int[5];
ages[1] = new int[6];
ages[2] = new int[7];
ages[3] = new int[8];  
ages[4] = new int[9];

System.out.println("Arrays.toString(ages[0]) = " + Arrays.toString(ages[0]));
System.out.println("Arrays.toString(ages[1]) = " + Arrays.toString(ages[1]));
System.out.println("Arrays.toString(ages[2]) = " + Arrays.toString(ages[2]));
System.out.println("Arrays.toString(ages[3]) = " + Arrays.toString(ages[3]));
System.out.println("Arrays.toString(ages[4]) = " + Arrays.toString(ages[4]));

// 결과
// Arrays.toString(ages[0]) = [0, 0, 0, 0, 0]
// Arrays.toString(ages[1]) = [0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[2]) = [0, 0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[3]) = [0, 0, 0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[4]) = [0, 0, 0, 0, 0, 0, 0, 0, 0]

4. 배열 탐색

앞서 배운 반복문을 활용하여 배열을 탐색할 수 있으며, 기본적으로 인덱스와 배열의 크기(length)를 활용하여 탐색한다는 점에서 문자열 탐색과 비슷하다.

4.1. for문

일반적인 for문으로 배열을 순회하여 총합을 구하는 코드는 다음과 같다.

int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;

for (int i = 0; i < scores.length; i++) {
	sum += scores[i];
}
System.out.println(sum); // 470

4.2. while문

while문을 통한 배열 순회는 다음과 같이 할 수 있다.

int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;
int i = 0;

while (i < scores.length) {
	sum += scores[i++];
}
System.out.println(sum); // 470

4.3. Enhanced for문

향상된 for문(Enhanced for문)으로도 배열의 각 요소에 접근할 수 있다.

int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;

for (int score: scores) {
	sum += score;
}
System.out.println(sum); // 470

향상된 for문을 사용할 때 주의해야 할 사항이 있습니다. 향상된 for문을 통해 배열을 순회하는 것은 배열의 값을 읽어오는 것만 가능합니다. 즉, 향상된 for문으로 배열을 순회하면서 배열의 값을 수정할 수는 없습니다.

int[] scores = { 100, 90, 85, 95, 100 };

// 일반적인 for문 및 while문을 사용하면 배열 요소의 값을 바꿀 수 있습니다. 
for (int i = 0; i < scores.length; i++) {
	scores[i] = 0;
}
System.out.println("for문 사용      : " + Arrays.toString(scores));

int j = 0;
while (j < scores.length) {
	scores[j++] = 1;
}
System.out.println("while문 사용    : " + Arrays.toString(scores)); 

// 향상된 for문을 사용하면 배열 요소의 값을 바꿀 수 없습니다. 
for (int score: scores) {
	score = 2;
}
System.out.println("향상된 for문 사용 : " + Arrays.toString(scores));

/*
실행 결과

for문 사용      : [0, 0, 0, 0, 0]
while문 사용    : [1, 1, 1, 1, 1]
향상된 for문 사용 : [1, 1, 1, 1, 1]
*/

0개의 댓글