spring프로젝트_0916
자바 자료구조 스터디
자바 컬렉션 프레임워크
: Java에서 데이터를 저장하는 자료구조들을 한 곳에 모아 편리하게 관리하고 사용하기 위해 제공하는 프레임워크
Collection에서의 데이터는 기본 데이터형이 아닌, 참조 데이터형만 저장이 가능하기때문에
Object 타입의 객체로서 저장이 되고 기본 데이터형은 Wrapper 클래스로 autoboxing해서
저장하거나 unboxing해서 기본 데이터형으로 읽어올 수 있음
컬렉션 프레임웍이 갖고 있는 인터페이스 종류는 크게 List, Set, Map으로 구분할 수 있는데
먼저 list 인터페이스의 특징부터 정리해보면
- 동일한 데이터를 중복해서 저장할 수 있다
- 그렇기 때문에 list 인터페이스를 사용하면 저장 순서가 유지되고
객체를 저장하면 자동으로 인덱스가 부여되고 인덱스를 통해 객체를 검색, 삭제할 수 있다.
** 이 때 List 컬렉션은 객체 자체를 저장하여 인덱스를 부여하는 게 아니라,
해당하는 인덱스에 해당하는 객체의 주소값을 참조하여 저장한다.
>> List 컬렉션에는 공통적으로 사용가능한 추가, 검색, 삭제 메소드를 갖고있어서
필요에 따라 메서드를 확인하고 사용하면 됨
Arraylist는 List 인터페이스의 구현 클래스이고, 여기서의 객체는 인덱스로 관리가 가능해서
ArrayList에 객체를 추가하면 객체가 인덱스로 관리될 수 있다.
자바에서의 배열과 ArrayList의 차이점은 먼저 일반 배열의 경우 초기화 할때 그 크기가
고정되어 있어야하고 사용 중에 크기를 변경할 수 없는데
Arraylist는 초기화시에 사이즈를 표시하지 않아서 크기가 가변적이다.
그리고 추가 삭제도 add(), remove()로 가능하다.
add 하면 자동으로 공간생김/ remove는 사라짐(사라진 공간만큼 인덱스 1씩 앞으로 이동함)
list.add(); 로 저장되는 모든 데이터는 Object 타입의 객체이기때문에
String 형 변수에 get해온 값을 담고 싶다면 String alphabet = (String)list.get(i) 와 같은
형변환을 반드시 해주어야 한다.
대신 이렇게 데이터 추가 삭제시에 메모리를 재할당 하기 때문에
속도면에 있어서는 일반배열보다 느리다는 특징이 있다.
int[] arr = new int[3];
List<String> list = new ArrayList<String>();
-----------------------------------------------------------------------
set 인터페이스
데이터의 저장 순서를 유지하지 않는다.
같은 데이터의 중복 저장을 허용하지 않는다. 따라서 null도 하나의 null만 저장할 수 있다.
Set 컬렉션은 List 컬렉션처럼 인덱스로 객체를 검색해서 가져오는 메소드가 없다.
대신 전체 객체를 대상으로 한 번 씩 다 가져오는 반복자, Iterator을 제공한다.
Set<String> setExample = new...;
Iterator<String> iterator = setExample.iterator();
while(iterator.hasNext()){
String getin = iterator.next();
}
set을 통해 iterator객체를 만들고
iterator 인터페이스에 선언된 hasNext()와 next() 메소드를 사용하여 구현한다
Set 인터페이스를 구현한 주요 클래스는 HashSet / TreeSet / LinkedHashSet 이렇게 3개가 있다.
성능순으로 특징을 정리해보면
HashSet : 순서가 필요없는 데이터를 hash table에 저장. Set 중에 가장 성능이 좋음.
TreeSet : 저장된 데이터의 값에 따라 정렬됨. red-black tree 타입으로 값이 저장됨.
HashSet보다 성능이 느림.
LinkedHashSet : 연결된 목록 타입으로 구현된 hash table에 데이터 저장.
저장된 순서에 따라 값이 정렬되나 셋 중 가장 느림
-----------------------------------------------------------------------
map 인터페이스
map은 key value 쌍으로 구성된 객체를 저장하고 여기서 키와 값은 모두 객체이다.
값은 중복저장이 가능하지만 키는 set처럼 중복값을 가질 수 없다.
만약 동일한 값을 저장하게 되면 기존값은 사라지고 새로운값으로 덮어씌워진다
HashMap은 Map 인터페이스 구현한 클래스로 중복을 허용하지 않고 순서를 보장하지 않는다.
특이한 점은, key 와 value에 null값이 허용된다는 것이다.
기본 객체 생성은 Map<K,V> map = new HashMap<K,V>(); 이렇게 정의되어 있음
Map 컬렉션에서 Key값을 알고 싶다면 map.get(name) 메소드로 쉽게 구현하여 알아 낼 수 있는데
맵 안에 저장되어 있는, 데이터를 전부 가져와서 출력하고 싶을때는
Set<String> names = map.keySet(); 키를 set타입으로 뽑아서
Iterator 로 담고 Iterator<String> it = names.iterator();
조건에 it.next() 를 넣은 반복문을 통해 map.get(name)으로 key들을 하나하나 가져올 수 있음