* 본 포스팅은 제가 국비지원교육을 받으며 노션에 정리한 내용을 옮겨놓은 것입니다.
발전을 위한 피드백과 지적은 언제나 환영합니다.
// 길이 10인 배열 생성
Product array[] = new Product[100];
// 객체 추가
array[0] = new Product("Model1", "red");
array[1] = new Product("Model2", "blue");
// 객체 검색
Product model1 = array[0]; // HashCode 출력됨
Product model2 = array[1];
// 객체 삭제
Product model1 = null;
Product model2 = null;
15.1 컬렉션 프레임워크 소개
- 배열의 문제점을 해결하고 자료구조 (Data Structure)를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스들과 클래스들이 있다. ⇒ Collection Framework
- 프레임워크(FrameWork) : 사용방법을 미리 정해놓은 라이브러리 - 주요 인터페이스 : List, Set, Map
- Collection 사용 이점 : 배열길이의 가변성, 데이터 컨트롤 용이성
15.2 List 컬렉션
- 객체를 일렬로 늘어놓은 구조
- 객체를 인덱스로 관리 → 인덱스로 검색, 삭제 가능
- 객체의 번지를 참조하여 저장 (null은 객체 참조 X)
Ex) 10을 집어넣으면 Integer 10 이라는 reference로 저장된다. (Boxing)
⇒ 기본형 집어넣을 수 없음. 무조건 객체로 Boxing해서.
List<String> list = ...; list.add("홍길동"); // 맨 끝에 객체 추가 list.add(1, "신용권"); // 인덱스 1에 객체 추가 String str = list.get(1); // 인덱스로 객체 찾기 list.remove(0); // 인덱스로 객체 삭제 list.remove("신용권"); //객체 삭제
⇒ 동등 객체인지 확인하기 위해 객체 안에 equals & hashcode 재정의 필요할 수도 있다.
for(String str : list) { } //향상된 for문으로 객체 하나씩 얻기
- ArrayList : List 인터페이스의 구현 클래스
- 객체를 추가하면 객체가 인덱스로 관리된다.
- 저장용량 (capacity) 을 초과한 객체들이 들어오면 자동으로 저장 용량이 늘어난다.
List<String> list = new ArrayList<String>(); // 다형화
- 빈번한 삭제와 수정 : linked list
- 인덱스 검색 & 맨 마지막에 객체 추가하는 경우 : Array List
(toString 재정의했음)
List<E> list = new Vector<E>();
- 동기화된 메소드로 구성되어 있어서 멀티스레드가 동시에 이 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다.
- 멀티스레드에 안전
- 수정/삭제 많을때
- Set 구조 : 주머니에 들어가 있는 구슬 (랜덤 추출)
- List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 순서 유지 X
- 중복저장 X
- 인덱스로 객체를 검색해서 가져오는 메소드가 없고, 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를 제공한다.
- 반복자(Iterator) : Iterator 인터페이스를 구현한 객체
Set<String> set = ...; Iterator<String> iterator = set.iterator(); while(iterator.hasNext()){ //String 객체 하나를 가져옴 String str = iterator.next(); }
Set<String> set = ...; for(String str : set){ // 저장된 객체 수만큼 루핑 }
- 인덱스 4번에 추가하면 기존에 있던 데이터는 5번으로 밀려난다 (총 객체수 6)
while(iterator.hasNext()){
String str = iterator.next();
if(str.equals("홍길동")){
iterator.remove();
}
}
//Iterator의 next() 메소드로 가져온 객체를 제거하고 싶을때
15.3.1 HashSet
- Set 인터페이스의 구현클래스 (HashSet이 Set의 자식)
Set<String> set = new HashSet<String>();
- 객체 순서 X, 중복저장 X
- HashSet이 판단하는 동일한 객체는 꼭 같은 인스턴스를 뜻하지는 않는다.
- 객체 저장하기 전에 hashCode( ) 메소드를 호출해서 해시코드를 얻어내고, 동일한 해시코드가 있다면 다시 equals( ) 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
15.4 Map 컬렉션
- Map 컬렉션은 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조 (키와 값은 모두 객체)
- 키는 중복저장 X, 값(value)는 중복저장 O
- 기존에 저장된 키와 동일한 키로 저장하면 기존값 없어지고 새로운 값으로 대치
Map<String, Integer> map = ~;
map.put("홍길동", 30); // 객체 추가
* 원래는 30 <- int 기본형 타입으로 들어갈 수 없지만 자동 unboxing
* int 타입 쓸 수 X, Object 타입이어야 함
int score = map.get("홍길동"); // 객체 찾기
map.put("홍길동", 100); // 객체 수정
map.remove("홍길동"); // 객체 삭제
Map 전체값 조회하기
1) map.keySet( ) 메소드
: 모든 키를 객체에 담아서 리턴하는 메소드
Map<K, V> map = ~;
Set<K> keySet = map.keySet();
Iterator<K> iter = keySet.iterator();
while(iter.hasNext()){
K key = iter.next();
V value = map.get(key);
}
2) map.entrySet( )
: entrySet( ) 으로 모든 Map.Entry를 Set 컬렉션으로 담고 반복자를 통해 Map.Entry를 하나씩 얻은 후 getKey(), getValue()로 키와 값을 얻음
Set<Map.Entry<K,V>> entrySet = map.entrySet();
Iterator<Map.Entry<K,V>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()){
Map.Entry<K,V> entry = entryIterator.next();
K key = entry.getKey();
V value = entry.getValue();
}
15.4.2 HashTable
Map<K, V> map = new HashTable<K, V>();
- 동기화된 메소드로 구성되어 있어서 멀티스레드가 동시에 이 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다.
- 멀티스레드에 안전
'JAVA' 카테고리의 다른 글
[이것이 자바다] 18 IO 기반 입출력 및 네트워킹 (0) | 2021.03.10 |
---|---|
[이것이 자바다] 15 컬렉션 프레임워크 - 기타 컬렉션 (0) | 2021.03.10 |
[이것이 자바다] 11 기본 API 클래스 (2) getProperty, Collection (0) | 2021.03.10 |
[이것이 자바다] 11 기본 API 클래스 (1) 객체비교 compare, 오름차순까지 (0) | 2021.03.09 |
[이것이 자바다] 10 예외 처리 (Exception) (0) | 2021.03.09 |
Uploaded by Notion2Tistory v1.1.0