컬렉션 프레임워크(Collection Framework) 란?
데이터를 쉽고 효과적으로 처리할 수 있도록 미리 만들어 놓은 클래스의 집합이다.
자료 구조와 알고리즘을 구조화하여 클래스로 구현한 것으로 자바의 인터페이스를 사용해 구현한다.
컬렉션 프레임워크의 주요 인터페이스는 "List, Set, Map"이다.
자바 프레임워크의 상속구조
List
순서가 있는 데이터를 목록으로 이용할 수 있으며 크기가 동적이다.
→ 배열은 크기를 선언해주면 마음대로 못 바꾸지만 List를 구현하면 크기를 변환할 수 있다.
- ArrayList
크기를 동적으로 관리한다. 배열처럼 주소값을 가지고 있지만 주소값이 무작위로 저장된다.
최상위 타입으로 배열을 생성, 복사하기 때문에 요소의 접근에 성능이 좋다.
* 삽입, 삭제에는 성능이 좋지 않아 비효율적
- LinkedList
현재 가지고 있는 주소값과 다음 데이터의 주소값을 함께 저장한다. 이렇게 연결되어 있다보니 삽입, 삭제 시 노드의 링크를 끊거나 연결하는 방식으로 삽입 및 삭제에서 좋은 성능을 보인다.
* ArrayList와 반대로 접근(특정 요소를 찾을 때)는 비효율적
🔻Java List Method 참고
Iterator
iterator(반복자)는 반복해서 내부의 요소를 순회 함으로써 순차적으로 요소를 읽어오는 역할을 한다.
Iterator 컬렉션 순회 기능은 Iterator 인터페이스를 통해 제공되며 컬렉션에는 iterator() 메서드가 정의도어 있다.
Iterator 메서드는 hasNext(), next(), remove() 세 가지가 주로 사용된다.
* 메서드 호출 순서 ---------------------------→
hasNext() | 요소가 더 있으면 true, 아니면 false (반복에 계속해서 요소가 존재하면 true) |
next() | 반복에서 다음 요소를 반환 |
remove() | 반복자가 반환한 마지막 요소 제거(선택), next() 호출 하고 나서 사용해야함. 한번만 호출 가능 |
Iterator는 모든 컬렉션에서 공통으로 사용 가능하며, 반복하는 동안 기본 컬렉션에서 요소를 제거할 수 있다.
import java.util.ArrayList;
import java.util.Iterator;
public class Example {
public static void main(String[] args) {
ArrayList<Integer> myList = new ArrayList<Integer>();
for(int i=1; i<=5 ; i++){
myList.add(i);
}
// Iterator 변환
Iterator<Integer> myIterator = myList.iterator();
while(myIterator.hasNext()) {
int value = myIterator.next();
System.out.println(value);
}
}
}
// 결과값
// 1
// 2
// 3
// 4
// 5
Set
중복 요소가 없는 컬렉션으로 저장 순서를 유지 하지 않는 컬렉션이다. (LinkedHashSet은 순서보장)
- HashSet과 TreeSet이 대표적이다.
- HashSet
인터페이스의 특성을 그대로 물려받아 중복 X 순서 X
null 요소를 허용
중복값 판단 방법
a. add를 통해 객체 저장
b. 저장하고자 하는 객체의 hashCode() 메서드를 통해 알아냄
c. Set이 저장하는 모든 객체의 해시코드를 얻어낸 후 저장하고자 하는 해시코드와 Set이 저장하고 있는 해시코드 비교 후 검사 → 있으면 Set에 객체 추가, 다시 돌아가서 리턴
🔻HashSet 참고
- TreeSet
정렬방법 지정 가능 (기본 오름차순)
트리 구조로 되어있다. (뒤집어진 나무 모양)
필드 하나하나를 node라고 한다.
🔻TreeSet 참고
Map
키(key)와 값(value)로 구성된 객체를 저장하는 구조이다. 이를 Entry 객체라고 한다.
키(key)는 중복이 불가하지만 값(value)은 중복이 가능하다.
- map의 특징
모든 데이터는 key와 value가 존재하며 키(key)는 값(value)없이 저장이 가능하며 중복이 불가능하다.
값(value)은 키(key) 없이 저장불가하며 중복이 가능하다. 데이터 순서는 중요하지 않다.
- HashMap
HashMap은 매개변수가 없는 생성자를 주로 사용한다. 데이터가 많은 경우에는 크기를 지정해주는 것이 좋다.
null 값이 허용된다.
🔻Hashmap 참고
- Hashtable
Hashtable은 HashMap과 내부 구조가 동일하다.
HashMap보다는 느리지만 동기화를 지원한다.
🔻Hashtable 참고
어제 오늘 collection framework 기초를 배웠다. 글로만 읽었을 때는 이해가 잘 안 됐는데 문제를 풀면서 이렇게 사용하는 것이구나, 저렇게 사용하는 것이구나 알 수 있었다.
특히 LinkedList 와 ArrayList 부분에 있어 많은 도움이 되었다. 하지만 아직 iterator는 부족한 듯. 그래도 정리를 하니 조금 더 이해가 되는 것 같다.
오늘 새로운 페어 프로그래밍이 시작되었는데 또 새롭다. 문제를 풀고 풀이를 돌아가면서 진행하다 보니 다양한 풀이 방식을 볼 수 있어서 좋았다. 😃 특히 바로 위에 얘기했던 이터레이터 사용과 관련하여 너무 잘 설명해주시고 적용하는 방법도 알려주셔서 쉽게 이해할 수 있었던 시간이었다.
그리고 내가 잘 못 푸는 부분에 있어서 같이 페어로 진행하니 오류도 찾을 수 있고 방법을 하나하나 따라가주셔서 너무 감사했다.
또한, 잘 풀리지 않는 방법에 있어서는 같이 시도해보고 다양한 방법을 함께 연구해봄으로써 성장하는 기회였다. 오늘 문제가 생각보다 단순(? 해서 빠르게 끝났는데 자주사용되는 메서드들을 익히는 것이 중요할 듯 하다.
메서드들은 하나 씩 정리해보도록 해야겠다. 아! 오늘 페어에서 새로운 공부방법이라던가 내가 더 발전할 수 있는 방향도 알려주셔서 너무 유익했다.ㅎㅎ 내가 많이 느린 것을 알기에 객체지향하면서 머리아파서 느슨~해진 나사를 다시 조을 수 있었다!
내일도 화이팅해야쥐~!
'LANGUAGE > JAVA' 카테고리의 다른 글
[자료구조] 트리 구조 (Tree) / 이진 트리 (Binary Tree) (0) | 2023.05.16 |
---|---|
[JAVA] 프로세스(Process)와 스레드(Thread) / 싱글 스레드와 멀티 스레드, 스레드 동기화, 상태 및 메서드 알아보기 (0) | 2023.05.08 |
[JAVA] 객체 지향 프로그래밍 / 추상화(Abstract) - 상속 , 오버라이딩, 사용 이유 (0) | 2023.04.27 |
[JAVA] 객체 지향 프로그래밍 / 다형성(polymorphism) - 오버로딩, 오버라이딩, 참조변수의 타입 변환, instanceof 연산자 (0) | 2023.04.27 |
[JAVA] 객체 지향 프로그래밍의 속성 / 캡슐화(Encaptulation) (0) | 2023.04.25 |