ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java ArrayList의 개념 및 메서드
    Java/자바의정석 2023. 2. 27. 14:10
    반응형

    ArrayList 란?

    • List인터페이스를 구현하므로, 순서 보장, 중복을 허용한다.
    • 데이터의 저장공간으로 배열을 사용한다.
    생성자 설명
    ArrayList() 기본생성자
    ArrayList(Collection c) 매개변수로 어떠한 컬렉션을 던지면 해당 컬렉션의 내용을 저장
    ArrayList(int initialCapacity) 배열의 길이, 처음에 배열의 길이를 지정

     

    추가메서드 -  성공하면 true, 실패하면  false

    • boolean add(Object o)
    • void add(int index, Object element) // 어느위치에 저장할지 선정이 가능하다.
    • boolean addAll(Collection c)
    • boolean addAll(int index, Collection c)

    삭제 메서드

    • boolean remove(Object o)
    • Object remove(int index)
    • boolean removeAll(Collection 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)  from~to에 해당하는 내용을 불러온다.
    Object [] toArray() ArrayList의 객체 배열을 반환
    boolean isEmpty() 비어있는지 확인
    void trimToSize() 빈공간 제거
    int size() 저장된 객체의 갯수 반환

     

    위와같이 ArrayList들의 기능들을 정리해보았다. 이제 코드를 보며 활용을 해보자.

     

    import java.util.*;
    
    class Ex11_1 {
        public static void main(String[] args) {
            //기본길이(용량, capacity)가 10인 ArrayList를 생성
            ArrayList list1 = new ArrayList(10);
            //list1.add(new Integer(5));
            //list1.add(5) 와 같이 사용도 가능
            list1.add(new Integer(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 list2 = new ArrayList(list1.subList(1,4));
            print(list1, list2);
    
            //디폴트값은 오름차순으로 정렬
            Collections.sort(list1);
            Collections.sort(list2);
            print(list1, list2);
    
    
            System.out.println("list1.containsAll(list2):"
                    + list1.containsAll(list2));
    
            list2.add("B");
            list2.add("C");
    
            list2.add(3, "A");
            print(list1, list2);
    
    
            list2.set(3, "AA");
            print(list1, list2);
    
            System.out.println("list1.retainAll(list2):" + list1.retainAll(list2));
    
            print(list1, list2);
    
            list1.add(0, "1");
            System.out.println("index=" + list1.indexOf("1")); //문자열, 숫자 구분
            list1.remove(0);
            list1.remove(new Integer(1)); 
    
    
            for(int i= list2.size()-1; i >= 0; i--) {
                if(list1.contains(list2.get(i)))
                    list2.remove(i);
            }
            print(list1, list2);
        }
    
        static void print(ArrayList list1, ArrayList list2) {
            System.out.println("list1:"+list1);
            System.out.println("list2:"+list2);
            System.out.println();
        }
    }

    ====================실행결과======================

    list1:[5, 4, 2, 0, 1, 3]
    list2:[4, 2, 0]

    list1:[0, 1, 2, 3, 4, 5]
    list2:[0, 2, 4]

    list1.containsAll(list2):true
    list1:[0, 1, 2, 3, 4, 5]
    list2:[0, 2, 4, A, B, C]

    list1:[0, 1, 2, 3, 4, 5]
    list2:[0, 2, 4, AA, B, C]

    list1.retainAll(list2):true
    list1:[0, 2, 4]
    list2:[0, 2, 4, AA, B, C]

    index=0
    list1:[0, 2, 4]
    list2:[AA, B, C]


    ArrayList list1 = new ArrayList(10);

    먼저 ArrayList를 사용하기 위해 객체를 생성한다. 기본길이(용량, capacity)가 10인 ArrayList를 생성
    여기서 list1은 객체배열이다. 그러므로 객체만 저장이 가능하다. (ArrayList에는 객체만 저장가능)

    add() - 객체 추가하기

    list1.add(new Integer(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));

    그리고 이와같이 add()메서드를 통해 값을 추가하였다. 이와같은 배열이 이루어진다.

    5 4 2 0 1 3 ...

    여기서 new Integer()와 같이 사용하는 이유는 list1은 객체 배열이기 때문에 객체형태로 추가해야한다.

     

    list1.add(5);

    하지만 위와같이 바로 선언해주어도 문제가없다. 이유는 바로 자바에서 autoBoxing을 해주기 때문이다.

    autoBoxing에 의해서 기본형이 참조형으로 바뀌어서 문제가없다.

     

     

    subList() - 새로운 리스트 생성

    ArrayList list2 = new ArrayList(list1.subList(1,4));

    list2를 생성하였는데 subList를 통하여 list1의 일부를 뽑아서 새로운 리스트를 생성한다. 1<= x <4

    4 2 0

    (subList에서 만들어진 List는 읽기전용이다.)

     

    Sort() - 정렬하기

    Collections.sort(list1);   
    Collections.sort(list2);

    여기서 Collection은 인터페이스이고, Collections는 유틸클래스이다.

    정렬의 Default값은 오름차순으로 정렬이된다.

     

    LIst1

    0 1 2 3 4 5 ...

     

    List2

    0 2 4 ...

     

     

    containsAll() - 포함 여부

    System.out.println("list1.containsAll(list2):" + list1.containsAll(list2));

    containsAll을 통해 list1이 list2의 모든 요소를 포함하고 있는지 여부를  확인하고 있다. 

     

     

    add() - index 지정해서추가하기

    list2.add("B");
    list2.add("C");
    
    list2.add(3, "A");

     

    list2.add("B")

    0 2 4 B ...

    list2.add("C")

    0 2 4 B C ...

    list2.add(3, "B")

    0 2 4 A B C ...

    이와같이 add()를 통하여 index를 지정해서 추가가 가능하다. 

    index를 지정해서 추가하는경우 기존의 데이터가 뒤로 밀려나기때문에 데이터가 많은 경우에는 부담이 있는 작업이다.

     

     

    retainAll() - 교집합

    System.out.println("list1.retainAll(list2):" + list1.retainAll(list2));

    retainAll()을 사용하여

    list1에서 list2와 겹치는 부분만 남기고 모두 제거한다.

    0 2 4 ...

     

     

    set() - 내용 변경

    list2.set(3, "AA");
    0 2 4 AA B C ...

    set을 통하여 index지정 후에 내용변경이 가능하다.

     

     

    indexOf(), remove - 찾기기능, 삭제 기능

    list1.add(0, "1");
    System.out.println("index=" + list1.indexOf("1"));
    list1.remove(0); 
    list1.remove(new Integer(1));

    list1. add(0, "1")의 경우 0번째에 문자열 1을 추가한 상태이다.

    1 0 2 4 ...

    indexOf("1")을 실행한다면  0번재에 있는 문자열 1을 찾아 해당 index를 반환한다.

    1을 삭제하기 위해 list1.remove(0)을 실행하게 되면 index:0번째에 있는 "1" 문자열 1이 삭제가된다.

    숫자 1을 삭제 하기위해서는 list1.remove(new Integer(1)); 과 같이 삭제해주어야한다. 

    remove, indexOf 의경우 문자열, 숫자를 구분한다는것을 다시한번 확인하자.

     

    0 2 4 ...

    최종적으로 이와같은 배열의 형태가 되어진다.

     

    기능활용

    for(int i= list2.size()-1; i >= 0; i--) {
        if(list1.contains(list2.get(i)))
            list2.remove(i);
    }

    list2에서 list1에 포함된 객체를 삭제하는 코드이다.

    1. get(i)를 통하여 list2에서 요소들을 하나씩 꺼내온다.

    2. 꺼내온 요소를 contains로  list1이 해당요소를 포함하고 있는지 유무를 확인한다. 

    3. true라면 remove(i)를 통하여 해당 객체를 list2에서 삭제한다.

     

    List1

    0 2 4 ...

    List2

    0 2 4 AA B C ...

     

     

    Remove할때 주의할점!!

    0 1 2 3 4 null ...

    위와같은 배열이 있다면 세번째 데이터 data[2]를 삭제하고싶다면, list.remove(2)를 사용하여 삭제가 가능하다.

    그리고 난 뒤 나는 data[3]을 삭제하고 싶다면, list.remove(3)을 사용한다면 4가 삭제가된다.

    삭제가되면 그 뒤에 남은요소들이 앞으로 당겨져 오기때문이다.

    그렇게 때문에 list에서 삭제를 하는 경우는 마지막부분에서 지워주는것이 좋다.

     

    반응형

    'Java > 자바의정석' 카테고리의 다른 글

    Stack 활용해보기  (0) 2023.02.27
    LinkedList와 ArrayList의 차이  (0) 2023.02.27
    Java Collection이란?  (0) 2023.02.27
    Stack, Queue 개념  (0) 2023.02.26
    자바 예제로 살펴보는 Calendar 여러가지 기능들(2)  (0) 2023.02.23

    댓글

Designed by Tistory.