본문 바로가기
프로그래밍 언어/JAVA

10. 컬렉션 API활용하기

by zieunee 2019. 2. 12.
반응형


10. 컬렉션 API활용하기

배열의 특성

인스턴스를 사원당 1개씩 만든다

--> 문제는? e1,e2.....e100000.... 이렇게 만드는것은 비효율적 --> 배열을 만들자! --> employee 타입의 배열을만듦 -> 핸들링 하기가 좋다

10000개의 데이터를 집어넣었을 떄 데이터 편집 작업이 필요하다(수정,검색 추가 등등)

  • 특정한 데이터를 찾고 싶을때? 0->1->2->3 번지 순으로 찾는다

  • 데이터를 삽입하고 싶어 0->1->2 가서 하나씩 옆으로 밀기

  • 삭제하고 싶어 그러면 지우고 오른쪽으로 하나씩 이동해야한다.

  • 추가는 마지막 끝번에 하나 추가

이런식으로 작업이 일어난다.

===> 문제점

  • 이러한 작업은 데이터가 많을 수록 속도가 느려진다.

  • 배열은 추가작업이 안된다 ->

    int[] a = new int[4]

    a---> 10 | 20 | 30 | 40

    a[4] = 50; -->존재하지 않는다. --> 기존에 있던것 추가하고 싶은데 안됨 (사이즈가 변경이 안된다. ) 어떻게함? ---> 새로운 배열을 만들어야한다.

    a---> 10 | 20 | 30 | 40 |50 ... (융통성이 없다) -> 그러면 처음부터 넉넉하게 만들어 집어넣는다.

    그런데 나머지 데이터를 쓰지 않는다면? 메모리 낭비가 된다! 만개 십만개 .. 등의 데이터이동 / 추가작업시 새로운 배열 또만드는 이런 과정을 대신하기 위해 나온 것이 컬렉션 프레임워크 이다


컬렉션 프레임워크

java.util 안에 있다.

Set, List, Map --> java.util 안에 들어있는 Collection이다.

최상위 Iterable p462 상속관계도

  • list - arrayList / vector / LinkedList

  • set - HashSet / TreeSet

  • Map - HashMap / Hashtable / TreeMap 등등

데이터 추가 삽입 삭제 검색등 가능함

p463 선언하고 있는 메서드

Iterator()

add(E e)

clear()

contains(Object o)

isEmpty()

remove(Object o)

size()

toArray()


Set, List, Map


List

=배열과 비슷

저장되는 데이터의 순서가 보장된다.


ArrayList

기본값 10개짜리 배열 만들어짐

new ArrayList() ---> | | |

배열과 같은데 객체로 표현한 것 --> 초기 크기를 변경 할 수 있다(크기를 추가하면 자동으로 늘어난다)

new ArrayList(50) 이라고 지정하면 49까지 만들어짐 (초기사이즈를 만들 수 있다)

인덱스가 아닌 메서드 가지고 만듦

Object arr[] = new Object[10];
ArrayList list = new ArraryList();

제네릭

*p466 맨밑 회색박스

오류나는 이유?

type 이Object타입으로 저장되어서arr[0].length()가 오류가 난다.

String 타입으로 타입캐스팅을 하고 접근해야한다.

*p467 두번째 회색박스

오류나는 이유?

int len2 = list.get(0).length(); type 이Object타입으로 저장되어서 오류가 난다.

String 타입으로 타입캐스팅을 하고 접근해야한다.

그런데 보통 서로 다른 데이터를 집어넣는 경우가 별로 없다. -->

int len2 = ((String)list.get(0)).length(0);으로일일히 뽑아서 타입캐스팅해줌

그걸 알아서 캐스팅 해줘! 라고 바꿀 수 있다. 이 데이터를 쓸꺼니까 알아서 타입캐스팅 해줘! 라고 말해줄 수 있다.

클래스<데이터타입> 변수 = new 클래스<데이터타입>()

ArrayList<String> list = new ArrayList<String>();

String 타입으로만 넣어줄거야! 라고 지정

list.add(s);  
list.add(i); // int타입이라 오류 발생
int len2= list.get(0).length(); //오류안남

--> 이게 제네릭이다

p469

10개짜리 list만들어짐

list.add("서울    ")
list.add("북경")

-->순서대로 들어간다.

list.size() 요소 수를 리턴해줌 (for문 돌림)

