배열
- 각 값들이 같은 타입을 가지는 경우 배열을 사용하면 여러 개의 변수를 선언하지 않고 단 하나의 변수만으로 값들을 저장하고 참조할 수 있음
배열이란?
-
배열
- 동일한 타입의 값들을 하나의 묶음으로 묶은 자료구조
-
메모리(RAM)
- 1 byte의 메모리 공간을 가지는 메모리셀들 여러 개로 이루어져 있음
- 각 메모리셀마다 16진수로 이루어진 메모리 주소가 지정되어 있음
-
각 변수는 개별적으로 선언된 변수
- 즉, 메모리 공간 상에 흩어져 개별적으로 존재함
-
배열을 사용하여 값을 저장
- 메모리 공간 상에 연속적으로 값들이 모여서 저장됨
-
요소(element)
-
인덱스(index)
배열의 차원이란?
1차원 배열
선언 및 초기화
- 1차원 배열
- 배열의 요소가 배열이 아닌 배열을 의미
- 선언할 때는 타입 뒤에 대괄호를 붙여서 선언
int[] nums;
nums = new int[10];
- int nums[]
- new int[10];
- 총 10개의 int형 값을 저장할 배열을 생성
- 배열의 모든 요소는 int형의 기본값인 0으로 초기화되어져 있음
- nums = new int[10];
- 대입 연산자(=)에 의해 생성된 배열 첫 번째 요소의 주소값이 참조 변수 nums에 할당됨
- 참조 변수 nums는 배열의 첫 번째 요소를 가리킴
-
nums는 왜 참조 변수여야 하는가?
- 자바에서 배열은 참조 타입에 해당함
- int[] 배열 선언 문법으로 선언한 nums는 선언 이후에 생성될 배열의 주소값을 담을 참조 변수가 됨
- 기본 타입의 경우, 기본 타입의 값을 저장할 변수를 선언하는 시점에 얼마만큼의 메모리 공간을 확보해야 하는지 컴퓨터가 알 수 있음
- 배열을 선언하는 시점에 배열이 몇 개의 요소를 가질지 컴퓨터는 알 수 없음
- 배열을 선언하면 이후에 생성될 배열의 주소값을 담을 메모리 공간만 확보됨
- 배열이 생성되고 난 후 해당 배열의 시작 주소값이 참조 변수에 할당됨
-
선언 및 초기화는 하나의 문장으로 작성 가능
int[] nums = new int[10];
값 접근하기
- 배열 내 특정 요소에 할당되어있는 값에 접근하려면 배열 참조 변수의 이름과 배열의 인덱스 활용
int[] nums = {1, 2, 3, ..., 10};
System.out.println(nums[0]);
System.out.println(nums[1]);
System.out.println(nums[2]);
...
System.out.println(nums[9]);
- 인덱스로 값에 어떻게 접근하는가?
- 배열이 생성되고 난 후에 참조 변수 nums에 배열 첫 번째 요소의 주소값이 할당됨
- 배열의 각 요소는 0부터 시작하는 인덱스를 가짐
- {배열 참조 변수 이름}[인덱스]를 입력하면 참조 변수가 가진 첫 번째 요소의 주소값에 '인덱스 * 요소의 크기'를 더하여 해당 주소에 있는 값을 읽어옴
배열의 길이
- 배열의 길이(크기)
- 배열이 가진 요소의 개수
- {배열 참조 변수 이름}.length로 얻을 수 있음
int[] nums = new int[10];
System.out.println(nums.length);
- 인덱스는 0부터 시작하므로 배열의 길이가 10이라면 배열 마지막 요소의 인덱스는 9
- 즉, 배열의 길이 - 1이 배열 마지막 요소의 인덱스
2차원 배열
선언 및 초기화
int[][] nums;
nums = new int[30][20];
int[][] nums = new int[30][20];
- 위 코드가 실행되면 아래와 같은 2차원 배열이 만들어짐
{
{0, 0, 0, ..., 0, 0},
{0, 0, 0, ..., 0, 0},
{0, 0, 0, ..., 0, 0},
...
{0, 0, 0, ..., 0, 0}
}
- 2차원 배열의 내부 배열은 int형의 기본값인 0을 20개씩 저장하고 있음
- 외부 배열은 내부 배열을 30개 저장하고 있음
- 내부 배열은 20개의 0을 요소로 가지지만, 외부 배열의 각 요소는 내부 배열의 주소값들을 저장하고 있음
int[][] nums = new int[][] {
{24, 231, 432, 443, ..., 123},
{235, 35, 433, 431, ..., 432},
{125, 352, 930, 892, ..., 293},
...
{182, 987, 765, 789, ..., 603}
}
가변 배열
가변 배열
- 다차원 배열에서 1차원보다 자유로운 형태로 배열을 만들 수 있음
- 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 된다
선언 및 초기화
int[][] nums = new int[5][];
- 외부 배열 크기는 5로 지정했으나, 마지막 차수에 해당하는 내부 배열에는 크기를 지정하지 않음
- 마지막 차수에 해당하는 배열의 크기를 지정하지 않으면 가변 배열이 생성됨
- 이 때 생성된 것은 내부 배열의 크기를 자유롭게 지정할 수 있는 외부 배열
- 내부 배열을 생성하려면 new int[]를 사용하여 외부 배열의 각 요소에 할당해줌
int[][] nums = new int[3][];
nums[0] = new int[3];
nums[1] = new int[2];
nums[2] = new int[5];
int[][] nums = {
{ 30, 32, 39 },
{ 12, 51 },
{ 96, 124, 90, 103, 138 }
};
배열 탐색
- 인덱스와 배열의 크기(length)를 이용해 탐색
- 문자열을 반복문으로 순회하고 탐색했던 방법과 비슷한 방법으로 배열을 순회
반복문을 통한 배열 탐색
int[] nums = {105, 293, 223, 100, 29};
int[] nums = {105, 293, 223, 100, 29};
int total = 0;
for(int idx = 0; idx < nums.length; idx++) {
total += nums[idx];
}
System.out.println(total);
int[] nums = {105, 293, 223, 100, 29};
int total = 0;
int index = 0;
while (i < nums.length) {
total += nums[index++];
}
System.out.println(sum);
int[] nums = {105, 293, 223, 100, 29};
int total = 0;
for(int num : nums) {
total += num;
}
System.out.println(total);
- 향상된 for문을 사용할 때에는
- 향상된 for문을 통해 배열을 순회하는 것은 배열의 값을 읽어오는 것만 가능