JAVA - java.util 패키지 - Collection 관련

TopOfTheHead·2025년 9월 26일

자바 ( JAVA )

목록 보기
7/23

배열( Array ) ex ) int[] , String[]..
n개의 요소로 저장된 정수형 배열의 경우 int[] a = new int[n]
[ 0 , 0 , 0 , 0 , 0 ]의 정수형 배열 생성
。배열 : new int[n]

。배열변수( array variable ) : a
▶ 배열을 참조하는 참조변수

。이때 newinitializer를 의미

  • array initializer로 배열 선언
    。배열 초기화를 통해 각 구성요소를 특정값으로 초기화 가능.

    int[] a = { 1 , 2,3,4,5 }
    int[] a = new int[]{ 1, 2, 3, 4, 5 } 와 같은 의미
    [ 1,2,3,4,5 ]의 정수형 배열 생성

  • 배열.clone() :
    。배열을 복제하여 복제한 배열에 대한 참조를 생성
int[] a = {1,2,3,4}
int[] b = a.clone() 
// 배열 {1,2,3,4}에 대한 참조가 아닌 새로운 배열 {1,2,3,4} 생성 후 참조

Java에서 구현된 전체 자료구조
。크게 List , Set , Queue , Map으로 구별
List : 순서가 존재
Set : 순서가 존재하지 않음
Queue : FIFO
Map : Key-Value 쌍으로 저장

List , Set , QueueCollection Interface를 확장한 Interface
Map은 별도로 java.util.Map으로 Interface로서 선언됨


Collection : java.util.Collection
。여러개의 객체를 단일 객체에 담아 저장 및 처리 시 공통적으로 사용되는 여러 Method를 선언한 Interface
Java에서 기본적으로 제공하는 자료구조( List , Set , Queue 등 )가 확장

public interface Collection<E> extends Iterable<E>
Iterable Interface 를 확장
▶ 데이터를 순차적으로 가져올 수 있다.

  • 자료구조.of( 데이터 요소 )
    static method로서 final 키워드만으로 불변특성을 부여하지 못하는 자료구조 불변객체를 생성 시 사용.
    ▶ 생성된 List는 수정이 불가능 ( 수정, 삭제, 변경 불가능 )
    병렬 프로그래밍에서 주로 활용

    Null 요소 포함이 불가능.

    불변 List객체 : List<데이터타입> = List.of(데이터1, 데이터2, ... )
    불변 Set객체 : Set<Key타입, Value타입> set = Set.of(Key1 , Value1 , Key2 , Value2 ,... )

  • Collection 주요 Method
    Collection을 확장하는 자료구조( List , Set , Queue 등 )에서 사용
    • 자료구조객체.add(E e)
      자료구조 객체에 요소를 추가 후 boolean을 return

    • 자료구조객체.clear()
      자료구조 객체 내 데이터 모두 삭제

    • 자료구조객체.contains( E e )
      자료구조 객체 내 해당 요소 객체가 존재하는지 확인 후 boolean return.

    • 자료구조객체.remove( E e )
      자료구조 객체 내 해당 요소 객체를 삭제 후 boolean을 return.

    • 자료구조객체.size()
      자료구조 객체요소 객체의 갯수를 return.

    • 자료구조객체.isEmpty()
      자료구조 객체가 비어있는지 확인 후 boolean을 return.

    • 자료구조객체.clear()
      자료구조 객체 내 데이터 모두 삭제

    • 자료구조객체.toArray( new T[] )
      Collection 내 데이터들을 지정된 자료형배열로 복사
      ▶ 이때 Tint 등의 primitive type이 아닌 Integer 같은 Class Type만 허용됨.

Set : java.util.Set
Collector Interface를 확장하는 Interface로서 순서에 상관없이 특정 데이터가 존재여부를 확인하기 위한 용도로 사용되는 자료구조

순서를 보장하지 않으며 중복데이터를 허용하지않는 특성이 존재

Set Interface를 구현한 Class : HashSet , TreeSet , LinkedHashSet

  • HashSet : 순서가 필요없는 데이터를 Hash Table에 저장
    해시법을 활용

    。정렬이 수행되지 않으므로 Set을 구현한 클래스 중 가장 성능이 좋다.

  • TreeSet : 저장된 데이터 값에 따라서 정렬이 수행되는 Set
    HashSet보다 성능이 약간 느리다.

    red-black트리 자료구조로 데이터가 저장.

HashSet : java.util.HashSet

HashSet<T> h = new HashSet<T>();

Set Interface를 구현하는 자료구조 클래스
중복이 존재하지 않는다.

정렬이 수행되지 않으므로 순서가 필요없는 데이터를 저장 시 활용

List : java.util.List
배열처럼 요소의 순서가 존재하면서 Collection Interface를 확장하는 자료구조 interface

배열과 다르게 동적으로 데이터 삽입 및 삭제가 가능

