JAVA < Collection , List, Set, Map >

Zero·2022년 4월 2일
0

자료구조

배열

  • 일반적으로 선언할 때 크기가 고정
  • 데이터를 순차적으로만 접근 할 수 있으므로 위치를 모르면 효율 떨어짐
  • 배열에 들어가는 데이터는 모두 동일한 자료형
  • 배열 중간에 값을 추가하려면 기존 데이터를 모두 이동시켜야 함

리스트

배열과 유사한 순차적인 자료구조

  • 크기가 고정 x
  • 데이터를 다루는 여러 방법이 제공 됨
  • 리스트의 데이터는 서로 다른 타입일 수 있음 -> 일관된 처리가 어려워 보통은 동일하게 처리
  • 배열 중간에 값을 추가하거나 삭제하기 쉬움
  • 특정 데이터가 포함되어 있는지 확인은 가능하나 검색을 위해 별도 구현 필요

Linked List

현재 데이터에 다음 데이터를 읽을 수 있는 정보를 추가한 것으로 불연속적으로 존재하는 데이터를 서로 연결할 수 있는 방법을 제공한다

맵, (Map)

데이터를 Key:Value(키:값)의 쌍으로 저장하는 방식 , 실제 데이터가 저장되는 형태는 내부구조에 따르며

장점

  • 데이터를 저장할 때 해당 데이터를 찾기 위한 Key를 부여
  • Key값을 알면 언제든 쉽게 데이터를 찾을 수 있음
  • Value 에 객체형이 들어갈 수 있어 복잡한 데이터 처리가 가능

ex) 학생들의 성적을 관리하는 자료구조를 만들 때 학생별 성적을 List로 만들고 학번을 Key로 하는 Map을 만들어 List를 저장하면 학번을 통해 손쉽게 성적 관리가 가능

Iterator

자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 한 것중 하나가 Iterator

  • iterator() 함수를 통해 Iterator 반복자를 갖고 온다
  • hasnext() 함수를 통해 항목이 있는지 체크하고 next() 함수를 통해 요소를 하나씩 갖고 온다

컬렉션 프레임워크 (Collection Framework)

Collection 인터페이스

List , Set 의 상위 인터페이스 , 즉 List와 Set 을 구현한 모든 클래스들은 Collection 인터페이스의 메서드를 사용할 수 있으므로 동일한 방법으로 데이터를 다룰 수 있음

컬렉션 객체의 생성

  • c1: 빈 HashSet 객체를 생성, 데이터는 직접 add()메서드를 통해 넣어야 함
  • c2: 두 개의 데이터를 가지는 List 객체 생성
  • c3: 데이터가 하나인 유일한 인스턴스를 보장하는 Set 객체 생성

컬렉션에 데이터 추가 , 삭제

  • 데이터를 하나씩 추가 : add()
  • 컬렉션 타입을 추가 : addAll()

  • 데이터의 삭제 : remove() , removeall(), retainAll() , clear()

retailAll() 의 경우 인자의 데이터를 제외한 나머지 데이터 모두 삭제하는 메서드
clear() : 모든 데이터 삭제

컬렉션 데이터 확인 및 변환

  • 데이터 크기 구하기 : size()
  • 데이터 변환 : toArray() 를 이용해 배열형태로 변경

컬렉션 데이터의 사용

a) 배열로 변환해서 for문과 사용

특정 위치의 데이터를 직접 선택할 필요없이 순차적으로 모든 데이터를 사용하는 경우 단순하게 for문만 사용

특정 위치의 데이터를 직접 다루고자 한다면 앞에서 다룬 toArray() 메서드를 이용해 배열로 변환해 사용하는 방법 사용

b) Iterator 사용

c) forEach() 사용

  • 최종적으로 컬렉션 c1의 데이터는 one,two, three, four, five 가 된다
  • HashSet의 특성상 순서가 보장되지 않으므로 데이터를 넣는 순서대로 출력되는 것은 아니다

List, Set

List와 Set은 모두 Collection 인터페이스를 상속받고 있으며 List의 구현 클래스들은 AbstractList 클래스를 상속 받는 구조입니다.

리스트(List)

배열과 유사한 자료구조 , 중복이 허용되면서 저장순서가 유지되는 구조 제공
구현 클래스로는 Vector, ArrayList, LinkedList 가 있고 가장 널리 사용되는 것은 ArrayList이다

ArrayList , LinkedList

가장 대표적인 List구현 클래스
내부적으로 배열 구조, 중간에 데이터가 추가되거나 삭제될 경우 기존 데이터를 복사해 새로운 구조를 만들어야 하기 때문에 이럴 땐 LinkedList 사용 권장

ArrayList

LinkedList

  • LinkedList의 경우 생성 클래스만 다르고 사용하는 방법은 동일 , 내부적으로 요소의 추가와 삭제등을 처리하는 방법에 차이가 있음

정렬

기본적으로 Collections.sort(List<T> list) 를 사용 , 이 경우에는 내림차순으로 정렬 이루어지고 원래 List 객체는 원소들이 정렬된 결과로 바뀐다 오름차순 정렬을 위해서는 Comparator를 추가로 인자로 작성해야함

sort(Comparator<? super E> c) 메서드 이용

  • 오름차순 정렬로 두번째 인자 compareTo() 결과를 리턴하면 된다
  • 내림차순의 경우 첫번째 인자 compareTo() 결과를 리턴하면 된다
  • compare() 결과는 같으면 0 , 자신이 크면 양수, 인자가 크면 음수를 리턴

셋(Set)

List와 유사하지만 중복이 허용되지 않고 기본적으로 순서가 유지되지 않는다
구현 클래스로는 HashSet, LinkedHashSet, EnumSet, TreeSet, CopyOnWriteArraySet 등이 있으며 가장 널리 사용되는것은 HashSet 입니다. 순서가 필요한 경우 LinkedHashSet 클래스나 SortedSet 인터페이스를 구현한 TreeSet등을 사용할 수 있습니다

HashSet , LinkedHashSet

LinkedHashSet 의 경우

Iterator 가 필요한 경우

TreeSet : SortedSet 구현한 클래스 , 오름차순으로 데이터를 정렬 해준다

맵(Map)

Collection 인터페이스를 상속받지 않으며 , 그 자체로 인터페이스로 여러 Map 구현 클래스를 가지고 있습니다 , 가장 대표적인 클래스는 HashMap 이다

  • Map은 Collection 인터페이스를 상속하지 않음
  • Key 집합은 Set으로 볼 수 있음
  • Value 집합은 Collection 으로 볼 수 있음

  • 타입 파라미터로 Key, Value 의 타입 지정
  • 문자열 이외 클래스 타입도 가능
  • 필요한 데이터를 찾기 위해 Key를 인자로 사용

맵 Entry

Map에 값을 전체 출력하기 위해서느 entrySet() , KeySet() 메소드를 사용하면 되는데 entrySet() 메서드는 Key 와 Value의 값이 모두 필요한 경우 사용하고 , keySet() 메서드는 key의 값만 필요한 경우 사용

맵에서의 Iterator

Iterator 인터페이스를 사용할 수 없는 컬렉션인 Map에서 Iterator 인터페이스를 사용하기 위해서는 Map에 entrySet() , KeySet() 메소드를 사용하여 Set 객체를 반환받은 후 Iterator 인터페이스를 사용한다

람다 사용

Stream 사용

0개의 댓글