자바(7) - 배열과 ArrayList
2021년08월04일배열
지금까지 사용한 변수는 자료 한 개를 저장하기 위한 공간이었다. 그런데 프로그래밍하다보면 자료형이 같은 자료를 여러 개 처리해야하는 일이 있다. 이런 경우 변수를 각각 선언하기 보다는 여러 자료를 한 번에 처리할 수 있는 기능이 필요하고, 이때 사용되는 것이 배열이다.
배열 사용하기
배열의 선언과 초기화 방법은 다음과 같은데, 주로 첫 번째 방식으로 많이 선언한다.
자료형[] 배열이름 = new 자료형[개수];
자료형 배열이름[] = new 자료형[개수];
// 실제
int[] studentIDs = new int[10];
위 실제처럼 만들개 되면 int형 요소가 10개인 배열을 선언한 것이다. int는 4바이트로 구성되니 10개면 총 40바이트의 메모리가 할당되는 것이다.
선언과 동시에 값까지 넣으려면 다음처럼 한다.
int[] studentIDs = {101, 102, 103};
이처럼 하면 3개 길이의 배열이 만들어 지는 것이다.
배열값을 사용하려면 배열변수[숫자]
이렇게 사용하면 된다. [] 이것은 인덱스 연산자라 하여 배열 요소가 저장된 메모리 위치를 찾아주는 역할을 한다. 숫자는 0부터 시작한다.
배열길이를 알고자 할 때는 배열변수.length
라 해서 .length를 붙혀주면 된다.
객체 배열 사용하기
참조 자료형 또한 배열을 활용할 수 있다. 아래는 Book 클래스이다.
public class Book {
private String bookName;
private String author;
public Book() {}
public Book(String bookName, String author) {
this.bookName = bookName;
this.author = author;
}
public void showBookInfo() {
System.out.println(bookName + "," + author);
}
}
테스트 클래스로 결과를 봐보자.
public class BookArray {
public static void main(String[] args) {
Book[] library = new Book[5];
for(int i=0; i<library.length; i++) {
System.out.println(library[i]);
}
}
}
결과값은 전부 null이 나올 것이다. 우리가 Book[] libray = new Book[5];
이 코드로 인스턴스 5개를 만든거 같지만 아니다. 저 코드는 그저 인스턴스 주소 값을 담을 공간 5개를 생성하는 것이다.
공간만 있기 때문에 ‘비어 있다’라는 의미인 null값으로 초기화가 되는 것이다. 그렇기에 인스턴스를 만들어 주고 배열이 참조할 수 있도록 해주면 된다.
public class BookArray {
public static void main(String[] args) {
Book[] library = new Book[5];
library[0] = new Book("Book1", "A1");
library[1] = new Book("Book2", "A2");
library[2] = new Book("Book3", "A3");
library[3] = new Book("Book4", "A4");
library[4] = new Book("Book5", "A5");
for(int i=0; i<library.length; i++) {
System.out.println(library[i]);
}
}
}
배열 복사하기
기존 배열과 자료형 및 배열 크기가 똑같은 배열을 새로 만들거나 배열의 모든 요소에 자료가 꽉 차서 더 큰 배열을 만들어 기존 배열에 저장된 자료를 가져오려 할 때 배열을 복사한다. 배열을 만드는 방법으론 두 가지가 있는데, 첫 번째는 for문을 활용하여 복사하는 것인다. 이건 그냥 반복하면 되는 것이다. 두 번째는 System.arraycopy()메서드를 사용하는 방법이다. System.arraycopy(src, srcPos, des, destPos, length)형태이고 의미는 아래 표와 같다. |매개변수|설명| |——-|—-| |src|복사할 배열 이름| |srcPos|복사할 배열의 첫 번째 위치| |dest|복사해서 붙여 넣을 대상 배열 이름| |destPos|복사해서 대상 배열에 붙여 넣기를 시작할 첫 번째 위치| |length|src에서 dest로 자료를 복사할 요소 개수|
예제로 살펴보자
public class ArrayCopy {
public static void main(String[] args){
int[] array1 = {10, 20, 30, 40, 50};
int[] array2 = {1, 2, 3, 4, 5};
System.arraycopy(array1, 0, array2, 1, 4};
for(int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
}
}
결과값
1 10 20 30 40
만약 length부분을 5개 했다면 길이 문제로 오류가 발생할 것이다.
ArrayList
기존 배열을 사용하려면 항상 배열 길이를 정하고 시작해야 한다. 만약 100명 학생용으로 만들었는데, 학생 수가 100명이 넘어가면 길이 문제가 나타날 것이다. 배열을 사용하는 중에는 배열 길이를 변경할 수 없기에 코드를 수정해야 한다. 또는 배열 중간의 값을 지워야 한다. 그런데 배열은 중간에 있는 요소를 비워둘 수 없기에 위치를 수정해줘야한다. 이러면 많은 수고로움이 생길 것이다. 이를 해결하기 위해 나타난 자료구조로 ArrayList 객체 배열 클래스를 제공한다. 클래스이기 때문에 유용한 메서드들이 많이 제공된다. |메서드|설명| |—–|—-| |boolean add(E e)|요소 하나를 배열에 추가한다. E는 요소의 자료형을 의미한다. |int size()|배열에 추가된 요소 전체 개수를 반환| |E get(int index)|배열의 index 위치에 있는 요소 값을 반환| |E remove(int index)|배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환| |boolean isEmpty()|배열이 비어 있는지 확인|
add()메서드를 이용하면 배열 길이와 상관없이 객체를 추가할 수 있다. 배열 요소 개수가 부족하면 배열 크기를 더 키워주고, 중간에 요소 값이 제거되면 그 다음 요소 값을 하나씩 앞으로 이동해준다. 선언 방법은 다음과 같다.
ArrayList<E> 배열 이름 = new ArrayList();