본문 바로가기

JAVA

컬렉션(자료구조)

Java 프로그래밍에서 배열을 고도화시켜서 컬렉션이라는 이름으로 참조형 자료구조를 제공하고 있다.

컬렉션은 참조형 변수만 저장함으로써 여러 기능을 제공한다.

 

컬렉션은 배열보다 다수의 참조형 데이터를 쉽고 효과적으로 처리할 수 있는 기능을 가지고 있다.

컬렉션은 참조형 변수를 저장한다.

컬렉션 기능

크기 자동조정, 추가, 수정, 삭제, 반복, 순회, 필터, 포함확인 등

컬렉션 종류

  • List : 순서가 있는 데이터의 집합. 데이터 중복 허용 (배열과 비슷)
  • Queue : 원통처럼 한쪽에서 데이터를 넣고 반대쪽에서 뺄 수 있는 집합 (FIFO)
  • Set : 순서가 없는 데이터의 집합. 데이터 중복 허용X. 집합과 비슷 (순서X, 중복X)
  • Map : 순서가 없는 (Key, Value) 쌍으로 이루어진 데이터의 집합. Key값 중복 허용X

List

순서가 있는 데이터의 집합. 데이터 중복 허용.

1. ArrayList

배열(Array)처럼 일렬로 데이터를 저장하고 조회하여 인덱스로 값을 조회할 수 있다.

 

Array는 정적배열, List는 동적배열(크기가 가변적으로 변한다.)

생성 시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아놓는다.

값이 추가될 때 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장한다.

import java.util.ArrayList; // import 필요

기능

  • 선언 : ArrayList<Integer> intList 형태
  • 생성 : new ArrayList<Integer>(); 형태
  • 초기화 : 사이즈를 정하지 않아 초기화 필요 없음
  • 값 추가 : intList.add(추가할 값) 
  • 값 수정 : intList.set(수정할 순번, 수정할 값)
  • 값 삭제 : intList.remove(삭제할 순번)
  • 전체 출력 : intList.toString() 형태로 전체 값을 대괄호로 묶어서 출력 (출력값 예시 : [1,3])
  • 전체 제거 : intList.clear()

2. LinkedList

메모리에 남는 공간을 요청해서 여기저기 나눠 실제값을 담아놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장한다.

특징

기본적인 기능은 ArrayList와 동일

모든 값을 조회하는 속도가 느리다.

값을 추가하거나 삭제할 때는 속도가 빠르다.

중간에 값을 추가하는 기능이 있음(빠름)

기능

  • 선언 : LinkedList<Integer> linkedList
  • 생성 : new LinkedList<Integer>();
  • 초기화 : 사이즈를 정하지 않아 초기화 필요 없음
  • 값 추가 : linkedList.add({추가할 값})
  • 값 중간에 추가 : linkedList.add({추가할 순번}, {추가할 값})
  • 값 수정 : linkedList.set({수정할 순번}, {수정할 값})
  • 값 삭제 : linkedList.remove({삭제할 순번})
  • 전체 출력 : linkedList.toString()
  • 전체 제거 : linkedList.clear()

3. Stack

바구니 모양으로 값을 수직으로 쌓아놓고 넣었다 빼서 조회하는 형식으로 데이터를 관리한다. LIFO

특징

밑에서 위로 쌓고, 꺼낼때는 위에서 부터 꺼낸다.

넣는 push(), 조회하는 peak(), 꺼내는 pop() 기능만 존재한다.

기능

  • 선언 : Stack<Integer> intStack
  • 생성 : new Stack<Integer>();
  • 추가 : intStack.push({추가할 값})
  • 조회 : intStack.peek()
  • 꺼내기 : intStack.pop(). 꺼내고 나면 삭제됨

Queue

원통처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 빼는 집합. FIFO

특징

넣는 기능 add(), 조회 peak(), 꺼내기 poll() 기능만 존재한다.

Queue는 생성자가 없는 껍데기라서 바로 생성할 수는 없다. (껍데기 = 인터페이스)

생성자가 존재하는 클래스인 LinkedList를 사용하여 Queue를 생성해 받을 수 있다.

// LinkedList 를 생성하면 Queue 기능을 할 수 있습니다. (Queue 가 부모/ LinkedList 가 자식이기 떄문)
Queue<Integer> intQueue = new LinkedList<Integer>();

기능

  • 선언 : Queue<Integer> intQueue
  • 생성 : new LinkedList<Integer>();
  • 추가 : intQueue.add({추가할 값})
  • 조회 : intQueue.peek()
  • 꺼내기 : intQueue.poll(). 꺼내고 나면 삭제됨

Set

순서가 없는 데이터의 집합. 집합과 비슷하다.

특징

순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조

Set은 그냥 쓸 수 있지만 HashSet, TreeSet 등으로 응용해서 사용할 수 있다.

생성자가 없는 껍데기라서 바로 생성할 수 없다. (껍데기 = 인터페이스)

생성자가 존재하는 클래스인 HashSet을 이용해 Set을 생성해 받을 수 있다.

기능

  • 선언 : Set<Integer> intSet
  • 생성 : new HashSet<Integer>();
  • 추가 : intSet.add({추가할 값})
  • 조회 : intSet.get({초회할 순번})
  • 삭제 : intSet.remove({삭제할 값})
  • 포함 확인 : intSet.contains({포함확인 할 값}). 해당 값이 포함되어 있는지 boolean값으로 응답 받는다.

추가

  • HashSet : 가장 빠르며 순서를 전혀 예측할 수 없음
  • TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음
  • LinkedHashSet : 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능

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

map

Key - Value 구조로 된 데이터를 저장할 수 있다.

특징

기존 순번으로 조회하던 방식에서 key값을 기준으로 value를 조회할 수 있다.

key값 단위로 중복을 허용하지 않는다.

그냥 Map으로 쓸 수 있지만 HashMap, TreeMap 등으로 사용할 수 있다.

기능

  • 선언 : Map<String, Integer> intMap 형태로 key타입과 value타입을 지정해 선언한다.
  • 생성 : new HashMap<>();
  • 추가 : intMap.put({추가할 Key값},{추가할 Value값})
  • 조회 : intMap.get({조회할 Key값})
  • 전체 key 조회 : intMap.keySet()
  • 전체 value 조회 : intMap.values()
  • 삭제 : intMap.remove({삭제할 Key값})

추가

  • HashMap : 중복을 허용하지 않고 순서를 보장하지 않음 , 키와 값으로 null이 허용
  • TreeMap : key 값을 기준으로 정렬을 할 수 있습니다. 다만, 저장시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸림

 

+ length vs length() vs size() - 길이값 가져오기

1. length

  • arrays(int[ ], double[ ], String[ ])
  • 배열의 길이를 조회

2. length()

  • String related Object(String, StringBuilder etc)
  • 문자열의 길이를 조회 (ex. “ABCD”.length() == 4)

3. size()

  • Collection Object(ArrayList, Set etc)
  • 컬렉션 타입목록의 길이를 조회

'JAVA' 카테고리의 다른 글

[JAVA] DTO와 VO  (0) 2023.05.01
Annotation 어노테이션  (0) 2023.04.12
배열(자료구조) Array  (0) 2023.04.04
반복문  (0) 2023.04.04
조건문  (0) 2023.04.04