본문 바로가기

Java

Java (컬렉션 프레임워크)

컬렉션 프레임워크란 int [ ] array = new int [3]; 와 같이 배열의 크기를 정해두고, 각 인덱스 값에 모두 값을 넣게 된다면, 또 값을 넣기 위해서는 새로운 배열을 생성하였어야 한다. 하지만 컬렉션 프레임워크는 배열과는 다르게 원하는 만큼 데이터를 넣거나 삭제하는 것이 가능하며 컬렉션 내에 데이터가 있는지 탐색을 한다거나 정렬을 하는 등, 다양하게 이용이 된다.

 

컬렉션 프레임워크는 대표적으로 List, Set, Map이 있다. 

 

List는 순서가 있는 데이터 집합으로 중복된 요소를 허용한다. 

 

Set은 순서가 없는 데이터 집합으로 중복된 요소를 허용하지 않는다. 

 

Map은 키와 값으로 데이터를 저장하며 데이터의 순서를 보장하지 않으며, Key는 중복을 허용하지 않는다.

 

 

ArrayList, LinkedList

 

ArrayList는 List 인터페이스를 구현한 클래스로, 데이터를 배열 형태로 저장합니다. 특징은 다음과 같습니다. 데이터를 순차적으로 저장하며, 인덱스로 접근 가능합니다. 중복된 요소를 허용합니다. 크기가 가변적이며, 요소 추가 및 삭제 시 크기가 자동으로 조절됩니다. 데이터를 검색 및 접근할 때는 인덱스를 사용하므로 빠른 접근이 가능합니다.

 

- 데이터를 순차적으로 저장하며, 인덱스로 접근 가능합니다. 

- 중복된 요소를 허용합니다. 

- 크기가 가변적이며, 요소 추가 및 삭제 시 크기가 자동으로 조절됩니다. 

- 데이터를 검색 및 접근할 때는 인덱스를 사용하므로 빠른 접근이 가능합니다.

 

ArrayList<String> list = new ArrayList<>();
list.add("박명수");
list.add("조세호");
list.add("김종국");
list.add("박명수");
list.add("소진영");

System.out.println(list.get(0)); // "박명수" 출력
System.out.println(list.size()); // 리스트 크기 출력
list.remove("박명수"); // "박명수" 요소 제거

 

각 메소드를 정리를 해보자면,

// list.add(), list.get(), list.size(), list.remove(), list.clear(), list.set( , ), list.contains()
// 괄호 안에 인덱스를 써서 활용도 가능하지만 리스트 안 데이터를 형을 그대로 써서도 활용이 가능하다
// 예시 ) list.remove("박명수"); list.remove(3); or  list.set(0, "이수근"); or list.contains("김종국")
// 참고로 set은 원하는 위치에 원하는 값을 넣도록 하는 것이며, clear는 전체 삭제 remove는 원하는 값만 삭제
// 추가로 isEmpty는 비어있는가? 를 물어보는 것으로 비어있을 경우가 참으로 판정된다.

        if (list.isEmpty()) {
            System.out.println("학생 수 : " + list.size());
            System.out.println("리스트가 비었습니다.");
        }

 

 

LinkedList는 List 인터페이스를 구현한 클래스로, 각 데이터 요소가 노드로 연결된 형태로 저장됩니다. 특징은 다음과 같습니다.

 

- 데이터가 노드로 연결되어 있어, 중간에 요소를 삽입하거나 삭제하기 용이합니다.

- 중복된 요소를 허용합니다. 데이터 요소 간의 연결을 통해 순회 및 조작이 가능합니다.

- 요소를 추가하거나 삭제할 때, 연결 구조를 변경하므로 ArrayList보다 삽입 및 삭제 성능이 빠를 수 있습니다.

 

LinkedList<String> list = new LinkedList<>();
list.add("박명수");
list.add("조세호");
list.add("김종국");
list.add("박명수");
list.add("강호동");

