JAVA

[JAVA] ch.16 컬렉션 프레임워크, List, Set, Map, 제네릭, Iterator

바켠주 2024. 4. 9. 03:36
728x90
더보기

배열 특징 

- 크기를 지정해야한다.

- 크기 변경이 불가능 하다.

- index를 이용해 데이터를 저장해야 한다.

자료구조 

- 여러 데이터를 담을 수 있는 구조

- 프로그램 실행 시 메모리에 자료를 유지하고 관리하기 위해 사용한다.

 컬렉션 프레임워크 

- 컬렉션 : 리스트, 큐, 트리 등의 자료구조를 뜻한다

- 프레임워크 : 인터페이스와 클래스를 묶어놓은 개념 

- 기존에 존재했던 자료구조에 인터페이스로 설계된 기능을 클래스를 통해 제공해 자료 구조 객체를 구조화한 것

컬렉션 프레임워크 인터페이스

제네릭

- 클래스가 다루어야할 객체 타입을 객체 선언 시 내부가 아닌 외부에서 지정하여 관리할 수 있는 기술

- 제네릭에 쓰는 데이터 타입은 Wrapper 클래스로 쓴다.

- 제네릭 선언 : <>

public class 클래스명<T>{}
public interface 인터페이스명<T>{}

 

 

- 타입 변수

  • <T> : Type
  • <E> : Element
  • <K> : Key
  • <N> : Number
  • <V> : Value

 

 List 컬렉션 

- 배열과 유사한 구조로 중복을 허용하고, 저장 순서가 유지된다.

- 배열과 차이점은 크기의 제한이 없고 삽입, 삭제, 변경이 자유롭다.

- 다양한 데이터 타입을 저장할 수 있다.

- List 인터페이스를 생성해 기능을 정의하고 하위 클래스에서 구현하도록 한다.

- 클래스 : ArrayList, LinkedList 등

 

선언 방법

1. List<데이터타입> list = new ArrayList<>();
List<데이터타입> list = new LinkedList<>();
2. ArrayList<데이터타입> list = new ArrayList<>();

 

- ArrayList는 List 인터페이스를 구현한 클래스로 1번처럼 선언한 경우 인스턴스를 ArrayList와 LinkedList로 받을 수 있다. 

- 2번처럼 선언한 경우 ArrayList의 인스턴스로 만들었기 때문에 ArrayList만 받는다.

List<Integer> list1 = new ArrayList<Integer>();
list4 = new LinkedList<Integer>();
		
ArrayList<Integer> list2 = new ArrayList<Integer>();
//list5 = new LinkedList<Integer>(); 오류

 

주요 메서드

//추가
list.add(1);
		
//중간 삽입(그자리에 넣고 뒤로 밀림)
list.add(3,10);
		
//치환
list.set(0, 5);

//반환
list.get(0, 5);
		
/* 삭제
 * - 값만 삭제되는 것이 아니라 값이 있던 공간도 삭제됨
 * - 뒤에 데이터들이 하나씩 밀린다 / 배열은 공간은 안지워지고 값만 지워짐)
 * - 중복된 데이터의 경우 처음 인덱스에 저장된 값만 삭제된다.
 */
list.remove(4);
list.remove("삭제");
List<String> rList = new ArrayList<String>(Arrays.asList("C"));
list.removeAll(rlist); //C모두 삭제

//전체삭제
list.clear();

//크기
list.size

 ArrayList 

- 배열을 이용해 구현 => 단순 삽입 삭제에 용이하다.

 

선언 (기본 자료형의 경우 데이터 타입에 Wrapper클래스를 이용한다.)

1. List<데이터타입> list = new ArrayList<>();
2. ArrayList<데이터타입> list = new ArrayList<>();

 

 

데이터 추가 방식

- 데이터 중간 삽입 시 기존 데이터가 하나씩 뒤로 밀리고 그 자리에 추가된다. 

- 빈 공간에는 삽입이 불가능하다. (존재하는 위치이거나 마지막 다음에 삽입)

