1220 TIL: 컬렉션 프레임워크 ArrayList

hjern·2023년 12월 20일

자바의 정석

목록 보기
2/3

컬렉션(collection)

여러 객체(데이터)를 모아 놓은 것을 의미

프레임웍(framework)

표준화, 정형화된 체계적인 프로그래밍 방식

컬렉션 프레임웍(collections framework)

컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식

컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공

컬렉션 클래스(collection class)

다수의 데이터를 저장할 수 있는 클래스(예, Vector, ArrayList, HashSet)

컬렉션 프레임워크의 핵심 인터페이스

List 인터페이스(저장 순서 O, 데이터 중복 O)

  • ArrayList

    • Vector는 자체적으로 동기화처리가 되어 있으나 ArrayList는 그렇지 않다.

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

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

      • 장점 : 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간(접근 시간, access time)이 짧다.

      • 단점 1 : 크기를 변경할 수 없다.

        • 크기를 변경해야 하는 경우 새로운 배열을 생성 후 데이터를 복사해야함.
        • 크기 변경을 피하기 위해 충분히 큰 배열을 생성하면, 메모리가 낭비됨.
      • 단점 2 : 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다.

        • 데이터를 추가하거나 삭제하기 위해, 다른 데이터를 옮겨야 함.
        • 그러나 순차적인 데이터 추가(끝에 추가)와 삭제(끝부터 삭제)는 빠르다.
      • 예제

        			public static void main(String[] args) {
        
        			ArrayList list1 = new ArrayList(10);
        			// ArrayList 에는 객체만 저장 가능하지만,
        			// 오토박싱에 의해서 기본형이 참조형으로 자동 변환됨
        			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));
        
        			// subList(1,4) 배열 1~3까지 뽑아서 새로운 배열을 생성
        			// {4, 2, 0}
        			ArrayList list2 = new ArrayList(list1.subList(1,4));
        			System.out.println("list1 = " + list1); // list1 = [5, 4, 2, 0, 1, 3]
        			System.out.println("list2 = " + list2); // list2 = [4, 2, 0]
        
        			Collections.sort(list1); // list1과 list2를 정렬한다(오름차순)
        			Collections.sort(list2);
        			System.out.println("list1 = " + list1); // list1 = [0, 1, 2, 3, 4, 5]
        			System.out.println("list2 = " + list2); // list2 = [0, 2, 4]
        
        			// list2 에 속한 값이 list1 에 모두 속하는지 확인
        			System.out.println("list1.containsAll(list2) = " + list1.containsAll(list2));
        			// list1.containsAll(list2) = true
        
        			list2.add("B");
        			list2.add("C");
        			list2.add(3,"A");
        			System.out.println("list2 = " + list2); // list2 = [0, 2, 4, A, B, C]
        
        			list2.set(3,"AA");
        			System.out.println("list2 = " + list2); // list2 = [0, 2, 4, AA, B, C]
        
        			// list1에서 list2와 겹치는 부분만 남기고 나머지는 삭제한다.
        			System.out.println("list1.retainAll(list2) = " + list1.retainAll(list2));
        			// list1.retainAll(list2) = true
        			System.out.println("list1 = " + list1); // list1 = [0, 2, 4]
        
        			list1.add(0,"1");
        			list1.add(4,2);
        			System.out.println("list1 = " + list1); // list1 = [1, 0, 2, 4, 2]
        			// 이때 1은 문자열 "1"
        			System.out.println("list1.indexOf(\"1\") = " + list1.indexOf("1"));
        			// list1.indexOf("1") = 0
        			System.out.println("list1.indexOf(\"1\") = " + list1.indexOf(1)); 
        			// 없는 데이터 -- -1 반환
        			// list1.indexOf("1") = -1
        
        			list1.remove(1); // 배열(Index)에서 데이터를 삭제 시킴
        			System.out.println("list1 = " + list1); // list1 = [1, 2, 4, 2]
        			list1.remove(new Integer(2)); // 실제 값을 삭제 시키기 위해선 Integer 사용
        			System.out.println("list1 = " + list1); // list1 = [1, 4, 2]
        			list1.remove(new String("1")); // 실제 값을 삭제 시키기 위해선 String 사용
        			System.out.println("list1 = " + list1); // list1 = [4, 2]
        
        			list1.add(3);
        			list1.add(6);
        			list1.add(8);
        			list1.add(0);
        			list1.add("5");
        			System.out.println("list1 = " + list1); // list1 = [4, 2, 3, 6, 8, 0, 5]
        			System.out.println("list2 = " + list2); // list2 = [0, 2, 4, AA, B, C]
        
        			// list2에서 List1에 포함된 객체들을 삭제한다.
        			for(int i = list2.size()-1; i>=0; i--){ // 배열은 0부터 시작하므로 -1
        				if(list1.contains(list2.get(i))){ // list2에서 꺼낸 i가 list1에 포함되면
        					list2.remove(i); // list2에서 i를 지운다.
        				}
        			}
        
        			System.out.println("list2 = " + list2); // list2 = [AA, B, C]
        		}

참고자료
[자바의 정석 - 기초편] ch11-7~11 ArrayList

profile
주니어의 굴레는 언제 벗어날 것인가

0개의 댓글