🎥Back/자바의 정석

[JAVA의 정석]ArrayList

i_zzy 2024. 1. 16. 13:42

이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다. 

 

 

📂content

1. ArrayList

- ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적을 동일

  ArrayList와 달리 Vector는 자체적으로 동기화처리가 되어 있다.

- List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다. 

- 데이터의 저장공간으로 배열을 사용한다. (배열 기반)

더보기

Vector를 자세히 살펴보면 객체 배열이 있다. Object(객체) 배열에는 모든 종류의 객체를 저장할 수 있음

 

 

 

 

 

2.  ArrayList의 메서드

⚝ 생성자

- ArrayList() : 기본 생성자

- ArrayList(Collection c) : 매개변수로 컬렉션을 주면, 컬렉션에 저장된 것을 ArrayList로 만들어줌. 

- ArrayList(int initialCapacity) : 배열의 길이를 넣어줌. (한 번 만들면 길이를 못 바꾼다) 

 

⚝ 추가 메서드

- boolean add(Object o)

- void add(int index, Object element) : 특정 위치 

- boolean addAll(Collection c)

- boolean addAll(int index, Collection c) : 특정 위치 

 

⚝ 삭제 메서드

- boolean remove(Object o)

- void remove(int index, Object element) : 특정 위치 

- boolean removeAll(Collection c) : 특정 c 

- void clear() : 모두 

 

⚝ 그 외

- int indexOf(Object o) : 못 찾으면 -1 

- int lastIndexOf(Object o)

- boolean contains(Object o) : 객체 존재? 

- Object get(int index) : 객체 읽기 
- Object set(int index, Object element) 

 

- List subList(int fromIndex, int toIndex)

- Object[] toArray() : ArrayList의 객체배열을 반환 

- Object[] toArray(Object[] a)

- boolean isEmpty()

- void trimToSize()

- int size() 

 

 

⍟ 실습

더보기
package etc;
import java.util.ArrayList;
import java.util.Collections;


public class Ex11_1 {
    public static void main(String[] args) {
        //기본 길이(용량, capacity)가 10인 ArrayList를 생성
        ArrayList list1 = new ArrayList(10);
        list1.add(5); //가능하긴 함
        //기본 사용 방식
        list1.add(new Integer(4));
        list1.add(new Integer(2));
        list1.add(new Integer(0));
        list1.add(new Integer(1));
        list1.add(new Integer(3));

        //생성자 ArrayList(Collection c)를 이용한 것
        ArrayList list2 = new ArrayList(list1.subList(1,4)); //ArrayList의 일부를 뽑아서 만들어줌
        // 1 <= x < 4이기 때문에 index가 1,2,3인 것을 가지고 subList를 만든다.
        //subList는 읽기 전용이라 사용할려면 새로운 리스트를 만들어주어야 한다.
        print(list1, list2);

        //Collection은 인터페이스, Collections는 유틸 클래스
        Collections.sort(list1); //list1과 list2를 정렬한다.
        Collections.sort(list2); //Collections.sort(List l)
        print(list1, list2);

        //list1이 list2의 모든 요소를 포함하고 있는가?
        System.out.println("list1.containsAll(list2):"+list1.containsAll(list2));//true


        list2.add("B");
        list2.add("C"); //list2:[0, 2, 4, B, C]
        list2.add(3, "A"); //list2:[0, 2, 4, A, B, C]
        print(list1,list2);

        list2.set(3, "AA");
        print(list1, list2); //list1:[0, 1, 2, 3, 4, 5] list2:[0, 2, 4, AA, B, C]

        list1.add(0,"1");
        //indexOf()는 지정된 객체의 위치(인덱스)를 알려준다.
        //출력은 같지만 Integer 1과 String 1이 있다.
        System.out.println("index="+list1.indexOf("1")); //index=0
        System.out.println("index="+list1.indexOf(1)); //index=2
     

//        list1.remove(new Integer(1)); //숫자 1을 지움
//        list1.remove(0); //인덱스 0번 지움
//        list1.remove(1); //인덱스가 1인 객체를 삭제. boolean remove(Object obj)를 호출하는 것이 아닌, Object remove(int index)를 호출한다.

        //list1에서 list2와 겹치는 부분만 남기고 나머지는 삭제한다
        System.out.println("list1.retainAll(list2):"+list1.retainAll(list2)); //true
        print(list1, list2); //list1:[0, 2, 4] list2:[0, 2, 4, AA, B, C]

        //list2에서 list에 포함된 객체들을 삭제한다.
        for(int i = list2.size()-1; i >= 0; i--){
            if(list1.contains(list2.get(i)))
                list2.remove(i);
        }
        /*
        1. get(i)으로 list2에서 하나씩 꺼낸다
        2. contains()로 꺼낸 객체가 list1에 있는지 확인
        3. remove(i)로 해당 객체를 list2에서 삭제
         */
        print(list1, list2); //list1:[0, 2, 4] list2:[AA, B, C]

    } //main의 끝

    private static void print(ArrayList list1, ArrayList list2) {
        System.out.println("list1:"+list1);
        System.out.println("list2:"+list2);
        System.out.println();
    }
} //class

 

- `list.add(5);`도 가능하긴 하지만, 기본적으로 ArrayList에는 객체만 저장이 가능하다.

따라서 `list.add(new Integer(5));`와 같은 형식으로 값을 추가해야 한다. 그렇다면 `list.add(5);`는 어떻게 가능한 것인가? 그것은 컴파일러가 autoboxing해주면서 기본형을 참조형으로 자동 변환을 해주기 때문이다. 

 

 

 

 

 

3.  ArrayList에 저장된 객체의 삭제 과정

- ArrayList에 저장된 세 번째 데이터(data[2])를 삭제하는 과정. `list.remove(2);`를 호출

 

 

① 삭제할 데이터 아래의 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다. 

② 데이터가 모두 한 칸씩 이동했으므로 마지막 데이터는 null로 변경한다. 

 

③ 데이터가 삭제되어 데이터의 개수가 줄었으므로 size의 값을 감소시킨다. 

 

※ 마지막 데이터를 삭제하는 경우, ①의 과정(배열의 복사)은 필요없다. 

 

 

 

ArrayList를 전부 삭제해보자!! 

⚝ ArrayList에 저장된 첫 번째 객체부터 삭제하는 경우 (배열 복사 발생) 

for문 다 돌았는데도 다 안 지워지고 남아있다. 
왜? 남아있는 얘들이 위로 올라가기 때문이다. 
그래서 아래와 같은 방식으로 해결이 가능하다. 

 

 

⚝ ArrayList에 저장된 마지막 개체부터 삭제하는 경우 (배열 복사 발생 안 함)

 

 

 

 

 

4.  Java API 소스 보기 - /jdk설치경로/src.zip

 

⚝ Eclipse에서 보는 방법

- 소스를 보고 싶은 클래스나 메서드에서 `우클릭` -> `Open Declaration` 클릭! 

- 만약 Source not found라는 글을 보면 그 아래의 `Attach Source...`를 클릭 -> `External Location` 클릭 -> `External File...`을 클릭하고 jdk가 설치된 경로(/jdk/src.zip)를 지정 

 

 

 

 

 

출처