데이터 추가

 

 LinkedList 

- 데이터와 다음 데이터의 주소를 가지는 노드 객체가 연결되어 데이터를 저장하는 자료구조

- node 객체를 생성해 인접 데이터를 링크해서 체인처럼 관리한다

- 선언 (부모 타입으로 선언하거나 자신 타입으로 선언함)

 
List<데이터타입> list = new LinkedList<>();
LinkedList<데이터타입> list = new LinkedList<>();
//선언과 동시에 초기화
LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1,2));

 

데이터 추가 방식

- 기존에 연결된 링크를 끊고 추가되는 데이터의 주소를 연결한다.

데이터 추가

 

ArrayList VS LinkedList

- 요소의 추가, 삭제, 검색 등의 작업에 따라 성능 특성이 다름

- 요소의 추가와 삭제가 자주 발생한다 => LinkedList

- 요소의 접근이 자주 필요한 경우(검색) => ArrayList

 Set 컬렉션 

- 중복을 허용하지 않고 순서가 없다.

- 클래스 : HashSet, TreeSet, LinkedHashSet(순서 있음)

- 주요 메서드

//추가
set.add(1);
//삭제
set.remove(1);
//전체 삭제 : 객체의 형태는 남겨두고 내용만 삭제 (출력 : [])
set.clear();
//크기
set.size();
//존재 여부
set.contains(1);

List와 다르게 중간 삽입, 치환, 중간 삭제가 없는데 순서를 모르기 때문이다.

 HashSet 

- 중복을 허용하지 않기 때문에 hashCode와 equals를 오버라이드해 객체를 비교해야 한다.

- 선언 방법

Set <데이터타입> set = new HashSet<>();

 

 Map컬렉션 

- key(키), value(값)으로 구분해 데이터를 저장하는 방식

- 순서가 없다

- key의 중복을 허용하지 않는다. value는 중복이 가능하다.

- 만약 key가 중복되면 마지막 value값으로 치환된다.

- Entry( key-value )는 Map인터페이스의 내부 클래스다.

- 검색을 요구하는 데이터를 처리하기에 적합하다.

- HashMap은 순서 보장x, LinkedHashMap은 순서가 보장된다.

 

주요 메서드

//값 저장
map.put(key,v)
//key에 해당하는 value값 반환/ key값 반환/ Value값 반환
map.get(key); map.getKey(); map.getValue();
//key존재 여부 검색
map.containsKey(key)
//value존재 여부 검색
map.containsKey(key)
//모든 key반환
map.keySet()
//모든 Map.Entry객체 Set으로 반환
map.entrySet()

 HashMap 

- hashSet과 동일하게 hashCode와 equals를 오버라이드해 중복 여부를 판단한다.

- null 허용

- 단일 스레드 환경에서 사용하기 좋은 자료구조

- 선언 방법

Map<Key, Value> map = new HashMap<>();
HashMap<Key, Value> map = new HashMap<>();

 

 Hashtable 

- null 허용하지 않는다.

- 멀티 스레드 환경에서 사용하기 좋은 자료구조

Map<Key, Value> map = new Hashtable<>();
Hashtable<Key, Value> map = new Hashtable<>();

 

 LinkedHashMap 

- 순서가 있다.

- http 통신에 사용된다.

 

반복자 Iterator

- List컬렉션에서 제공하는 인터페이스

- List컬렉션의 요소를 순회하여 하나씩 추출하는데 사용한다.

- boolean hashNext() : 다음에 순회할 데이터 유무 확인, 가져올 객체가 있으면 true, 없으면 false를 반환

- E next() : 다음 위치의 데이터로 이동하여 반환

//리스트 출력
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4));
		
Iterator<Integer> intIter = list.iterator();
		
while(intIter.hasNext()) {
	System.out.println(intIter.next());
	}
//set출력    
Set<Integer> set = new HashSet<>(list);
		
Iterator<Integer> setIter = set.iterator();
		
while(setIter.hasNext()) {
	System.out.println(setIter.next());
    }