배열(Array)
배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 자료구조를 의미한다.
배열의 특징
- 배열을 다루기 위해서는 참조변수를 선언해줘야 하고, 한 번 생성한 배열은 실행하는 동안 그 길이를 바꿀 수 없다.
- 배열의 길이는 int 또는 short 값으로 지정해야 하며 long으로 지정할 수 없다.
- 배열의 저장공간을 알려주는 인덱스는 0부터 시작한다.
- 배열의 길이는 바꿀 수 없기 때문에 int형 상수가 된다.
여기서 배열의 길이가 고정되는 이유는 배열은 값들을 연속적인 메모리 위치에 저장하기 때문이다.
메모리에서 개발자가 설정한 배열의 길이만큼 메모리를 차지하게 되는데 길이를 늘리게 된다면 개발자가 설정한 배열 뒤에 늘릴 수 있는 길이만큼의 메모리 공간이 있다고 확신할 수 없게 된다.
따라서 고정된 길이 값을 늘리기 위해서는 배열의 크기를 크게 설정하고 기존 배열의 내용을 복사해야 된다.
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList 클래스를 살펴보면 배열의 복사를 위해 Cloneable과 Serializable 인터페이스를 구현한다는 것을 확인할 수 있다.
배열의 선언 및 초기화
int[] num; // 배열을 선언(참조변수 선언)
num = new int[5]; // 배열을 생성(실제 저장공간을 생성)
num[1] = 10; // 인덱스 값을 넣어줘서 값을 초기화 해준다.
먼저 배열의 참조변수를 선언하고 new를 통해서 배열의 실제 저장공간을 생성해준다.
초기화를 할 때 조심해야 될 부분은 위의 코드를 참고하면 num[1]에 10을 대입했다고 10부터 시작하지 않는다는 것이다. 배열의 인덱스 시작은 무조건 0부터 시작한다는 것을 잊지 말자.
// TODO: 배열의 초기화 - 배열의 각 요소에 처음으로 값을 저장하는 것
num[0] = 10; // 각 인덱스에 대해서 값을 대입해 초기화할 수 있다.
num[1] = 20;
num[2] = 30;
num[3] = 40;
num[4] = 50;
for (int i = 0; i < num.length; i++) { // 반복문을 통해서 초기화가 가능하다.
num[i] = i * 10;
}
int[] num1 = {50, 40, 30, 20, 10}; // 참조변수 선언과 동시에 값을 설정할 수 있다.
배열을 초기화하는 방법으로는 여러 가지가 있다.
각 인덱스에 대해서 값을 대입해 초기화할 수 있고, 반복문을 통해서 초기화할 수 있다.
그 외에 참조변수를 선언하면서 동시에 값을 설정할 수 있다. (new int[]를 사용하지 않은 이유는 배열의 크기와 배열의 변수가 이미 알려진 상황에서는 배열 리터럴을 사용해서 초기화가 가능하기 때문이다.)
배열의 출력
// TODO: 배열의 출력
System.out.println(num); // 배열의 주소값을 출력한다.
for (int i = 0; i < num.length; i++) { // 각 요소를 순서대로 하나씩 뽑아서 출력해준다.
System.out.println(num[i]);
}
배열에 저장된 요소들의 값을 확인하고 싶을 때 참조변수를 출력하면 배열의 주소값이 나오는데 그 이유가 뭘까??
위의 그림을 살펴보면 배열의 참조변수는 어떤 요소의 값이 아닌 배열의 주소값이 저장된다는 것을 알 수 있다.
따라서 출력을 할 때는 참조변수를 거쳐서 인덱스의 값에 접근해야 하는데 이럴 때 for문을 사용하여 각각의 요소를 출력할 수 있다.
하지만 코드를 더 간결하게 만들 수 있고, 배열의 요소들을 한 번에 출력할 수 있는 방법이 있는데 바로 Arrays 클래스를 이용하는 것이다.
System.out.println(Arrays.toString(num)); // Arrays 클래스에 있는 toString 메서드를 사용해서 출력이 가능하다. (문자열로 출력됨)
해당 Arrays 클래스의 toSting 메서드로 배열을 출력하면 문자열로 배열의 요소들을 출력해 준다.
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
Arrays 클래스의 toString 메서드를 살펴보면 받아온 배열의 인덱스를 하나씩 접근하여 StringBuilder에 넣는 것을 알 수 있다. 개발자가 직접 처리하지 않고 단순히 메서드만 호출하면 알아서 for문을 통해 출력할 수 있어 코드를 좀 더 간결하게 작성할 수 있게 된다.
다차원 배열
다차원 배열은 테이블 형태의 데이터를 저장하기 위한 배열이다.
int[][] num = new int[4][3]; // new int[행][열];
int[][] num1 = { // 생성과 초기화를 동시에 하는 방법
{1, 2, 3},
{4, 5, 6}
};
기본적으로 [행][열]과 같이 선언할 수 있고, 직접 값을 주면서 초기화를 할 수 있다.
System.out.println(num1.length);
여기서 헷갈렸던 부분은 length를 출력하면 왜 2가 나오는지 궁금했다.
금방 궁금증을 해결했는데 배열의 인덱스로 따져봤을 때는 1, 2, 3이 각각의 요소가 아니라 {1, 2, 3} 이 해당 배열에서 하나의 요소로 가지고 있는 것이었다. 결과적으로 num1의 0번째 인덱스에는 {1, 2, 3}이 들어있는 것이다.
for (int i = 0; i < num1.length; i++) {
for (int j = 0; j < num1[i].length; j++) {
System.out.printf("[%d][%d] = %d, %d\n", i, j, num1[i][j], num1[i][j]);
}
}
2차원 배열을 출력할 때 주로 이중 for문으로 출력하게 되는데 num1[i][j]를 살펴보면 배열을 이해할 수 있다.
먼저 num1[i]만 분리해서 보면 {1, 2, 3} 배열이 나오게 되고, 그 후 [j]에 해당하는 값인 1을 출력하게 된다.
아래의 순서로 생각하면 쉽다.
num1[i][j] → num1[0][0] → {1,2,3}[0] → 1
Arrays 클래스
java.util 패키지에 있는 Arrays 클래스는 Collection Framework의 일부로 Java 배열을 동적으로 생성하고 액세스 하기 위한 정적(static) 메서드를 제공해 주는 클래스이다.
해당 클래스는 정적(static) 메서드와 Object 클래스의 메서드로만 구성되어 있기 때문에 클래스의 이름을 통해 메서드를 사용한다.
Arrays에서 제공하는 메서드 종류
메서드 | 하는 일 |
asList() | 지정된 배열이 지원하는 고정 크기 목록을 반환한다. |
binarySearch() | 이진 검색 알고리즘을 사용하여 배열에서 지정된 요소를 검색한다. |
compare(array1, array2) | 매개변수로 전달된 두 배열을 사전순으로 비교한다. |
copyOf(originalArray, newLength) | 복사본이 지정된 길이를 갖도록 지정된 배열을 기본값으로 잘라내거나 채워서 복사한다. |
deepEquals(Object[] a1, Object[] a2) | 지정된 두 배열이 서로 완전히 동일한 경우 true를 반환한다. |
deepToString(Object[] a) | 지정된 배열을 문자열로 반환한다. |
equals(array1, array2) | 두 배열이 동일한지 여부를 확인한다. |
fill(originalArray, fillValue) | 지정한 값으로 각 인덱스에 할당한다. |
sort(originalArray) | 전체 배열을 오름차순으로 정렬한다. |
stream(originalArray) | 지정된 배열을 순차 스트림을 반환한다. |
toString(originalArray) | 배열의 내용을 문자열로 반환한다. |
'자바' 카테고리의 다른 글
Java - Exception (0) | 2023.11.11 |
---|---|
Java - 열거형 (0) | 2023.11.09 |
Java - 문자와 문자열 (0) | 2023.11.06 |
Java - 제어문 (0) | 2023.11.04 |
Java - 연산자 (0) | 2023.11.02 |