개발/Java

[Java] 컬렉션

서해쭈꾸미 2024. 4. 22. 20:43

Java의 자료구조인 컬렉션의 종류와 사용법 및 간단한 특징들을 정리해보았다.

 

 

컬렉션 (List, Set, Queue, Map) 종류와 특징

- 컬렉션은 참조형 변수이다 !

 

Collection에는 기본형 변수가 아닌 참조형 변수를 저장한다!

- int의 참조형 변수 = Integer

- long의 참조형 변수 = Long

- double의 참조형 변수 = Double

- String은 원래부터 참조형 변수

 

1. List : 순서가 있는 데이터의 집합(중복가능) = 배열과 비슷

2. Set : 순서가 없는 데이터의 집합(데이터 중복 안됨) = 순서없고 중복없는 배열

3. Queue : FIFO (먼저 넣은 값이 먼저 나옴)

4. Stack : FILO (먼저 넣은 값이 나중에 나옴)

5. Map : 순서가 없는(key,value)쌍으로 이루어진 데이터 집합 (Key 값 중복 안 됨)

 

 

 

 

자바 컬렉션 구조

출처 : https://www.javatpoint.com/collections-in-java

 

 

 

  1. Collection이라는 속성은 Iterable(순회 가능)이라는 속성을 상속받고 있다.
  2. Collection의 하위 ‘속성’으로는 List, Queue, Set 등이 있다.
  3. List의 실제 구현체들은 Arr, Linked, Vector, Stack들이 있다.

 

 

이러한 컬렉션들이 자바에서 어떻게 사용되는지 코드를 통해 알아보자.

 

 

 

 

List (ArrayList) 동적배열
import java.util.ArrayList;

ArrayList<Integer> intList = new ArrayList<Integer>(); //선언 + 생성

//add
intList.add(11); //추가
intList.add(33);
intlist.add(22);

//get
intList.get(0); //가져오기 //11

//set
intList.set(1,10); //1번째에 있는 값(33)을 10으로 바꿈

//remove
intList.remove(0); //0번째에 있는 값(11)을 삭제

//clear
intList.clear(); //list에 있는 값 모두 삭제

//toString
intList.toString() //list 값 전체 출력

 

앞 인덱스의 값을 remove를 통해 삭제하면 남은 값들의 인덱스가 자동으로 한칸씩 당겨진다.

 

 

 

 

linked list

- 메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아둔다.

- 실제값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조

- 기본적 기능은 ArrayList와 동일

- 조회 속도 느리지만, 추가 삭제 속도는 빠르다.

import java.util.LinkedList;

LinkedList<Integer> linkedList = new LinkedList<Integer>();

//추가
linkedList.add(5);
linkedList.add(10);
linkedList.add(3);

//삭제
linkedList.remove(1);

//특정 값 읽기
linkedList.get(0);
linkedList.get(1);
linkedList.get(2);

//전체 값 읽기
linkedList.toString();

//특정 위치에 값 추가
linkedList.add(2,4); //2번째 위치에 4를 추가

//특정 위치 값 업데이트
linkedList.set(1,30); //1번째 위치값을 30으로 업데이트

//전체 비우기
linkedList.clear();

 

 

 

 

 

Stack

- FILO

- 최근 저장된 데이터를 나열하고 싶거나, 데이터 중복 처리 막고 싶을 때 사용하면 된다.

import java.util.Stack;

Stack<Integer> intStack = new Stack<Integer>(); //선언 + 생성
//push, pop, peek

//값 추가
intStack.push(10);

//다 지워질 때까지 출력
while(!intStack.isEmpty()) {
	System.out.println(intStack.pop());
	
//맨 위에 있는 값 보기
intStack.peek();

//size확인
intStack.size();
}

 

 

 

 

 

Queue

- FIFO

- Queue는 생성자가 없는 인터페이스이기때문에 LinkedList로 생성하였다.

import java.util.Queue;
import java.util.LinkedList;

Queue<Integer> intQueue = new LinkedList<>(); //큐 선언, 생성
//add,poll,peek

//add
intQueue.add(1);
intQueue.add(5);
intQueue.add(9);

//offer : add와 같은 역할
intQueue.offer(1);

//peak (just 보기)
intQueue.peek(); //맨 먼저 넣은 값 보기

//size
intQueue.size();

//값 빼서 확인
intQueue.poll();

 

 

offer는 큐에 값 추가를 성공하면 true를 반환하고, 큐가 가득 차서 더 이상 요소를 추가할 수 없는 경우에는 false를 반환한다.

 

offer와 add의 차이점

  • add 함수는 큐에 요소 추가가 실패하면 IllegalStateException 예외를 발생시킨다.
  • offer 함수는 큐에 요소 추가가 실패하면 예외를 발생시키지 않고, false를 반환하여 실패를 처리할 수 있다.

 

 

 

Set

- 그냥 쓸 수도 있지만, HashSet, TreeSet 등으로 응용해서 같이 사용 가능하다.

- Set은 생성자가 없는 껍데기라서 바로 생성할 수 없다.

- HashSet은 생성자 존재하기에 HashSet으로 set을 구현하였다.

import java.util.Set;
import java.util.HashSet;

Set<Integer> intSet = new HashSet<>(); //선언 및 생성

//값 추가
intSet.add(1);
intSet.add(12);
intSet.add(5);
intSet.add(1);

//향상된 for문으로 값 출력하는 방법
for(Integer val : intSet) {
	System.out.println(val); //중복된 1은 하나만 나옴. 1 12 5
}

//iterator 사용하여 값을 출력하는 방법
Iterator iterator = intSet.iterator();
          for (int i = 0; i < intSet.size(); i++) {
			System.out.println(iterator.next());
}

//contains (포함하고있는지 알려주는 함수)
intSet.contains(2); //false

 

Set 컬렉션들 특징

 

1. HashSet : 가장 빠르며 순서를 전혀 예측할 수 없음

2. TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음

3. LinkedHashSet : 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능

 

즉, 보통 HashSet 을 쓰는데 순서 보장이 필요하면 LinkedHashSet 을 주로 사용한다.

 

 

 

 

Map

- key - value pair형태의 자료구조

- Map → HashMap, TreeMap으로 응용가능하다.

import java.util.Map;
import java.util.HashMap;

//선언과 생성
Map<String, Integer> intMap = new HashMap<>();

//키 값
intMap.put("일",12);
intMap.put("이",15);
intMap.put("삼",1);
intMap.put("삼",11); //중복 Key
intMap.put("삼",21); //중복 Key
//중복되는 값은 마지막에 입력된 값으로 덮어쓰기 됨. 삼 = 21


//key만 빼서 배열로 만든 것
intMap.keySet()
//key값 전체 출력
for(String key : intMap.keySet()) {
	System.out.println(key);
}

//value값만 빼서 배열로 만든것
intMap.values()
//value값 전체 출력
for(Integer value: intMap.values()) {
	System.out.println(value);
}

//Key값으로 value값 가져오기
intMap.get("삼");

 

Map 컬렉션들 특징

 

1. HashMap : 중복을 허용하지 않고 순서를 보장하지 않음, 키와 값으로 null이 허용

2. TreeMap : key 값을 기준으로 정렬을 할 수 있다. 다만, 저장 시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸린다.