본문 바로가기
BackEnd/Java

[Java] 컬렉션 프레임워크(collection framework) 이야기 1부 - List

by 뽀뽀이v 2020. 9. 17.

최근 알고리즘에서 또는 JPA는 자바에서 기본으로 제공하는 Collection을 지원하고 있기 때문에 한번 정리할 필요성을 느꼈다.

Collection Framework

List Collection

색인(Index)을 사용하여 특정 위치에 요소를 삽입하거나 접근할 수 있으며 중복 요소를 허용한다.

ArrayList&Vector

방식의 차이만 있을 뿐 사용방법은 거의 동일하다.

ArrayList Vector
비동기 방식이다.
동기방식을 사용하더라도 Collections 클래스의 synchronized로 구현한다.
동기 방식이다.
데이터의 안정화를 보장하나 성능적인 측면에서 많이 부족하다.

ArrayList vs Array

ArrayList Array
사이즈가 동적이다.
추가시 메모리가 재할당되어 속도가 느리다.
다차원 구현이 불가능 하다.
사이즈가 고정이다.
초기화시 메모리에 할당되어 속도가 빠르다.
다차원 배열을 구현할 수 있다.
public class Main {
    public static void main(String[] args) {
        // Array
        System.out.println("==== Array ====");
        String[] strings = {"g", "f", "e", "d", "c", "b", "a", "1", "2", "3", "4"};

        // sort - 전
        System.out.print("sort - 전 : ");
        for (String str : strings) {
            System.out.print(str);
        }
        System.out.println();
        Arrays.sort(strings);

        // sort - 후
        System.out.print("sort - 후 : ");
        for (String str : strings) {
            System.out.print(str);
        }
        System.out.println();

        // ArrayList
        System.out.println("==== ArrayList ====");
        List<String> list = Arrays.asList(strings);
        Collections.reverse(list);

        // foreach - 1
        System.out.print("foreach - 1 : ");
        for (String s : list) {
            System.out.print(s);
        }
        System.out.println();
        Collections.sort(list);

        // foreach - 2
        System.out.print("foreach - 2 : ");
        list.forEach((s) -> System.out.print(s));
    }
}
==== Array ====
sort - 전 : gfedcba1234
sort - 후 : 1234abcdefg
==== ArrayList ====
foreach - 1 : gfedcba4321
foreach - 2 : 1234abcdefg

LinkedList

ArrayList는 정말로 순차적인 묶음으로 자료를 저장한다고 생각하면 되고, LinkedList는 떨어져 있는 데이터들에게 주소를 서로 연결만 시켜줬다고 생각하면 이해하기가 수월하겠다. 즉 Index 2번째 데이터를 가져오려고 한다면 ArrayList는 한 번에 2번째 데이터를 가져온다. 그러나 LinkedList는 순차적으로 데이터에 접근하기 때문에 0번째, 1번째 데이터를 다 접근한 후 2번째 데이터를 가져온다.  순차적인 것이 보장된다면 LinkedList가 성능적으로 좋을 것이고, 순차적이지 않다면 ArrayList가 더 좋다고 보면 된다. LinkedList는 순차적으로 접근하기 때문에 First In First Out인 Queue를 구현하는데 많이 사용한다.

public class Main {
    public static void main(String[] args) {
        // linkedList
        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add(0, "첫째 - 1");
        linkedList.addFirst("첫째 - 2");
        linkedList.addLast("둘째 - 1");
        linkedList.offer("첫째 - 3");
        linkedList.add(3, "첫째 - 4");

        System.out.println("==== linkedList - 1 ====");
        linkedList.forEach((s) -> System.out.println(s));
        System.out.println();

        System.out.println("peek : " + linkedList.peek()); // 첫번째 넣은 요소 리턴
        System.out.println("pop : " + linkedList.pop()); // 첫번째 넣은 요소 리턴 후 삭제
        System.out.println();

        System.out.println("==== linkedList - 2 ====");
        linkedList.forEach((s) -> System.out.println(s));
    }
}
==== linkedList - 1 ====
첫째 - 2
첫째 - 1
둘째 - 1
첫째 - 4
첫째 - 3

peek : 첫째 - 2
pop : 첫째 - 2

==== linkedList - 2 ====
첫째 - 1
둘째 - 1
첫째 - 4
첫째 - 3

 

댓글