배열이란?
배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 말한다.
- 배열은 프로그래밍에서 자주 사용되는 자료형이다.
- 같은 타입의 여러 변수를 묶어 저장함으로 데이터를 구조적으로 다루는데 도움이 된다.
배열의 선언과 초기화
// 자료형[] 배열명 = new 자료형[크기];
int arr[] = new int[4]; //배열의 선언과 생성을 동시에
- 인덱스(index) : 저장 공간에 연속적으로 번호를 부여, 배열에서의 위치를 의미하는 숫자.
- 인덱스의 범위는 0부터 ‘배열의 길이 – 1’까지
- 요소(element) : 배열을 구성하는 각각의 값을 의미, 자료형은 배열의 요소에 저장되는 변수의 타입을 의미
변수는 선언 시 저장 공간이 만들어지지만 배열은 선언시 저장공간이 만들어 지는 것이 아니라 배열을 다루기 위한 참조변수가 만들어 진다.
- 따라서 배열을 사용하기 위해서는 우선 선언이 필요하다. 그 다음 생성을 해야 실제 저장공간이 만들어진다.
배열을 다루기 위해서는 참조변수가 필요한데 배열 선언시 사용된 배열명으로 저장 공간을 사용하는 것은 변수와 동일하지만 배열은 각 저장 공간이 연속적으로 붙어있기 때문에 저장 공간에 일일히 이름을 부여할 필요 없이 참조 변수의 이름과 인덱스 번호를 이용하여 배열의 저장 공간을 다룬다.
배열의 선언
변수를 선언하는데 두가지 방법이 있는데 하나는 자바에서 주로 사용하는 방법으로 배열 기호가 타입의 일부라고 보기 때문에 자바에서 주로 사용된다.
int[] arr // 정수형 배열
타입[] 변수이름;
- 나머지 하나는 C언어의 문법과 유사한 방법이 있다.
int arr[]; // int 타입의 배열을 다루기 위한 참조변수 arr선언
타입 변수이름[];
배열의 생성
배열을 생성을 생성한다는 것은 배열에 실제 메모리 상의 공간을 생성하여 할당하는 것이다.
arr = new int[5] // int타입의 값 5개를 저장할 수 있는 배열 생성
변수이름 = new 타입[길이];
- 저장 공간에 참조변수[인덱스 번호]와 같이 각 요소에 이름이 자동으로 부여되고 생성한 배열의 주소를 대입 연산자를 통해 참조변수에 저장한다.
배열의 선언과 생성을 한문장으로 동시에 할 수 있다.
int[] arr = new int[5]
부여된 이름을 사용하여 일반적인 변수와 같이 사용할 수 있다.
int value = arr[3];
배열의 길이는 배열이름.length를 사용하여 구할 수 있다.
int[] score = new int[5] // int타입의 값 5개를 저장할 수 있는 배열 생성
// 배열이름.length를 활용하여 배열의 모든 요소를 출력
// 배열의 길이가 달라지더라도 조건식을 변경하지 않아도 된다.
for(int i = 0; i < score.length ; i++)
System.out.println(score[i]);
배열은 한번 생성하면 실행하는 동안 길이를 바꿀 수 없어 최초 선언한 값으로 길이가 고정된다.
배열은 연속된 메모리 공간을 필요하기 때문에 메모리 공간상 연속된 빈 공간을 찾아야 한다. 하지만 해당 공간이 비어있는지 확인되지 않고 만약 비어있지 않을 수 있기 때문에 배열의 길이를 바꿀 수 없다.
int[] score = new int[5] // int(4byte)크기의 5개의 연속된 공간이 필요 (20byte)
배열의 복사
길이를 바꿀 수 없다는 배열의 특성 상 만약 더 큰 공간을 필요로 한다면 새로운 배열을 생성하고 기존의 배열의 내용을 복사하여 저장해야 한다.
- 더 큰 공간을 가진 배열을 새로 만들고 기존의 배열의 내용을 새로 만든 배열에 복사하는 방법으로 저장하여 확장 해야한다.
- 이러한 작업을 추가로 하는 것은 바람직하지 못하다. 처음부터 배열의 길이름 적절히 잡는것이 바람직한 방법이다.
반복문 for 을 사용한 복사
int[] arr = {1, 2, 3, 4, 5};
int[] arr1 = new int[arr1.length * 2]; // 기존 배열보다 길이가긴 새로운 배열을 생성
// 반복문을 사용하여 복사
for(int i = 0 ; i < arr.length ; i++) { // arr1의 길이만큼 반복문 실행
arr1[i] = arr[i]; // 기존 arr배열의 요소의 값을 새로운 arr1배열에 저장한다.
}
arr = arr1;
// 기존의 배열의 주소를 가진 참조변수 arr에 복사가 완료된 arr1에 저장된 배열의 주소를 저장.
- 배열은 참조 변수를 통해서만 접근이 가능하기 때문에 참조 변수가 없는 배열은 jvm의 가비지 컬렉터에 의해 제거된다.(기존의 arr에 저장된 [1, 2, 3, 4, 5] 배열은 제거된다.)
Arrays.copyOf() 메서드나 System.arraycopy()메서드를 사용한 복사
- Arrays.copyOf
int[] arr = {1, 2, 3, 4, 5};
int[] arr1 = new int[arr1.length * 2]; // 기존 배열보다 길이가 긴 새로운 배열을 생성
arr1 = Arrays.copyOf(arr, arr.length); //Arrays.copyOf(복사할 배열, 복사할 요소의 개수)
// arr 배열을 배열의 첫 요소부터 arr의 길이만큼의 요소를 복사한뒤 배열을 생성하여 arr1에 저장한다.
//Arrays.copyOfRange(복사할 배열, 시작 요소 위치, 끝나는 요소 위치)를 사용하면 원하는 범위의 요소를 복사할 수 있다.
//범위를 넘어간다면 기본 값으로 채운다
- System.arraycopy()
int[] arr = {1, 2, 3, 4, 5};
int[] arr1 = new int[arr1.length * 2]; // 기존 배열보다 길이가 긴 새로운 배열을 생성
System.arraycopy(arr, 0, arr1, 0, arr.length);
// System.arraycopy(복사할 배열, 복사 시작 요소 위치, 저장할 배열, 복사된 요소가 저장 시작 위치, 복사할 요소 개수);
- 배열의 크기는 기존 배열의 2배가 바람직하며 크게 잡으면 메모리 낭비가 발생할 수 있다.
배열의 비교
- 배열을 비교하기 위해 자바는 Arrays.equals() 메소드를 제공한다.
int[] arr = {1, 2, 3, 4, 5};
int[] arr1 = {1, 2, 3, 4, 6};
System.out.println(Arrays.equals(arr, arr1)); //다르기 때문에 false가 출력된다.
배열의 정렬
- 배열을 정렬하기 위해 자바는 Arrays.sort() 메서드를 제공한다.
int[] arr = {1, 2, 3, 5, 4};
Arrays.sort(arr) // arr 배열을 오른 차순으로 정렬시킨다.
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]
배열의 초기화
배열의 각 요소에 처음으로 값을 저장하는 것을 말하며 배열은 초기화 하지 않으면 기본값으로 자동 초기화가 된다.
- 기본타입의 배열은 각 배열의 요소가 기본값을 가지고 있지만 참조타입의 배열은 기본 값이 null이다.
자료형 | 기본값 |
boolean | false |
char | ‘\u0000’ |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d / 0.0 |
참조형 | null |
int[] score = new int[5] // int타입의 값 5개를 저장할 수 있는 배열 생성
score[1] = 3;
System.out.println(score[0]); //0이 출력, int는 초기 값이 0이기 때문이다.
System.out.println(score[1]); //1이 출력된다.
배열의 초기화 방법
int[] score = new int[] {1,2,3,4,5}; // 배열의 선언과 생성 및 초기화를 동시에
int[] score = {1,2,3,4,5}; // new int[]는 생략이 가능하다. (주로 사용된다.)
int[] score; // 선언
score = {1,3,5,7,9}; // new int[]를 생략하여 나누어 작성 시 에러가 발생
score = new int[] {1,3,5,7,9}; // new int[]를 추기하면 에러가 발생하지 않는다.
배열의 출력
배열의 내용을 출력해 확인해 보고자 System.out.println()을 사용하여 참조변수를 출력해 보면 의도와는 다른 값이 나온다.
- 이 값은 배열이 저장되어 있는 메모리의 주소를 뜻한다.
int[] arr = {1,2,3,4,5};
System.out.println(arr); // [I@1ee0005
// [ : 배열을 의미
// i : int(자료형)을 의미
// @1ee0005 : 주소
- 실제 값을 출력하려면 for문을 이용해 각 요소들을 하나씩 출력해 주거나 Arrays.toString()메서드를 사용하여 배열을 문자열 형식으로 만들어 출력해야 한다.
int[] arr = {1,2,3,4,5};
// 반복문 for문을 이용해 각 요소들을 하나씩 출력시
// 1
// 2
// 3
// 4
// 5
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// Arrays.toString() 메서드를 사용하여 문자열 형식으로 출력
// [1, 2, 3, 4, 5]
System.out.println(Arrays.toString(arr));
- char(문자)형 배열은 예외적으로 print와 println을 사용하여 배열에 저장된 모든 문자를 출력할 수 있다.
char[] arr1 = {'1','2','3','4','5'};
System.out.println(arr1);
2차원 배열
- 2차원 배열은 테이블 형태의 데이터를 저장하기 위한 배열이다.
국어 | 수학 | 영어 | |
1 | 100 | 100 | 100 |
2 | 20 | 100 | 95 |
3 | 50 | 80 | 90 |
4 | 80 | 60 | 100 |
- 배열의 요소로 또 다른 1차원 배열을 가지는 배열을 의미 하며 1차원 배열의 배열로 불린다. 1차원 배열 여러개의 참조변수를 또다른 배열로 묶은 것이다.
- 2차원 이상의 배열을 의미하는 다차원 배열은 2차원 배열은 요소로 1차원 배열을 가지는 배열, 3차원 배열은 요소로 2차원 배열을, 4차원 배열은 요소로 4차원 배열을 가지는 것 처럼 기존 차원을 요소로 가지는 배열을 의미한다.
2차원 배열 생성
- 기존의 1차원 배열에 대괄호를 한번 더 추가하여 생성할 수 있다.
// 자료형 [][] arr = new 자료형[행][열]
int [][] arr = new int[4][3] // 4행 3열의 2차원 배열 arr을 생성
- 첫 대괄호 : 행의 길이
- 두번쨰 대괄호 : 열의 길이
2차원 배열의 초기화
int [][] arr = new int[][]{ {1, 2, 3}, {4, 5, 6} };
int[][] arr = { //new int[][]를 생략하여 작성, 직관적으로 작성
// 생성과 초기화를 동시에
{1, 2, 3},
{4, 5, 6, 8} // 길이가 다를 수 있다. 이름 '가변 배열'이라 부른다
}
2차원 배열의 출력
- 2차원 배열의 실제 값을 출력하려면 1차원 배열과 마찬가지로 for문을 이용해 각 요소들을 하나씩 출력해 주거나 Arrays.deeptoString()메서드를 사용하여 배열을 문자열 형식으로 만들어 출력해야 한다.
int[][] arr = {
{1, 2, 3},
{4, 5, 6, 8}
};
for(int i = 0; i < arr.length; i++) { 행의 요소들 전체
for(int j = 0; j < arr[i].length; j++) {각 행의 요소(열)을 하나씩 출력
System.out.print(arr[i][j]);
}
System.out.println();
}
//123
//4568
// Arrays.deepToString() 메서드를 사용하여 문자열 형식으로 출력
// [[1, 2, 3], [4, 5, 6, 8]]
System.out.println(Arrays.toString(arr));
2차원 배열의 비교
2차원 배열을 비교하기 위해 자바는 Arrays.deepEquals() 메소드를 제공한다.
int[][] arr = {
{1, 2},
{3, 4, 5}
};
int[][] arr1 = {
{1, 2},
{3, 4, 6}
};
System.out.println(Arrays.deepEquals(arr, arr1)); //다르기 때문에 false가 출력된다.
'Java' 카테고리의 다른 글
[JAVA] 추상 클래스(Abstract class) (0) | 2023.09.02 |
---|---|
[JAVA]객체 지향 프로그래밍(Object Oriented Programming) (0) | 2023.08.30 |
[JAVA] 조건문과 반복문 (0) | 2023.08.13 |
[JAVA] 연산자(operator) (0) | 2023.08.05 |
[JAVA] 형변환(casting) (0) | 2023.08.05 |