컬렉션 프레임워크1: Set과 List계열 예시위주
Collections 프레임워크
- 컬렉션 프레임워크: java.util에 있는 클래스들로 자료구조를 담당한다.
- 자료구조: 대량의 데이터를 효율적으로 이용할 수 있도록 컴퓨터에서 데이터를 추가,조회,수정,삭제(CRUD)하는 방식.
- 자료구조 개념1 : Collections Framwork(Set계열, List계열)
- 자료구조 개념2 : Stack클래스, Queue인터페이스, Map인터페이스
- 개념은 위의 링크로 대체하고 이 글에서는 응용이나 예시위주로 확인해보려고한다.
Collections 인터페이스의 메서드
- Collections 인터페이스는 List와 Set계열의 공통 조상으로 아래 메서드 사용가능
- 아래 메서드들 중 index사용하는 메서드는 set계열에서 사용할 수 없다.
- WHY? set은 index가 없기때문에!
List와 Set 특징비교
계열 | 특징 | 방법 |
---|---|---|
List | 중복가능 | 데이터가 중복되어도 index로 구분함 |
각 요소접근 | index사용하면 됨 | |
데이터조회 | indexOf()로 위치찾기가능, contains()로 데이터유무(boolean) 확인가능 | |
데이터수정 | set() | |
정렬 | sort() | |
set | 중복불가능 | 중복데이터제거를 위해 @Override hashcode()와 equals() 재정의필수 |
각 요소접근 | index 정렬불가능-> iterator객체의 hasNext(), next()사용 | |
데이터조회 | contains()로 데이터유무(boolean) 확인가능, for(Object obj : hashset명 ){ System.out.println(obj)} | |
데이터수정 | 인덱스가 없어서 데이터수정없음불가능 -> 걍 삭제(remove) 후 추가(add) | |
정렬 | index없어서 sort()사용불가 -> TreeSet<>이용 |
List계열 : ArrayList와 LinkedList 성능차이
- ArrayList 단점 : 비순차적인 데이터의 추가, 삭제에 많은 시간이 걸림
- 이를 해결하기 위해 LinkedList가 있음
- LinkedList 특징 :
- 각 요소를 Node(노드)로 정의.
- Node는 다음요소의 참조값과 데이터로 구성됨.
- 각 노드는 링크정보를 가지므로 ㅔ이터를 연속으로 구성할 필요가 없음.
- 따라서 ArrayList가 전체전익 요소를 움직였던 것에 비해 훨씬 가볍게 작동함.
- 그렇다면 ArrayList와 LinkedList 데이터처리과정별 성능차이는 어떨까?
1 | private static void addTest(String testcase, List<Object> list){ |
List계열 : ArrayList<> 로또게임 예시
- 로또는 1부터 45까지의 숫자가 적힌 공 중에서 당첨공 6개와 보너스공 1개를 랜덤으로 뽑는다.
- 이 공들은 중복을 허용하지않는다.
- List는 중복을 허용하는 계열인데 어떻게하면 로또를 만들 수 있을까?
- contains()로 중복확인가능
1 | class ListLotto{ |
Set계열 : TreeSet<> 정렬
- set계열을 정렬하기만 원한다면 TreeSet<>안에 넣기만 하면 됨.
- TreeSet<>은 add()가 안됨 -> 내부적으로 알파벳오름차순인데 객체가 add되면 비교가 불가능함.
- Treeset<>()에서 괄호안에 정렬기준을 추가할 수 있다.
- Treeset<>(new StringLengthComparator()) : StringLength를 기준으로 짧은 String이 앞쪽으로 정렬된다.
1 | public static void main(String[] args) { |
Set계열 : TreeSet<> 로또게임 예시
1 | class TreesetLotto{ |