List Interface를 구현하는 클래스
ArrayList , Vector , Stack , LinkedList

List 자체는 inteface이므로, instance를 생성할 수 없으며, 이를 구현한 ArrayList , LinkedList 등의 Class의 instance를 이용해서 List instance 생성
ex) List의 instance 생성 시 List<Type> 변수 = new List<Type>()은 적용이 안되며, List<Type> 변수 = new ArrayList<Type>();으로 선언해야한다.

  • List Method
    Collection에 정의된 Method를 사용하거나 메소드 오버라이딩하여 수정하여 사용
    • list객체.add(인덱스, 데이터)
      。순서대로 리스트데이터를 추가
      리스트 사이즈를 초과한 경우 자동으로 사이즈 증가
      인덱스를 추가 지정 시 해당 인덱스에 데이터 삽입

    • list객체.get(index) :
      。해당 index의 List 요소를 반환.

    • list객체.forEach((요소)->{코드}) :
      람다식을 활용하여 List요소를 하나씩 추출하여 함수사용.

      ▶ 일반 배열( int[] a )의 경우 for(int i : a)로서 요소추출

    • list객체.removeif( predicate객체 ) :
      。해당 List객체의 모든 각 요소에대해 predicate를 실시한 후 해당 조건에 대해 true이면 remove

ArrayList : java.util.arraylist

ArrayList<K> A = new ArrayList<K>();

ArrayListList interface를 구현하는 자료구조 클래스
List를 확장하므로 순서가 존재하며 내부적으로 배열을 사용하여 데이터를 저장하는 구조로서 동적으로 크기조절이 가능.

List Inteface에 구현된 메소드들을 사용

▶ 실제 개발에서는 List<Type> 변수 = new ArrayList<Type>();를 선언하여 List를 사용.

Stack : java.util.Stack
스택
LIFO 구조의 자료구조를 구현한 class
List Interface를 구현한 Vector Class를 확장.

Stack<자료형> st = new Stack<>();

  • st.pop()
    。현재 스택 객체의 top의 데이터를 삭제 및 확인하는 연산

  • st.push(객체)
    。현재 스택 객체의 top에 새로운 데이터를 삽입하는 연산

  • st.peek()
    。현재 스택 객체의 top의 데이터를 단순 확인하는 연산

  • st.size()
    。현재 스택 객체의 저장된 데이터수를 반환

  • st.isEmpty()
    。현재 스택 객체의 비어있음 여부를 boolean으로 반환

Queue : java.util.Queue

FIFO 구조의 자료구조를 구현한 Interface
▶ 대표적인 구현체로 LinkedListArrayDeque가 존재

Queue<Integer> myQueue = new LinkedList<>();

  • myQueue.add(객체)
    rear가 지시하는 인덱스에 새로운 데이터를 삽입하는 연산

  • myQueue.poll()
    front가 지시하는 인덱스에 해당하는 데이터를 삭제 및 확인하는 연산

  • myQueue.peek()
    Queuefront가 지시하는 인덱스의 데이터를 확인하는 연산

  • myQueue.size()
    。현재 Queue객체의 저장된 데이터수를 반환

  • myQueue.isEmpty()
    。현재 Queue객체의 비어있음 여부를 boolean으로 반환

LinkedList : java.util.LinkedList
연결리스트
List Interface , Queue Interface , Dequeue Interface를 구현하는 Class
ListQueue의 특성을 모두 가짐

LinkedList<E> ll = new LinkedList<E>()

연결리스트의 특성을 지니므로 배열과 달리 데이터를 지속적으로 삭제 또는 추가하는 경우 훨씬 유리함.
▶ 단순하게 지운 데이터 기준 앞 뒤의 데이터를 연결하면 되므로 배열과 달리 인덱스를 조정할 필요는 없다.

우선순위큐( PriorityQueue ) : java.util.PriorityQueue
우선순위큐
。데이터가 들어간 순서와 상관없이 우선순위가 높은 데이터가 먼저 추출되는 Heap 자료구조
▶ 특정 조건을 통해 우선순위의 기준을 설정하여 데이터 추출 시 우선순위의 최댓값 또는 최솟값을 도출

MethodQueue와 유사.

PriorityQueue<Integer> pq = new PriorityQueue<>();
▶ 낮은수가 우선순위를 가짐

new PriorityQueue<>(Collections.reverseOrder());
▶ 높은수가 우선순위를 가짐.

new PriorityQueue<>(람다식);
▶ 사용자정의의 정렬 기준으로 우선순위를 설정

  • 우선순위 큐 정렬기준 설정 예시
    o1, o2를 매개변수로 전달하는 람다식 구현
    PriorityQueue<Integer> 일 경우 해당 o1, o2int type
    PriorityQueue<> 일 경우 Object type