System.out.println(list.get(0)); // "박명수" 출력
System.out.println(list.size()); // 리스트 크기 출력
list.addFirst("서장훈"); // 맨 앞에 요소 추가
list.addLast("김희철"); // 맨 뒤에 요소 추가
list.add(1, "김영철"); // 지정된 위치에 요소 추가

 

HashSet 

HashSet은 Set 인터페이스를 구현한 클래스로, 중복된 요소를 허용하지 않는 데이터 집합을 나타냅니다. 특징은 다음과 같습니다. 

 

- 중복된 요소를 허용하지 않으므로 중복 데이터를 저장하지 않습니다.

- 데이터의 순서를 보장하지 않습니다. 

- 데이터 조회 시 순서가 고려되지 않으므로 순서와 관련된 작업은 수행할 수 없습니다.

HashSet<String> set = new HashSet<>();
set.add("삼겹살");
set.add("쌈장");
set.add("음료");
set.add("소금");
set.add("후추");
set.add("삼겹살"); // 중복된 "삼겹살" 요소는 추가되지 않음
set.remove("삼겹살"); // "삼겹살" 요소 제거

 

HashMap 

HashMap은 Map 인터페이스를 구현한 클래스로, Key-Value 쌍으로 데이터를 저장하는 자료 구조입니다. Key를 통해 Value를 검색할 수 있으며, Key는 중복되지 않습니다. 특징은 다음과 같습니다. 

 

- Key-Value 쌍으로 데이터를 저장하며, Key를 통해 Value에 접근합니다. 

- Key는 중복되지 않으며, 동일한 Key를 가진 데이터는 덮어쓰게 됩니다. 

- 데이터의 순서를 보장하지 않으므로 순서와 관련된 작업은 수행할 수 없습니다.

 

HashMap<String, Integer> map = new HashMap<>();
map.put("유재석", 10); // Key "유재석"에 해당하는 Value 10 저장
map.put("박명수", 5);
map.put("김종국", 3);
map.put("서장훈", 15);

System.out.println(map.get("유재석")); // Key "유재석"에 해당하는 Value 출력
map.remove("유재석"); // Key "유재석"에 해당하는 데이터 제거

 

이제 각각 어떠한 상황에서 쓰이는 건지 알아보겠습니다.

 

ArrayList 

사용 상황: 순서가 중요하고, 데이터를 자주 읽는 경우에 유용합니다. 데이터를 추가/삭제보다는 읽기 연산이 많은 경우에 성능이 좋습니다. 

예시: 학생 명단, 도서 목록 등 순차적인 데이터를 저장하고 조회하는 경우. 

 

LinkedList

사용 상황: 데이터를 자주 추가/삭제해야 할 때 유용합니다. 특히 리스트의 중간에 요소를 추가/삭제할 때 ArrayList보다 성능이 우수합니다. 

예시: 큐(Queue)나 스택(Stack)과 같은 데이터 구조, 노드 기반 자료 구조 등. 

 

HashSet

사용 상황: 중복을 허용하지 않고, 순서가 중요하지 않은 경우에 사용됩니다. 고유한 값을 저장하거나 검색할 때 유용하다. 

예시: 고유한 아이디 목록, 해시 테이블 등. 

 

HashMap

사용 상황: 키-값(Key-Value) 쌍으로 데이터를 저장하고 검색할 때 사용됩니다. 특히 데이터를 검색하기 위해 키를 사용하는 경우에 유용합니다. 

예시: 사용자 정보를 키와 값으로 연결, 단어와 그 뜻을 매핑하는 경우 등.

 

'Java' 카테고리의 다른 글

Java (람다와 함수 인터페이스)  (1) 2024.01.07
Java (익명 클래스)  (1) 2024.01.06
Java (제네릭스)  (1) 2024.01.04
Java (추상 클래스와 인터페이스, 의존성 주입)  (2) 2024.01.03
Java (클래스)  (2) 2024.01.02