배열(Array)이란?
이번달에 비가 온 날을 조사하기 위해서는 1~31일에 대한 변수를 선언해야 한다. 하지만 배열을 사용하면 단 하나의 변수만으로 데이터를 다룰 수 있다. 배열이란 동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미한다. 즉 각 값들이 같은 의미를 지니면서 서로 연관성이 있을 때 이들을 하나로 묶은 값들의 집합을 배열이라고 한다. 그림을 통해 조금 더 자세히 이해해보자.
위 그림은 메모리를 형상화 한 그림이다. 메모리는 여러 메모리셀들로 이루어져있고 각 메모리셀은 값을 저장할 수 있는 1바이트의 메모리 공간을 가지고 있다. 예를 들어 7월 한달동안 일별 최고 기온을 저장하는 경우를 살펴보자. 이 경우 각 변수는 개별적으로 double 타입으로 선언이 되어있고 메모리 공간상 여기저기 흩어져서 존재하게 될 것이다.
배열 기능을 사용하면 기존 각 변수를 지정해 저장된 데이터와는 달리 아래와 같이 값을 묶어 메모리 공간상에 물리적으로 값들을 모아 저장한다.
double[] temperatureOfJuly = {~~,~~,....}
위 그림에서 배열이 가진 각 값들을 배열의 요소라고 한다. 그리고 각 요소는 0에서부터 시작하는 번호를 부여받는데 이 순번을 인덱스 라고 한다. 즉 1~31일의 인덱스 번호는 0~30 이라고 볼 수 있다.
배열의 차원
배열의 차원이란 배열이 중첩된 정도를 의미한다. 즉, 배열의 요소가 또 다른 배열인 경우를 의미한다.
- 1차원 배열 예시 : {1, 2, 3, 4}
- 2차원 배열 예시 : {{1, 2}, {3, 4}}
1차원 배열
1차원 배열은 가장 일반적인 배열의 형태로 배열의 요소가 배열이 아닌 일반적인 배열을 의미한다. 1차원 배열을 선언할 때에는 다음과 같이 타입 뒤에 대괄호를 붙여서 선언하고 초기화 할 수 있다.
double[] temperatureOfJuly;
temperatureOfJuly = new double[31];
1. double[] temperatureOfJuly;
배열을 가리킬 참조 변수 temperatureOfJuly 를 선언한다.
2. temperatureOfJuly = new double[31];
총 31개의 double 형 값을 저장할 수 있는 배열을 생성하며 이때 배열의 모든 요소는 double 형의 기본값인 0.0이다. 대입연산자 (=) 에 의해 생성된 배열의 첫번째 요소의 주소값이 참조변수 temperatureOfJuly에 할당된다.
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 };
배열은 기본값인 0.0으로 초기화가 되어있으니 위의 코드를 작성하여 각 일별로 온도값을 배열의 값으로 입력해 줄 수 있다.
Index 값 접근하기
인덱스로 값에 접근할 수 있는 원리는 간단하다. 배열이 생성되고 나면 배열 첫 번째 요소의 주소값이 참조변수 temperatureOfJuly에 할당된다.그리고 배열의 각 요소는 0부터 시작하는 인덱스를 가진다. 배열_참조_변수_이름[인덱스]를 입력하면 아래와 같이 요소의 값을 읽어온다.
- temperatureOfJuly[0]
- temperatureOfJuly가 저장하고 있는 주소값 0x001a3d41 + 인덱스 0 * 요소의 크기 8byte = 0x001a3d41 → 27.4
- temperatureOfJuly[1]
- temperatureOfJuly가 저장하고 있는 주소값 0x001a3d41 + 인덱스 1 * 요소의 크기 8byte = 0x001a3d49 → 30.1
- temperatureOfJuly[2]
- temperatureOfJuly가 저장하고 있는 주소값 0x001a3d41 + 인덱스 2 * 요소의 크기 8byte = 0x001a3d51 → 31.1
- temperatureOfJuly[3]
- temperatureOfJuly가 저장하고 있는 주소값 0x001a3d41 + 인덱스 3 * 요소의 크기 8byte = 0x001a3d59 → 32.4
- temperatureOfJuly[30]
- temperatureOfJuly가 저장하고 있는 주소값 0x001a3d41 + 인덱스 30 * 요소의 크기 8byte = 0x001a3e31 → 31.8
배열의 길이
배열 요소의 개수를 배열의 길이 또는 크기라고 하며 배열_참조_변수_이름.length로 얻을 수 있다.
double[] temperatureOfJuly = new double[31];
System.out.println(temperatureOfJuly.length); // 31
2차원 배열
2차원 배열은 행과 열을 구분하여 초기화 하는 개념으로 이해하면 좋을 것 같다. 아래의 코드를 실행하면 내부 배열은 int형의 기본값인 0을 3개씩 저장, 외부배열은 내부배열을 31개를 저장하고 있다.
int[][] kcal;
kcal = new int[31][3];
{
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
...
{ 0, 0, 0 }
}
가변 배열
배열이 2차원 이상일 때 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 되며 이러한 배열을 가변 배열이라고 한다. 아래의 코드에서 외부배열은 크기를 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]
배열 탐색
반복문을 활용하여 배열을 탐색할 수 있으며, 기본적으로 인덱스와 배열의 크기를 활용하여 탐색한다. 배여ㅕㄹ의 각 요소들의 총합을 구하는 예제를 통해 어떻게 반복문을 사용하여 배열을 탐색할 수 있는지 살펴보자. 아래는 for와 while 문을 사용한 코드이다.
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
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
'공부 > 전자컴퓨터공학' 카테고리의 다른 글
필드(Field)와 메서드(Method) 자바 기초 배우기 (0) | 2024.05.26 |
---|---|
Java 클래스(Class) & 객체(Object) 자바 기초 배우 (0) | 2024.05.23 |
Java 제어문(Control Flow Statements) 조건문과 반복문 (2) | 2024.05.22 |
Java 연산자(Operator) 및 콘솔 입출력 Java 기초 배우기 (0) | 2024.05.09 |
Java 문자열(string) Java 기초 배우기 (1) | 2024.05.07 |