기록

spring프로젝트_0916

coolcode 2022. 9. 16. 13:19

자바 자료구조 스터디

자바 컬렉션 프레임워크
: 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들을 하나하나  가져올 수 있음