---> 배열과 비슷하다.

list.get(i) // i -> 인덱스를 집어넣음 그래서 중복으로 입력될 수 있다. ex> 서울이란 데이터를 2번 집어넣을 수 있다.

import.java.util.ArrayList

import.java.util.Arrays

import.java.util.Lists 를 추가함

list.add(1,"LA"); //위치값에 추가 할때

remove(2); 2번지 삭제해라

String cities[] = new String[0];
cities = list.toArray(cities);

내가원하는 특정타입으로 캐스팅해서 넣어준다.

list.clear()

arrays. asList , list.addAll , retainAll등은 참고만하기..


Iterator 인터페이스

ArrayList<String> list = new ArrayList<String>();

Iterator<String> list = list.iterator();

--> (커서) 서울

북경

상해

서울

도쿄

---> list가 가지고 있는 정보 , 정보만 가지고 있고 첫번째 데이터 앞에 커서가 위치하고 있다.

Iter.hasNext() 다음 커서에 데이터가 있나? Iter.next() 하고 커서하나 밑으로 이동

하고 마지막 '도쿄'까지 가고난후 커서는 빠져나온다.

특징 : 속도가 더 빠르다

데이터정보에 커서라는 위치 정보까지 가지고 있는 것이 효율적이다.


vector 클래스

동기화 처리를 했나 안했나가 ArrayList와의 차이이다. 동시사용을 안전하게 처리할 수 있도록 설계된 클래스

(StringBuilder vs StringBuffer 느낌)

element 메서드 추가

Vector<String> vector = new Vector<String>(20);
vector.addElement("서울");
vector.insertElementAt("서울",2);
//trimToSize /remove/ 등등 메서드가 있다.

vector에서 arraylist 에 iterator같은 역할을 하는게 있다

Enumeration 클래스이다

--> 동시에 접근할 때 처리 가능/동기화 처리 지원안한다


LinkedList클래스

서로위치가 인접해 있지 않아도 상관없다

특징 : 데이터의 위치가 임의의 위치이다. 그러나 이런 데이터 값과어디있는지에 대한 정보를 가지고 있다. 이것이 바로 노드라는것

단일 링크드리스트 (다음정보)

data | address ---> data |address --->

이중 링크드리스트 (이전정보, 다음정보)

address|data | address --->address| data |address --->

*list는 인덱스로 위치가있음

  • 맨뒤에 추가하고 싶으면 tail 의 노드로 찾아감 거기뒤에address값이 없으므로 추가

  • 삽입(중간) address 값만 바꾸면 된다.(삽입 작업이 빠르다)

  • 삭제도 주소값 변경 하면된다.

삽입 삭제가 많이 일어나면 linkedlist 를 사용하는게 좋다.

LinkedList<String> list = new LinkedList<String>();

메서드

add, addFirst(헤드값 바뀜) , addLast(tail값 바꿈) , offer() , 참고!


MAP

데이터를 집어넣을 때 key 값을 같이 넣어야 한다. access할 때 key 값가지고 한다.


HashMap

HashMap<String,String> dic = new HashMap<String,String>();

key value(둘다 String타입)


메서드

dic.put(word[i],meaning[i]);

keySet- key값만 뽑아내고 싶다.

values -value값만 뽑아내고 싶다

replace/ put / containsKey / containsValue /remove/ clear /isEmpty/ size 등의 메서드


vs HashTable

= hashmap 과동일

*차이점

HashMap 은 key / value 둘다 null 값을 줄수 있다.*

HashTable : null값을 줄 수 없다.


TreeMap

데이터 추가하면 저장하면서 트리 형태로 저장

탐색하면서 저장된다. 크면 오른쪽 작으면 왼쪽노드로 삽입

특징: 저장이 되면서 정렬이 이미 다 되어지고 있다.


Set

<--->List 랑 정반대

특징

  • 값을 중복해서 넣을 수 없다

  • 저장되는 순서하고 실제 불러냈을 때 순서하고 관계가 없다 -> 순서유지가 되지 않는다

HashSet

lotto.add(number.nextInt(46));


반응형

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

12. 입출력 작업하기  (0) 2019.02.12
11. 예외 처리하기  (0) 2019.02.12
09. 기본 API활용하기  (0) 2019.02.11
08. 다형성과 내부클래스  (0) 2019.02.11
07. 상속과 인터페이스  (0) 2019.02.08