자바 정복 일기 - 컬렉션

Bex·2023년 8월 14일
0
post-thumbnail

이번에는 자바 컬렉션(Collection)에 대해 정리 해보자.

1. 컬렉션

컬렉션(Collection)이란?

  • 컬렉션이란 많은 수의 데이터를 그 사용 목적에 적합한 자료구조로 묶어 하나로 그룹화한 객체를 의미한다.
  • 예를 들어 ArrayList, LinkedList 등이 존재한다.

JCF(Java Collections Framework)란?

  • 자바 컬렉션 프레임워크데이터를 저장하는 기본적인 자료구조들을 한 곳에 모아 관리하고 편하게 사용하기 위해서 제공하는 것을 의미한다.
  • 아래 그림은 자바 컬렉션 프레임워크의 상속구조를 보여준다.

1) 컬렉션을 사용하는 이유

  1. 일관된 API
    • Collection의 일관된 API를 사용하여 Collection 밑에 있는 모든 클래스 Collection에서 상속받아 통일된 메서드를 사용하게 됨
  2. 프로그래밍 노력 감소
    • 객체 지향 프로그래밍의 추상화의 기본 개념이 성공적으로 구현됨
  3. 프로그램 속도 및 품질 향상
    • 유용한 데이터 구조 및 알고리즘을 통해 성능을 향상

2) 컬렉션 종류 및 특징

컬렉션은 크게 사용 용도에 따라 크게 List, Set, Map 4가지로 나눌 수 있다.

(1) List Interface(순서 O / 중복 O)

  • List 인터페이스정렬된 모든 객체 컬렉션을 저장할 수 있는 목록 데이터 전용이다.
  • 대표적으로 ArrayList, Vector, Stack 등이 존재한다.

 ① ArrayList란

  • 단방향 포인터 구조
  • 각 데이터에 대한 index를 가지고 있어 조회 기능이 뛰어나다.
  • 데이터의 삽입/삭제가 빈번할 경우 비효율적
// ArrayList 사용 예제
public class ArrayListExample {
    public static void main(String[] args) {
        // ArrayList 선언
        ArrayList<String> umcCleaner = new ArrayList<>();

        // ArrayList에 데이터 입력
        umcCleaner.add("벡스");
        umcCleaner.add("헤론");
        umcCleaner.add("진로");

        // 결과 출력
        System.out.println("4기 동방 지키미 : " + umcCleaner);

        // 1, 2번 데이터 제거
        umcCleaner.remove(0);
        umcCleaner.remove(0);

        // 데이터 추가
        umcCleaner.add("리우");
        umcCleaner.add("리버");

        // 하나씩 결과 출력
        System.out.print("5기 동방 지키미 : ");
        for(String member : umcCleaner) System.out.print(member + " ");
    }
}

위의 코드의 결과는 다음과 같다.


 ② LinkedList란

  • 양방향 포인터 구조
  • 데이터의 위치 정보만 수정하면 되기 때문에 삽입, 삭제가 빈번할 경우 유용
  • 검색은 ArrayList에 비해 비효율적
  • 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 사용됨
  // LinkedList 사용 예제
  public class LinkedListExample {
    public static void main(String[] args) {
        // LinkedList 선언
        LinkedList<String> umc5Manager = new LinkedList<>();
        
        // 값 입력
        umc5Manager.add("벡스");
        umc5Manager.add("헤론");

        // 결과 출력
        System.out.println("4기 운영진 : " + umc5Manager);

        // 1번 데이터 제거
        umc5Manager.remove(1);

        // 데이터 추가
        umc5Manager.add("진로");
        umc5Manager.add("리우");
        umc5Manager.add("시미");

        // 하나씩 결과 출력
        System.out.print("5기 운영진 : ");
        for(String member : umc5Manager) System.out.print(member + " ");
    }
}

위의 코드의 결과는 다음과 같다.


 ③ Vector란

  • 동적 크기 배열
  • 배열과 마찬가지로 index로 접근 가능
  • 동기화(Thread Safe) 되어있어, 한 번에 하나의 쓰레드만 벡터의 메서드를 호출 가능
  • 멀티 쓰레드 환경이 아닌 경우, ArrayList를 사용하는 것이 성능 면에서 바람직 할 수 있음
  // Vector 사용 예제
  public class VectorExample {
    public static void main(String[] args) {
        // Vector 선언
        Vector<String> bexBrother = new Vector<>();

        // 값 입력
        bexBrother.add("헤론");
        bexBrother.add("진로");
        bexBrother.add("메렁");

        // 결과 출력
        System.out.println("Bex's 형들 : " + bexBrother);

        // 3번 데이터 제거
        bexBrother.remove(2);

        // 데이터 추가
        bexBrother.add("리우");
        bexBrother.add("시미");
        bexBrother.add("망고");

        // 하나씩 결과 출력
        System.out.print("Bex's 형들 : ");
        for(String member : bexBrother) System.out.print(member + " ");
    }
}

위의 코드의 결과는 다음과 같다.


