Java

[collection] List, Set, Map

berryberries 2023. 11. 2. 00:55

 

List, Set, Map은 자바의 컬렉션 프레임 워크의 핵심 인터페이스이다.

 

컬렉션 프레임워크는 다수의 객체를 다루기 위한 표준화된 프로그래밍 방식 이라고 생각하면 이해가 편하다!

한마디로 자바에서는 다수의 객체를 다룰 때 List, Set, Map을 사용해서 프로그래밍 한다.

 

1. List

  • 데이터의 중복을 허용해준다
  • 저장순서가 유지된다.
  • 인덱스로 원소의 주소로 접근을 할 수 있다.

✔ 주요 구현 클래스

1) ArrayList

ArrayList<String> arraylist = new ArrayList<String>();

    //add = 추가하는 메소드
    arraylist.add("첫번째");
    arraylist.add("A");
    arraylist.add("세번째");
    arraylist.add(3,"A");

    System.out.println("arraylist에 담긴 문자 : " + arraylist);
    // arraylist에 담긴 문자 : [첫번째, A, 세번째, A]

    System.out.println("arraylist [2] : " + arraylist.get(2));
    // arraylist [1] : 세번째

    // set : 변경
    arraylist.set(2, "수정!");
    System.out.println("arraylist [2], index0f() : " + arraylist.indexOf("수정!"));
    // arraylist [2], index0f() : 2

    System.out.println("arraylist [2] : " + arraylist.get(2));
    // arraylist [2] : 수정!

    System.out.println("arraylist : " + arraylist);
    // arraylist : [첫번째, A, 수정!, A]

    // remove : 제거
    arraylist.remove(0);
    System.out.println("arraylist : " + arraylist);
    // arraylist : [A, 수정!, A]

 

2) LinkedList

LinkedList<Integer> linked = new LinkedList<Integer>(Arrays.asList(4,5));
		
    linked.addFirst(1);
    linked.add(3);
    linked.addLast(2);

    System.out.println(linked);
    // [1, 4, 5, 3, 2]

    linked.remove(2);
    System.out.println(linked);
    // [1, 4, 3, 2]

    // 요소로 인덱스 찾기
    linked.indexOf(4);
    System.out.println(linked.indexOf(4));
    // 1

    // 인덱스로 요소찾기
    linked.get(1);
    System.out.println(linked.get(1));
    //4

 


 

arraylist와 linkedlist의 차이점

  Arraylist LinkedList
추가/삭제 시간 느림 빠름
접근시간 빠름 느림

 

  • 접근시간
    • arraylist는 배열 안에 연속적으로 존재한다. + 인덱스주소로 빠르게 찾을 수 있음
    • linkedlist는 불연속적으로 위치한 요소들이 서로 연결되어 있기 때문에 처음부터 n번째 까지 따라가야해서 느리다 -> 데이터 많을수록 접근성 감소
  • 추가/ 삭제 시간
    • arraylist는 배열의 중간에 데이터를 수정하면 배열을 복사해 삭제/추가하기 떄문에 작업시간이 증가 -> 순차으로 추가/ 삭제는 빠름
    • linkedlist는 노드 연결로 이루어졌기 때문에 복사할 필요 없이 해당 노드 앞에 있는 노드와 연결을 끊고 삭제/추가 후 다시 연결해서 작업시간이 빠르다.

 

2. Set

  • 데이터의 중복을 허용하지 않는다
  • 저장순서가 유지되지 않는다
  • 인덱스가 따로 없고 iterator을 사용해서 원소의 주소로 접근한다.

✔ 주요 구현 클래스

1) HashSet

HashSet<String> set = new HashSet<String>(Arrays.asList("체리"));
		
    // add() : 추가
    set.add("사과");
    set.add("망고");
    set.add("망고");

    // 중복데이터 추가 안됨.
    System.out.println("set에 들어있는 단어 : " + set); // set에 들어있는 단어 : [체리, 망고, 사과]

    // remove() : 삭제
    set.remove("망고");
    System.out.println("set에 들어있는 단어 : " + set); // set에 들어있는 단어 : [체리, 사과]

    // size() : 저장된 요소 수
    System.out.println("set 크기 : " + set.size()); // set 크기 : 2

    // set은 get()으로 요소를 가져올 수 없음 
    // -> iterator()를 사용해서 전체 객체를 한번씩 반복해서 가져와야 한다.
    Iterator it = set.iterator();
    while(it.hasNext()) {
        System.out.println(it.next());
        // 체리
        // 사과
    }
    
    // contains() : set내부에 요소 찾기 있으면 true, 없으면 false
    System.out.println(set.contains("망고")); // false
    System.out.println(set.contains("사과")); // true

 

2) TreeSet

TreeSet<Integer> A = new TreeSet<Integer>();

    A.add(1);
    A.add(2);
    A.add(3);
    A.add(4);
    A.add(5);
    A.add(6);

    System.out.println("A에 담긴 숫자 : " + A); // A에 담긴 숫자 : [1, 2, 3, 4, 5, 6]
    System.out.println("A의 크기 : " + A.size()); // A의 크기 : 6
    System.out.println("A의 최소값 : " + A.first()); // A의 최소값 : 1
    System.out.println("A의 최대값 : " + A.last()); // A의 최대값 : 6
    System.out.println("A에 3이 있나요? " + A.contains(3)); // A에 3이 있나요? true
    System.out.println("3 이상! : "+ A.headSet(3) ); // 3 이상! : [1, 2]
    System.out.println("3 이하! : "+ A.tailSet(3)); // 3 이하! : [3, 4, 5, 6]

 

3. Map

  •  key와 value 쌍으로 이루어진 데이터집합
  • 저장순서가 유지되지 않는다
  • key는 중복이 허용되지 않으나 value는 중복이 허용된다

✔ 주요 구현 클래스

1) HashMap

HashMap map = new HashMap();
		
map.put("사과", "빨강");
map.put("오렌지", "주황색");
map.put("바나나","노랑색");

System.out.println(map); // {오렌지=주황색, 사과=빨강, 바나나=노랑색}

4. 요약

인터페이스 특징
List 순서 : 순서가 있는 데이터 집합
중복 : 데이터 중복을 허용한다
Set 순서 : 순서를 유지하지 않는 데이터 집합
중복 : 중복을 허용하지 않는다
Map 순서 : 순서를 유지하지 않는 데이터 집합
중복 :  키 (Key) - 중복을 허용하지 않는다
값 (Value) - 중복을 허용한다.