ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컬렉션 List - ArrayList
    백엔드/자바 2020. 8. 16. 03:17

    ArrayList의 정의와 장점

    컬렉션 프레임워크에서 가장 많이 사용되는 클래스로서 List 인터페이스를 구현한 클래스다.

     

    List 인터페이스를 구현했기에 데이터를 저장할 때 저장 순서가 유지되고 데이터 중복을 허용한다.

     

    간단히 생각하면 우리가 배운 배열의 업그레이드 판이라고 생각하면 편하다.

     

    실제로도 데이터의 저장공간으로 배열을 사용하며 배열을 기반으로 한다.

     

    ArrayList는 미리 배열의 크기를 입력할 필요가 없고

    (물론 미리 입력해서 크기를 지정할 수 있지만, 그 크기를 초과해도 자동으로 배열을 확장해준다.)

     

    한 개의 ArrayList에 다양한 자료형을 동시에 저장할 수 있다.

    ArrayList의 자료 저장 및 삭제 방식

    ArrayList는 객체(Object) 배열을 이용해 데이터를 순차적으로 저장한다.

     

    즉 ArrayList는 클래스 내부에 객체(Object)배열이 있고 여기에 데이터를 저장한다.

     

     

     

    예를 들어 위와 같은 ArrayList가 있고 a,b,a 객체를 순차적으로 배열에 넣는다고 가정해보자.

     

     

     

    ArrayList에 a,b,a객체를 모두 넣었다면 위 그림처럼 배열에 순서대로 저장이 된다.

     

    만약 ArrayList에 계속 저장을 하다가 저장 공간이 없다면 자동으로 더 큰 새로운 배열을 생성한다

     

    그리고 새로운 배열에 기존 배열의 내용을 복사한 다음 저장을 계속 이어나간다.

     

    반대로 데이터를 삭제할 때 알아둬야 할 점이 있다.

     

    바로 ArrayList 내에서 특정한 위치의 데이터를 삭제하면 삭제한 위치로 뒤의 데이터를 당겨온다는 것이다.

     

     

    예를 들어 위와 같이 a,b,a객체가 들어있는 ArrayList에서 b를 제거한다고 생각해보자.

     

     

     

    그럴 경우 1번 인덱스에 위치한 b가 제거되고 2번 인덱스에 있던 a가 b의 자리로 당겨진다.

     

    그리고 a가 있던 2번 인덱스의 자리는 메모리에서 삭제된다.

     

    물론 이건 배열의 가장 첫번째 위치와 중간 위치에 있는 데이터를 삭제될 때만 해당된다.

     

    배열의 가장 마지막 데이터를 삭제하는건 데이터 이동없이 삭제만 이뤄진다.

     

    또한 앞서 말했듯 ArrayList는 클래스 내부에 객체배열을 가지고 있다.

     

    그렇기 때문에 다양한 객체들을 가리지 않고 저장할 수 있다.

    ArrayList 선언하기

     

    ArrayList를 선언하는 방법은 간단하다

     

    위 그림처럼 ArrayList 자료형을 선언하고 new ArrayList()를 입력해 선언해주면 된다.

     

    이때 괄호 ( ) 안에는 숫자를 넣어 배열의 크기를 미리 입력해도 되고 그렇게 하지 않아도 된다.

     

    어차피 양쪽 다 배열이 꽉차면 자동으로 배열을 확장하므로 원하는대로 하면 된다.

     

    추가로 ArrayList는 List 인터페이스를 구현한 클래스이므로 List 자료형으로 선언해도 사용이 가능하다.

    ArrayList 데이터 추가, 삭제하기, 조회하기

     

    ArrayList는 add() 메서드와 remove() 메서드를 이용해서 배열에 데이터를 추가, 삭제한다.

     

    add() 메서드의 괄호 안에는 저장하고 싶은 데이터를 입력하면 배열에 순차적 저장이 된다.

     

    remove() 메서드의 괄호 안에는 삭제하고 싶은 데이터의 인덱스 넘버를 넣으면 된다.

     

    그리고 배열의 내용을 조회하고 싶다면 get() 메서드의 괄호 안에 인덱스 넘버를 넣으면 된다.

     

    정확히 말하면 get은 객체를 반환하는 것이지만 이를 통해 데이터 조작, 조회가 가능하다.

    ArrayList의 단점

    ArrayList는 정해진 크기가 넘어가면 새로운 배열을 생성해서 데이터를 복사한다.

     

    앞서 말했듯 ArrayList는 정해진 크기를 초과하면 새로운 배열을 생성한다.

     

    그리고 해당 배열에 기존 배열의 데이터를 복사한다.

     

    이렇게 지속적으로 할 경우에는 실행 속도가 다소 느려질 수 있음을 의미한다.

     

    그렇다고 초반에 미리 배열 크기를 너무 크게 잡으면 이는 메모리 낭비를 불러온다.

     

    또 한가지 단점이 있다.

     

    바로 배열의 중간에 있는 데이터를 삭제하면 자원 낭비가 심해진다는 것이다.

     

    ArrayList는 앞서 말했듯이 데이터가 순차적으로 쌓이는 구조다.

     

    처음 저장한 데이터는 0번째, 두번째로 저장한 데이터는 1번째 위치에 위치하는 식으로 저장이 된다.

     

    하지만 배열 중간의 데이터를 삭제하면 빈자리를 채우기 위해

     

    삭제한 요소 뒤의 모든 요소가 자리 이동을 한다.

     

    결국은 ArrayList는 배열 중간의 데이터를 추가 삭제하면 자원 낭비가 심해진다.

    ArrayList의 다양한 메서드

    ArrayList는 List 인터페이스를 상속받았다.

     

    그러므로 List는 물론이고 ArrayList만의 메서드까지 다양한 메서드를 동시 갖는다.

     

    다 설명할 순 없고 간단히 코드를 볼 수 있도록 하자.

     

        public static void main(String[] args) {
    
            ArrayList test_1 = new ArrayList();
    
            // 데이터 추가
            test_1.add("a");
            test_1.add("b");
            test_1.add("c");
    
            // 저장된 객체 반환(데이터 조회 및 조작)
            test_1.get(0);
    
            // ArrayList 내 괄호 안 데이터가 있는지 확인
            test_1.contains("a");
    
            // ArrayList 내 괄호 안 데이터가 위치한 인덱스 반환
            test_1.indexOf("a");
    
            // ArrayList 내 데이터 개수를 반환
            test_1.size();
    
            // 괄호 안 인덱스에 위치한 데이터 삭제
            test_1.remove(0);
    
            // ArrayList 내에 괄호 안 데이터와 동일한 데이터 삭제
            test_1.remove("b");
    
            // Arraylist를 완전히 비운다.
            test_1.clear();
    
            // ArrayList가 비어있는지 확인
            test_1.isEmpty();
    
        }

     

Designed by Tistory.