ABOUT ME

Today
Yesterday
Total
  • [자료구조] 2-1. 리스트(List) - ArrayList
    CS/자료구조 2022. 9. 10. 00:18
    반응형
    728x90

     

    배열과 리스트의 차이점 

    배열과 리스트의 가장 큰 차이점은 크기가 고정되어있냐, 동적이냐로 볼 수 있다.

    배열은 크기가 고정되어 있는 반면, 리스트는 크기가 정해져있지 않고 동적으로 변한다.

    또한 배열은 식별자인 index가 존재하고 리스트는 존재하지 않는다.

     

    리스트는 인터페이스이다.

    이 리스트를 구현한 자료형으로 ArrayList, LinkedList 등이 있다.

    그 중에서 ArrayList는 배열(index)과 리스트(가변 길이)의 장점을 합친 자료구조이다.

     

    이미지 출처: https://greatzzo.tistory.com/43

     

    위 이미지와 같은 구조이기 때문에 ArrayList를 선언할 때 List로 변수를 선언할 수도 있다.

     

    ArrayList 선언과 해당 메소드

    - ArrayList<Integer> arrayList = new ArrayList<>();
    - add(obj) / add(idx, obj)
    - size()
    - get(idx)
    - remove(idx) / remove(obj)
    - contains(obj)
    - sort(Comparator.naturalOrder())
    - sort(Comparator.reverseOrder())
    - Arrays.asList(arr)
    - str.substring(start idx, end idx)
    - String.join("구분자", interable obj)

     

    import java.util.ArrayList;
    import java.util.List;
    
    public class ArrayListExample {
        public static void main(String[] args) {
            // ArrayList 선언 방법1
            List<Integer> arrayList = new ArrayList<Integer>();
    
            // ArrayList 선언 방법2
            ArrayList<Integer> arrayList2 = new ArrayList<Integer>();
        }
    }

     

    cf) 방법1처럼 선언할 경우, arrayList를 사용하다가 LinkedList로 바꿔 사용할 수도 있다.

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    public class ArrayListExample {
        public static void main(String[] args) {
            // ArrayList 선언 방법1
            List<Integer> arrayList = new ArrayList<Integer>();
    
            arrayList = new LinkedList<Integer>();
    
            // ArrayList 선언 방법2
            ArrayList<Integer> arrayList2 = new ArrayList<Integer>();
        }
    }

     

    JDK 1.7이상부터는 인스턴스 생성 시 타입 추정이 가능한 경우 타입을 생략할 수 있다.

    따라서 아래처럼 선언할 수도 있다.

    // ArrayList 선언 방법3
    ArrayList<Integer> arrayList3 = new ArrayList<>();

     

    이때 기억해야할 사항으로, List는 타입 선언 시 primitive type은 불가능하다.

    따라서 Wrapper Class로 타입을 선언한다(ex) int (x) -> Integer(o)).

     

    ArrayList에 값을 추가할 때에는 add 메소드를 사용한다.

    배열(Array)와 다르게 ArrayList의 크기를 알고 싶을 때에는 size 메소드를 사용한다(배열의 경우, length).

    값을 읽을 때에는 get 메소드와 index를 사용한다.

    // 값 추가
    arrayList.add(100);
    arrayList.add(200);
    arrayList.add(300);
    
    // ArrayList 크기 확인(즉, 배열 길이 확인)
    System.out.println(arrayList.size()); // 3
    
    // index로 값 읽기
    System.out.println(arrayList.get(1)); // 200

     

    값을 변경하고 싶을 때에는 set 메소드를 사용한다.

    // 값 변경: set(idx, value)
    arrayList.set(1, 500);
    
    // idx로 값 읽기
    System.out.println(arrayList.get(1)); // 500

     

    값을 삭제하고 싶을 때에는 remove 메소드를 사용한다.

    이때 해당 idx 위치의 값이 삭제되고 뒤에 있는 값들이 앞으로 당겨진다.

    // 값 삭제: remove(idx)
    arrayList.remove(0);
    
    // ArrayList 크기 확인(즉, 배열 길이 확인)
    System.out.println(arrayList.size()); // 2
    
    // idx로 값 읽기
    System.out.println(arrayList.get(0)); // 500
    System.out.println(arrayList.get(1)); // 300

    cf) arrayList.remove(0)이 실행되기 전 arrayList의 0번째 idx에는 100이 들어있었다.

     

    위에서 말했던 add 메소드로 배열(ArrayList) 사이에 값을 추가할 수도 있다.

    // 배열(ArrayList) 사이에 값 추가하기
    arrayList.add(1, 1000);
    
    // ArrayList 크기 확인(즉, 배열 길이 확인)
    System.out.println(arrayList.size()); // 3
    
    // idx로 값 읽기
    System.out.println(arrayList.get(0)); // 500
    System.out.println(arrayList.get(1)); // 1000
    System.out.println(arrayList.get(2)); // 300

     

    contains 메소드를 사용하면 해당 값을 ArrayList가 갖고 있는 지 확인해 볼 수 있다.

    이때 리턴타입은 boolean이다.

    // 해당 값을 갖고 있는 지 확인
    System.out.println(arrayList.contains(1000)); // true

     

    추가로 앞서 말했던 remove 메소드의 경우 사용법이 두가지이다.

    1. remove(idx)

    2. remove(obj)

    ArrayList 타입이 Integer가 아닐 경우 2번의 방법도 사용가능하다.

    // 값 삭제: remove(idx) / remove(obj)
    ArrayList<String> stringArrayList = new ArrayList<String>();
    
    stringArrayList.add("월");
    stringArrayList.add("화");
    stringArrayList.add("수");
    stringArrayList.add("목");
    stringArrayList.add("금");
    stringArrayList.add("토");
    stringArrayList.add("일");
    
    System.out.println(stringArrayList.size()); // 7
    
    // remove(obj)의 경우 리턴타입 boolean
    System.out.println(stringArrayList.remove("요일")); // false
    System.out.println(stringArrayList.remove("월")); // true
    stringArrayList.remove(5);
    
    System.out.println(stringArrayList.size()); // 5

     

    이미 데이터가 존재할 경우 ArrayList로 생성

    - Arrays.asList()를 사용한다.

    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class ArrayListExample2 {
        public static void main(String[] args) {
            String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
            ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(weeks));
            System.out.println(arrayList); // [월, 화, 수, 목, 금, 토, 일]
    
            ArrayList<String> arrayList2 = new ArrayList<>(Arrays.asList("월", "화", "수", "목", "금", "토", "일"));
            System.out.println(arrayList2); // [월, 화, 수, 목, 금, 토, 일]
        }
    }

     

    ※ cf) [월, 화, 수, 목, 금, 토, 일]이 아닌 "월, 화, 수, 목, 금, 토, 일" 형태로 출력하기

    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class ArrayListExample2 {
        public static void main(String[] args) {
            String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
            ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(weeks));
            System.out.println(arrayList); // [월, 화, 수, 목, 금, 토, 일]
    
            // [월, 화, 수, 목, 금, 토, 일]이 아닌 "월, 화, 수, 목, 금, 토, 일" 형태로 출력하기
            String result = "";
            for (int i = 0; i < arrayList.size(); i++) {
                result += arrayList.get(i);
                result += ", ";  // ", "를 추가한다.
            }
            result = result.substring(0, result.length() - 2);  // 마지막 ", "는 제거한다.
            System.out.println(result);  // 월, 화, 수, 목, 금, 토, 일
        }
    }

     

    String.join을 사용하면 더 쉽게 처리할 수 있다.

    String result2 = String.join(", ", arrayList);
    System.out.println(result2);  // 월, 화, 수, 목, 금, 토, 일

     

    이는 배열(Array)에서도 동일하게 사용할 수 있다.

    String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
    String result = String.join(", ", weeks);
    System.out.println(result);  // 월, 화, 수, 목, 금, 토, 일

     

    Comparator 클래스를 이용한 정렬

    ※ cf) 리스트의 sort  메소드는 Java 8 버전부터 사용할 수 있다.

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Comparator;
    
    public class ArrayListExample2 {
        public static void main(String[] args) {
            ArrayList<String> fruits = new ArrayList<>(Arrays.asList("banana", "apple", "tomato"));
            fruits.sort(Comparator.naturalOrder());  // 오름차순으로 정렬
            System.out.println(fruits);  // [apple, banana, tomato]
            
            fruits.sort(Comparator.reverseOrder());  // 내림차순 정렬
            System.out.println(fruits);  // [tomato, banana, apple]
        }
    }

    참고 및 출처: https://wikidocs.net/207

    728x90
Designed by Tistory.