[배열의 개념]
'배열이란 동일한 타입의 자료형끼리만 사용이 가능하고 순차적인 자료 구조를 띄고 있다.
변수는 어떠한 값을 저장해서 사용하는 게 전부이지만, 배열은 인덱스연산자[]를 통해 보다 빠른 참조가 가능한 자료형이다.
그리하여 배열은 같은 타입의 값들을 배열이라는 곳에 모아 데이터를 구조적으로 다루는데 도와준다.
배열을 구성하는 각 값들은 요소(element)라고 하며, 해당 요소의 위치를 인덱스(index)라고 한다.
배열에는 1차원 배열과 2차원 배열 2가지가 존재한다.
[배열의 선언 & 초기화]
배열은 처음에 선언해줄때 꼭 배열의 크기를 정해주어야 한다.
int[] num = new int[5]; // 기본 초기화 방법
int[] num = {1,2,3,4,5}; // num이라는 객체를 선언과 동시에 초기화
int[] num = new int[] {1,2,3,4,5); // 선언후 배열을 생성
이처럼 배열을 초기화 해주는 방법은 3가지가 존재한다.
자료형 참조변수 = new 자료형[배열의 크기 지정]; 으로 이루어진다.
자료형 = char, byte, int, float, double, long 등
참조변수 = 객체의 주소를 가리키는 변수
new = 필드의 값들이 임의의 메모리에 저장시킨다.
자료형 [배열의 크기] = 해당 자료형에 지정한 배열의 크기로 초기화시킨다.
배열을 선언할 때 주의사항은 다음과 같다.
- 선언한 자료형 배열에 다른 자료형의 값을 할당하면 안 된다.
- 지정한 배열의 크기가 넘는 값을 할당하면 오류가 발생한다.
- 배열의 인덱스는 1이 아닌 0부터 시작하므로 범위를 초과하지 않도록 주의해야 한다.
- 배열의 크기는 생성과 동시에 결정되며, 중간에 크기를 변경할 수 없다.
int[] num = {1,2,3,4,5};
num[10] = 10; // 배열의 10번째 인덱스는 없으므로 오류 발생
int[] num = new int[] {1,2,3,4,5);
System.out.println(num[10]); // num 배열의 범위를 넘어가므로 오류 발생
[배열의 출력]
만약 내가 만든 배열의 값들을 보고 싶을 때 일반 변수를 호출할 때와는 다르다.
처럼 배열의 값이 아닌 이상한 값이 나오는 것을 확인할 수 있다.
사실 이 값은 메모리에 있는 배열의 주소값을 가리키는 것이다.
따라서 해당 값들을 for문으로 배열의 각 인덱스를 돌면서 출력시켜 주거나
자바의 내부에 존재하는 Arrays.toString()이라는 메서드를 이용하여 출력할 수 있다.
결괏값을 보면 알 수 있듯이 배열의 값이 순차적으로 나오는 것을 확인할 수 있다.
※ 다만 char타입의 배열은 예외로 println() 메서드로 바로 호출이 가능하다.
[배열의 정렬]
배열에 존재하는 값들을 오름차순으로 정렬하고 싶다면 for문을 이용하고 if문을 통해 인덱스에 존재하는 값들을 비교하면서 정렬해도 되지만 메서드를 사용하는 것보다 비효율적이다.
배열을 정렬하는 방법은 정말 간단하다.
int num = {20, 15, 30, 24, 80};
int result = Arrays.sort(num);
System.out.println("result : " + result);
일 때 자바의 내부 메서드인 Arrys.sort(정렬할 변수); 를 해주면 된다.
결괏값은 result : 15, 20, 24, 30, 80 가 나오게 된다.
[배열의 복사]
배열은 한번 초기화하고 나면 크기를 변경할 수 없다고 했었다.
만약 배열의 공간이 부족해진다면 어떻게 해야 할까?
해결방법은 기존에 존재하던 배열보다 더 큰 배열을 생성하고 새로운 배열을 생성하여 기존에 있던 배열을 복사하면 된다.
하지만 이런 과정은 귀찮기도 하고 코드가 더 복잡해 보일 수 있기 때문에 처음부터 배열의 크기를 넉넉하게 만들고
사용하는 것이 베스트다.
배열을 복사하는 방법은 다음과 같다.
1) for문으로 하나씩 할당
import java.util.Arrays;
class Example{
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = new int[arr1.length * 2]; // 초기배열의 2배 큰 배열 생성
// for문을 이용하여 인덱스 하나씩 할당
for(int i = 0 ; i < arr1.length ; i++) { // arr1의 길이만큼 반복문 실행
arr2[i] = arr1[i]; // arr1배열의 원소값을 순회하며 arr2배열에 저장
}
arr1 = arr2; // 원래의 배열을 가리키고있던 참조변수 arr1이 새로 복사된 arr2 배열을 가리키도록 한다.
}
}
2) Arrays.copyOf() 메서드 사용
import java.util.Arrays;
class Example{
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = new int[arr1.length * 2]; // 초기배열의 2배 큰 배열 생성
// arr1의 index의 0부터 arr1.length 전체 길이 만큼을 arr2의 0번째 인덱스부터 붙여넣는다.
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
arr1 = arr2; // 원래의 배열을 가리키고있던 참조변수 arr1이 새로 복사된 arr2 배열을 가리키도록 한다.
}
}
[배열값 비교]
만약 다른 배열끼리 같은 값을 가지고 있는지 궁금하다면 어떻게 해야 할까?
바로 equals()라는 메서드를 이용하면 된다.
equals() 메서드는 보통 String 자료형일 때 문자열에 내가 원하는 값이 존재하는지 확인할 때 많이 사용된다.
사용 방법은 아래와 같다.
import java.util.*;
public class Example {
public static void main(String[] args) {
int[] a = {50, 6, 10, 20, 45};
int[] b = {50, 6, 10, 20, 45};
if (Arrays.equals(a, b)) {
System.out.println("a 배열과 b 배열의 값이 동일합니다.");
}else {
System.out.println("a 배열과 b 배열의 값이 일치하지 않습니다.");
}
}
}
Arryas.equals(비교할 배열)을 넣어주면 된다.
[2차원 배열]
1차원 배열이 1열로 쌓이는 공간이라면 2차원 배열은 행도 쌓이고 열도 쌓인다고 생각하면 좋다. 즉 행열이라고 생각하면 된다.
2차원 배열을 많이 쓰이지는 않지만 그래도 한번 알아보자.
2차원 배열을 선언하는 방법은 다음과 같다.
public static void main(String[] args) {
int[][] array = new int[5][5]; // 세로(열)5줄, 가로(행) 5줄을 만들겠다. 5*5배열 생성
// 세로(열)2줄, 가로(행) 3줄을 만들겠다. 2*3배열 생성 및 해당 배열에 1 ~ 6의 값할당
int[][] array = {{1,2,3}, {4,5,6}}
}
보통 2차원 배열을 선언과 동시에 초기화하는 방법을 많이 사용한다.
만약 내가 원하는 인덱스에 값을 할당하고 싶다면 해당 인덱스를 지정해 주면 된다.
public static void main(String[] args) {
int[][] array = new int[5][5]; // 세로(열)5줄, 가로(행) 5줄을 만들겠다. 5*5배열 생성
array[2][0] = 5;
array[2][1] = 10;
array[2][2] = 15;
array[2][2] = 20;
}
[핵심 요약]
- 배열은 동일한 타입의 값을 담을 때 사용한다.
- 인덱스 기반으로 접근하기 때문에 빠르게 접근할 수 있다.
- 배열을 생성 시 크기가 고정되므로 요소의 추가나 삭제가 어렵다.
- 연속된 메모리 공간에 값을 저장하기 때문에 요소의 삽입이나 삭제가 발생하면 메모리를 재배치해야한다.
'스터디 > JAVA' 카테고리의 다른 글
[JAVA] 컬렉션 (1) | 2024.02.18 |
---|---|
[JAVA] Thread (0) | 2024.02.15 |
[JAVA] 상속 (0) | 2024.02.12 |
[JAVA] 클래스 (1) | 2024.02.03 |
[JAVA] 변수와 타입 (0) | 2024.01.29 |