PriorityQueue<Integer> pq = new PriorityQueue<>((o1,o2) -> {
			int i1 = Math.abs(o1);
			int i2 = Math.abs(o2);
			if ( i1 == i2 ) {
				return o1 > o2 ? 1 : -1; // 절댓값이 동일할 경우 음수 우선정렬
			} else {
				return i1 - i2;
			}
		});

정렬방식
o1.age - o2.age < 0 : 정렬 상 o1 객체가 작으므로 앞에 와야함.
o1.age - o2.age == 0 : 정렬 상 순서 유지
o1.age - o2.age > 0 : 정렬 상 o1 객체가 크므로 뒤에 와야함.
return - ( o1.age - o2.age );로 설정 시 내림차순으로 정렬 수행


Map : java.util.Map
Key - Value 쌍으로 된 데이터를 저장하는 자료구조 Interface
자료구조에서 Key 를 활용해 Key에 해당하는 Value를 검색 시 활용

Map Interface를 구현하는 Class
HashMap , TreeMap , LinkedHashMap

데이터Key 기준으로 정렬이 필요한 경우 TreeMap을 사용

  • Map 특징
    Map 자료구조 내 모든 데이터 는 KeyValue가 존재
    Key 없이 Value만 저장할 수 없다.

    Map 자료구조Key유일하여 구별되어야한다.
    DBPrimary Key와 동일 개념

    Map의 경우 타입안정성이 부족
    ▶ 동적으로 요소를 추가하거나 제거할 수 있으므로 컴파일 시점에서 타입 검사가 수행되지않아서 잘못된 Type을 사용할 수 있어 런타임오류가 발생 할 수 있음.
    ▶ 이러한 이유로 현업에서는 Pair을 사용

  • Map.Entry<K,V>
    Map 인터페이스 내 선언된 Static Interface

    Map 자료구조에 저장된 Key, Value 쌍을 하나의 객체로 다루기위한 인터페이스
    ▶ 단일 Map.Entry 객체KeyValue를 함께 포함
    ▶ 주로 Map을 구성하는 요소로서 Map객체.entrySet()이 반환하는 요소로 활용됨
    • Entry객체.getKey()
      EntryKey를 return

    • Entry객체.getValue()
      EntryValue를 return

    • Entry객체.setValue( Value값 )
      。해당 Entry의 값을 update


  • Map 주요 메소드
    • Map<Key타입, Value타입> m = Map.of(Key1 , Value1 , Key2 , Value2 ,... )
      。해당 Key - Value 데이터를 저장한 Map 객체를 생성하여 반환하는 메소드

      Map.of()로 생성된 Map 객체불변객체로서 생성 후 수정이 불가능

      new HashMap<>()와 달리 KeyValue에 대한 타입안전성을 제공

    • 자료구조객체.put( K key , V value )
      Map 자료구조 객체Key-Value 데이터 저장

    • 자료구조객체.get( K key )
      Map 자료구조 객체에서 Key에 해당하는 Value를 return

    • 자료구조객체.remove( K key )
      Map 자료구조 객체에서 Key에 해당하는 데이터를 삭제

    • 자료구조객체.keySet()
      Map 자료구조 객체Key 목록을 Set<K> 자료구조로 return

    • 자료구조객체.values( K key )
      Map 자료구조 객체Value 목록을 Collection<V>로 return

    • 자료구조객체.size()
      Map 자료구조 객체의 데이터 갯수를 return

    • 자료구조객체.clear()
      Map 자료구조 객체 내 데이터를 모두 삭제

    • 자료구조객체.containsKey( K key )
      Map 자료구조 객체 내에 해당 Key를 가지는 데이터가 존재하는지 조회 후 여부를 boolean으로 반환

    • 자료구조객체.entrySet()
      MapKey, Value를 한꺼번에 포함한 Map.Entry<K,V> 객체Set을 반환
      Set<Map.Entry<K,V>>

      Map 자료구조stream으로 활용하는 경우 Map객체.entrySet().stream()으로 Stream<Map.Entry<K,V>>으로 변환해야한다.

HashMap : java.util.HashMap

HashMap<K,V> map = new HashMap<K,V>();

Key , Value 쌍의 데이터를 저장하는 Map Interface를 구현하는 클래스

해시법을 기반으로 구현
해시법
ex ) 검색 예시

HashMap<String,Integer> map = new HashMap<String,Integer>();
		map.put("orange", 1);
		String key = "orange";
		if ( map.containsKey(key) ) {
			System.out.print(map.get(key));
		} else {
			// 예외처리
		}

TreeMap : java.util.TreeMap

TreeMap<K,V> map = new TreeMap<K,V>();

Key , Value 쌍의 데이터를 저장하는 Map Interface를 구현하는 클래스로서 Key를 기준으로 데이터를 정렬
▶ 추가적으로 SortedMap Interface를 구현하였으므로 Key를 기준으로 정렬을 수행.

profile
공부기록 블로그

0개의 댓글