(2) Set Interface(순서 X, 중복 X)

  • Set 인터페이스순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용되는 인터페이스이다.
  • 중복을 허용하지 않아 고유한 데이터만 저장해야하는 경우 사용

① HashSet이란

  • 해시 알고리즘을 사용한 가자으 빠른 임의 접근 속도를 가짐
  • 순서를 예측할 수 없음
  // HashSet 사용 예제
  public class HashSetExample {
    public static void main(String[] args) {
        // HashSet 선언 및 데이터 입력
        HashSet<String> umcCleaner = new HashSet<>();
        umcCleaner.add("벡스");
        umcCleaner.add("헤론");
        umcCleaner.add("진로");

        // Traversing elements
        for (String s : umcCleaner) {
            System.out.println(s);
        }
    }
}

위의 코드의 결과는 다음과 같다. 입력된 값이 정렬된 것을 볼 수 있다.


② TreeSet이란

  • 이진 탐색 트리(BST) 형태로 데이터를 저장
  • 검색에 뛰어난 성능을 보임
  • BST의 성능을 향상시킨 레드-블랙 트리로 구현
  // TreeSet 사용 예제
  public class TreeSetExample {
    public static void main(String[] args) {
        // TreeSet 변수 선언 및 데이터 입력
        TreeSet<String> umcManager = new TreeSet<>();

        umcManager.add("벡스");
        umcManager.add("진로");
        umcManager.add("시미");
        umcManager.add("리우");
        
        // Traversing elements
        Iterator<String> iter = umcManager.iterator();
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
    }
}

위의 코드의 결과는 다음과 같다.


(3) Map Interface(순서 X, 중복 △)

  • Map 인터페이스키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용
  • 키(Key)는 중복될 수 없지만, 값(Value)는 중복 가능

 ① HashMap이란

  • 중복과 순서가 허용되지 않음
  • Value에 null값을 넣을 수 있음
  // HahsMap 사용 예제
public class HashMapExample {
    public static void main(String[] args) {
        // HashMap 선언 및 데이터 입력
        HashMap<String, String> umcManagement = new HashMap<>();

        umcManagement.put("회장", "벡스");
        umcManagement.put("총무", "리우");
        umcManagement.put("스프링 파트장", "진로");
        umcManagement.put("웹 파트장", "시미");
        umcManagement.put("안드로이드 파트장", null);

        // 첫번째 결과 출력
        System.out.println("이번 5기 회장은 " + umcManagement.get("회장"));

        // 전체 결과 출력
        for(Map.Entry<String, String> e : umcManagement.entrySet())
            System.out.println(e.getKey() + " : " + e.getValue());
    }
}

위의 코드의 결과는 다음과 같다.


 ② TreeMap이란

  • 정렬된 순서대로 Key와 Value를 저장하여 검색이 빠름
  // HahsMap 사용 예제
  public class TreeMapExample {
    public static void main(String[] args) {
        // TreeMap 선언 및 데이터 입력
        TreeMap<String, String> umcManagement = new TreeMap<>();

        umcManagement.put("회장", "벡스");
        umcManagement.put("총무", "리우");
        umcManagement.put("스프링 파트장", "진로");
        umcManagement.put("웹 파트장", "시미");

        // 첫번째 결과 출력
        System.out.println("이번 5기 회장은 " + umcManagement.get("회장"));

        // 전체 결과 출력
        for(Map.Entry<String, String> e : umcManagement.entrySet())
            System.out.println(e.getKey() + " : " + e.getValue());
    }
}

위의 코드의 결과는 다음과 같다. HashMap과 달리 Key에 따라 정렬된 순서로 나온것을 알 수 있다.


 ③ HashTable이란

  • HashMap보다 느리지만 동기화를 지원
  • Value에 null을 허용하지 않음
  // HashTable 사용 예제
  public class HashTableExample {
    public static void main(String[] args) {
        // HashMap 선언 및 데이터 입력
        Hashtable<String, String> umcManagement = new Hashtable<>();

        umcManagement.put("회장", "벡스");
        umcManagement.put("총무", "리우");
        umcManagement.put("스프링 파트장", "진로");
        umcManagement.put("웹 파트장", "시미");
        // umcManagement.put("안드로이드 파트장", null); 에러 발생

        // 첫번째 결과 출력
        System.out.println("이번 5기 회장은 " + umcManagement.get("회장"));

        // 전체 결과 출력
        for(Map.Entry<String, String> e : umcManagement.entrySet())
            System.out.println(e.getKey() + " : " + e.getValue());
    }
}

위의 코드의 결과는 다음과 같다.


참고자료

[JAVA] 컬렉션(Collection)이란?(추가 : Collecion의 요소 상세설명)
[JAVA] Java 컬렉션(Collection) 정리
[JAVA] Java Collection Framework (JCF)의 이해.

profile
초보 개발자의 코딩 일기

2개의 댓글

comment-user-thumbnail
2023년 8월 14일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기
comment-user-thumbnail
2023년 8월 15일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기