ArrayList란 무엇일까?
ArrayList에서 선언된 가장 중요한 함수를 통해
개념을 이해해볼 것이다.
List - ArrayList
- null 값을 저장할 수 있다.
- 값을 중복 저장할 수 없다.
- 값을 넣는 순서대로 저장한다.
그래서 값을 꺼낼 때도 넣은 순서대로 꺼낼 수 있다.
- 값을 꺼낼 때 숫자 인덱스를 사용하여 꺼낸다.
1)
ArraList 1. Object[] 배열 생성 코드를 작성한다.
public class ArrayList_ex1 {
// Object 배열을 생성할 때, 기본적으로 생성해줘야 하는 사이즈(DEFAULT_SIZE)를 지정해준다.
public static final int DEFAULT_SIZE = 10;
// Object 배열에 값을 넣어줄 때, 추가로 생성해주고 싶은 사이즈(GROW_SIZE)를 지정해준다.
public static final int GROW_SIZE = 3;
Object[] list;
// ArrayList_ex1 인스턴스를 생성하자마자, 호출되는 생성자 함수에서
// 자동적으로 Object 배열의 빈 값을 10개 생성해주도록 한다.
public ArrayList_ex1() {
list = new Object[10];
}
2)
ArrayList 2. new ArrayList_ex1(숫자); 작성시 호출되는
Object[] 배열 생성자 코드를 작성한다.
// 기본 사이즈나 추가 사이즈보다 작은 수가 넘어오면 기본 사이즈로 배열을 생성한다.
public ArrayList_ex1(int capacity) {
if (capacity < DEFAULT_SIZE || capacity < GROW_SIZE) {
list = new Object[DEFAULT_SIZE];
} else { // 그 외에는 입력받은 숫자대로 배열을 생성한다.
list = new Object[capacity];
}
}
3)
ArrayList 3. 배열의 길이를 증가시키는 increaseList()
메서드 코드를 작성한다.
// 배열의 길이를 증가시키는 메서드. 내부 메서드이기 때문에 private을 사용한다
private void increaseList() {
// 생성된 배열의 길이에 GROW_SIZE를 더 한 만큼 배열을 추가로 생성한다.
Object[] newList = new Object[list.length + GROW_SIZE];
// 반복문을 통해, 새롭게 생성되었던 newList 배열의 각 인덱스 값에 list 배열 값들을 저장한다.
for (int i = 0; i < list.length; i++) {
newList[i] = list[i];
}
// list 변수에 newList 배열의 주소를 할당해주면 된다.
list = newList;
}
4)
ArrayList 4. 배열에 값을 넣어주는 add() 메서드를 추가한다.
// 배열에 값을 넣어주는 메서드
public void add(Object obj) {
// add 메서드가 호출될 때마다 length 값을 하나씩 증가시키면서 obj 값을 list 배열에 삽입한다.
list[length++] = obj;
// length와 배열의 길이가 일치하면 배열의 길이를 증가시킨다.
if (length == list.length) {
increaseList();
}
}
5)
ArrayList 5. 배열에 저장된 값을 꺼내는 get() 메서드를 추가한다.
// 배열에 저장된 값을 꺼내는 get() 메서드를 추가한다.
public Object get(int index) {
// index 값이 배열의 길이보다 많거나 0보다 작다면 에러처리를 해준다.
if (index < 0 || index >= length) {
throw new RuntimeException("배열 인덱스의 범위를 벗어났습니다.");
}
// 그외에는 list 배열에서 해당 인덱스에 저장된 값을 리턴한다
return list[index];
}
6)
ArrayList 6. 배열에서 특정 인덱스를 제거하는 remove() 메서드를 추가한다.
// 배열에서 특정 인덱스를 제거하는 remove() 메서드를 추가한다.
public void remove(int index) {
//index 값이 배열의 길이보다 많거나 0보다 작다면 에러처리를 해준다.
if (index < 0 || index >= length) {
throw new RuntimeException("배열 인덱스의 범위를 벗어났습니다.");
}
// 입력받은 index 값부터 list 배열에 있는 값들을 하나씩 당겨서 저장한다.
// (덮어씌어 지면서 기존 값이 지워지는 것)
for (int i = index; i < list.length - 1; i ++) {
list[i] = list[i+1];
}
// 배열의 길이를 하나 줄인다.
length--;
}
7)
ArrayList 7. 배열에서 특정 인덱스에 값을 저장하는 set() 메서드를 추가한다.
// 배열에서 특정 인덱스에 값을 저장하는 set() 메서드를 추가한다.
public void set(int index, Object obj) {
//index 값이 배열의 길이보다 많거나 0보다 작다면 에러처리를 해준다.
if (index < 0 || index >= length) {
throw new RuntimeException("배열 인덱스의 범위를 벗어났습니다.");
}
// list[index]에 값을 저장시킨다.
list[index] = obj;
import java.sql.Date;
public class Test_ArrayList{
public static void main(String[] args) {
ArrayList_ex1 dateList = new ArrayList_ex1();
dateList.add(Date.valueOf("2017-3-1"));
dateList.add(Date.valueOf("2017-5-3"));
dateList.add(Date.valueOf("2017-5-5"));
dateList.add(Date.valueOf("2017-5-9"));
dateList.add(Date.valueOf("2017-6-6"));
for (int i = 0; i < dateList.length(); i++) {
System.out.println(dateList.get(i));
}
System.out.println("-------------------------");
dateList.remove(3);
dateList.set(1, Date.valueOf("2017-5-4"));
for (int i = 0; i < dateList.length(); i++) {
System.out.println(dateList.get(i));
}
}
}
- 실행 결과 :
2017-03-01
2017-05-03
2017-05-05
2017-05-09
2017-06-06
-------------------------
2017-03-01
2017-05-04
2017-05-05
2017-06-06